汇编语言学习第五章-[BX]和loop指令

2024-08-25 05:18

本文主要是介绍汇编语言学习第五章-[BX]和loop指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本博文系列参考自<<汇编语言>>第三版,作者:王爽


1.[bx]和内存单元的描述

[bx]与我们前面见过的[0]类似,mov ax,[0] 的意思是将内存地址为DS:0的两字节内容存入ax中。其中[0]中的0代表的是偏移地址。

类似的,我们有 mov al,[0]的意思是将内存地址为DS:0的单字节内容存入al中。那么我们可以大胆的推断mov ax,[bx]代表的是将偏移地址为bx寄存器中的值的内存地址的两字节内容存入到ax中,其段地址在DS中存储。


2.关于定义的描述性符号: "()"

后面的内容我们都将用符号"()"来表示一个内存单元或一个寄存器中的值。(ax)表示寄存器ax中的值,(al)表示寄存器al中的值。

(20000H)表示内存地址为20000的内容

((ds)*16+(bx)) ds的内容为R1,bx中的地址为R2。那么该公式代表R1*16+R2内存地址处的内容。

"( )"中可以有三种类型元素:(1).寄存器  (2)段寄存器 (3)内存地址 其表示的数据有两种类型:字和字节。如何区分数据类型是根据寄存器类型和运算类型进行区分的。

"()"的应用举例:


1.[bx]

看几个指令:

mov ax,[bx]  设偏移地址为SA,段地址默认存储在DS寄存器中,那么该指令的作用是将地址为DS:SA处的值传入ax寄存器中。

用"()"符号解释为 (ax)=((DS)*16+(bx))

mov [bx],ax  设偏移地址为SA,段地址默认存储在DS寄存器中,那么该指令的作用是将寄存器ax值传入[bx]所代表的偏移地址的位置,用"()"符号解释为 ((DS)*16+(bx))=(ax)



2. LOOP指令

LOOP指令为循环指令,其格式为 LOOP 标号,当cx不为0的时候跳转到标号处循环同时cx=cx-1,如果标号为0则向下执行。(CX默认为循环计数器)


下面实现一个小程序,用LOOP实现2^12,代码如下:


1.标号

标号s处有一条指令,add ax,ax用于累加,标号s代表该条指令的地址。


2.loop s

当cx寄存器中的值不为0的时候将跳转到标号处循环执行add ax,ax。当cx=0的时候,loop s不再跳转,将执行Loops后面的指令。


用cx和loop实现循环框架如下:

         mov cx,循环次数

标号: 代码段


        loop  标号

现在有这样一个程序功能需要实现:计算ffff:0006单元中的数乘以3,结果存放在dx中。

此程序有三个注意点

1、ffff:0006单元中的数是一个字节型数据。范围为0-255,乘以3完全可以放到dx中,不用担心超过dx的范围

2、将ffff:0006单元中的数赋值给ax,然后令(dx)=0,用dx存储累加三次的结果

3、因为ffff:0006为一个字节单元,ax为一个字单元。如何将ffff:0006单元的值赋值给ax呢。这里只需要将ax中高位字节扩展为      00h即可,比如ffff:0006中为2CH,那么赋值给ax后为002CH,虽然数据长度不等,但是值是相等的。


注意几点,0ffffh为何前面会有个"0",当16进制数据最高位为字母的时候需要在最高位前面加上0.

下面我们通过masm和link两条指令对该程序进行编译链接生成exe文件。


用debug工具加载vpoet.exe:


DS为14E9   CS:IP为 14F9:0000 指向第一条指令 mov AX,FFFF

现在我们用U指令查看程序内容。


可以看到LOOP S处的地址为14F9:E2FC 此时LOOP S中的S标号变成地址0012,当执行了LOOP循环后,那么CX=CX-1,如果CX不为0,那么将IP设置为S标号的地址0012 CPU将执行地址14F9:0012处的指令ADD DX,AX实现叠加。


前三条指令执行完之后,DS被设置为FFFFH,BX设置为0006H 此时DS:bx指向 FFFF:6,接下来将执行MOV AL,[BX]取出FFFF:6地址处的值,在右边显示了该值为32H

继续执行下面两条指令:


执行完后完成了对AX的复制,AX值为0032H


继续执行 MOV DX,0和MOV CX,3完成累加器和计数器的初始化


下面开始循环过程,可以看出每次循环一次CX减小1,同时DX增加一倍。

当CX=0000时候循环结束,执行接下来的返回语句 MOV AX,4c00h和int 21h。至此整个程序结束将CPU控制器交给command.


5.4  Debug和汇编编译器masm对指令的不同处理

1.在汇编语言中,如果一个指令要访问内存单元,则在指令中必须用[...]来表示内存单元,如果在[...]中直接用常量给出内存地址的偏移地址,那么需要在"[ ]"前面加上段寄存器。比如

mov al,ds:[0]如果没有显示的给出段寄存器ds:,那么mov al,[0]在汇编语言中被理解为mov al,0

2.在汇编语言中,也可以将偏移地址存入一个普通寄存器bx,比如

mov bx,0

mov al,[bx]这样也是允许的,其中段寄存器默认在ds中


5.5  段前缀

汇编指令mov ax,[bx]将偏移地址在寄存器bx中指出,而段地址默认在ds中,我们也可以在指令中显示的给出段地址:

比如

 mov ax,ds:[bx]

 mov ax,ds:[bx]

 mov ax,cs:[bx]

 mov ax,ds:[0]

 mov ax,ds:[0]

 mov ax,cs:[0]

其中 ds:    cs:  ss:称为段前缀


5.6 一段安全的空间

在汇编中,当我们更改某个内存地址的内容的时候需要十分谨慎,因为该地址可能存储着重要的代码或者数据,一旦覆盖或者更改会导致整个系统的崩溃。在DOS方式下,DOS和其他合法的程序一般都不会使用0:200~0:2ff这256个字节的空间。所以,使用这段空间是安全的,我们可以在debug下查看这段地址是否为0,如果为0证明该内存段未被DOS和其他程序使用。



5.8段前缀的使用

问题,我们需要将内存ffff:0~ffff:b单元的数据复制到0:200~0:20b

分析如下:

1.0:200~0:20b等同于 0020:0~0020:b,这样描述为了使得目标地址和源地址偏移量都从0开始

2.复制过程用loop循环实现

初始化:

   X=0

循环12次:

将ffff:X单元的数据送入0020:X(需要一个寄存器中转)

X=X+1
3.循环中ffff:X和0200:X的偏移量X存入bx

代码及注释如下:


OK,only stop here~~


这篇关于汇编语言学习第五章-[BX]和loop指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104645

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个