第五章:【BX】和loop指令
[BX]
对于[bx]
-
[bx]和内存单元的描述
要完整的描述一个内存单元,需要两种信息:
- 内存单元的地址
- 内存单元的长度
[bx]也表示一个内存单元,它的偏移地址在bx中,段地址在ds中
[…]中可以是值也可以是寄存器 -
定义一个描述性符号“()”来表示一个寄存器或一个内存单元(直接用数值要写物理地址,20位(二进制位)的)中的内容
对于[idata]
Debug将[idata]解释为:[idata]是一个内存单元,iadta是内存单元的偏移地址
Masm将[idata]解释为:idata
所以在edit中编写汇编程序时,如果想用[idata]表示偏移地址,那么就得在前面显式地给出段地址所在的段寄存器。比如mov al,ds:[0],(ds称为段前缀)
如果写成mov al,[0]那么编译的时候Masm就会把它解释成idata而不是偏移地址
loop
CPU执行loop指令的时候,要进行两步操作
- (cx)=(cx)- 1;
- 判断cx中的值,不为零则转至标号处执行程序,如果为0则向下执行。
通常用loop指令来实现循环功能(说明还有其他循环方式,比如jmp指令),cx中存放循环次数
标号
标识一个地址,这个地址处有一条汇编指令,可以是任意字母,初学通常用s,s0
程序框架如下:
mov cx,循环次数
s:
循环执行的程序段
loop s
CPU执行中没有乘法,只有加减法,所以可通过循环加法来达到乘法目的
跟踪循环
使用g命令跳转到想执行的指令位置
-g 0012
表示执行程序到当前代码段(段地址在cs中)的0012h处,之前所有指令都被一次执行完毕
使用p命令让循环一次性执行完
到下一步该执行loop指令的时候使用-p。DEBUG会自动重复执行循环中的指令,直到(cx)=0为止。
安全的空间
一般的PC机都不会使用0:200到0:2ff的256字节的空间,所以我们可以把这段空间当作栈来使用,也可随意写入数据。
切记汇编程序中数据不能以字母开头,如果要往ax中存放ffffh,那么需要写成
mov ax,0ffffh