[BX]
mov ax, [bx]
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中。即(ax)= ((ds)*16 + (bx))。
mov [bx], ax
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax处的数据送入SA:EA中。即((ds)*16 + (bx)) =(ax)。
[bx] 是一个地址相当于指针, ax是个寄存器用来存放数据。
单独使用[bx],[bx]默认是ds段寄存器的偏移地址。
可以将 [] 看作 解引用 来用。
mov 指令将当前指令所在内存复制并放到目的寄存器中,其操作数可以是常量,也可以是指针。
mov eax, [401000H] //直接寻址,即把地址为00401000H的双字节数据放入eax
mov eax, [ecx] //寄存器间接寻址,即把ecx中的地址所指的内容放入eax
mov eax, 401000H //将401000H这个地址放入eax
mov eax, ecx //将ecx的内容放入ecx,有可能是个地址或者常量ddr
lea指令
lea 的意思是“装入有效地址”(Load Effective Address),它的操作数就是地址。
lea eax, [addr] //将表达式addr的地址放入eax寄存器
lea eax, [401000H] //将值401000H写入eax寄存器
lea eax, [ebx + 2] //将ebx+2的这个地址写入eax
lea指令不仅用来传递指针,而且经常用lea指令来计算常量的和,其等价于add指令。
lea eax, [eax + 8]
add eax, 8 //这两个等价
lea指令的效率远高于add指令,这种技巧可以使多个变量的求和在1个指令周期内完成,同时可以通过任何寄存器将结果返回。
Loop指令
loop指令格式:
loop 标号
CPU执行loop指令的时候,要进行两步操作:
1)cx(内容) = cx - 1
2)判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
cx中的值影响着loop指令的执行结果。通常用loop指令来实现循环功能,cx存放循环次数。
计算2^12
assume cs:count
count segment
mov ax, 2
mov cx, 11
s: add ax, ax //也会执行add
loop s
mov ax, 4c00H
int 21h
count ends
end
1) 标号:在汇编语言中,标号代表一个地址,程序中s就是一个标号。它实际上标识了一个地址,这个地址处有一条指令:add ax, ax
2)loop s
CPU执行loop s的时候,要进行2步操作。
(1) cx = cx - 1
(2) 判断cx中的值,不为0则转至标号s所标识的地址处执行(即add ax, ax),如果为0则执行下一条指令(即mov ax, 4c00H)
3)s:add ax, ax 这条指令也会执行一次 add ax, ax
cx和loop配合实现循环的3个要点:
1)在cx中存放循环次数
2)loop指令中的标号所标识地址要在前面
3)要循环执行的程序段,要写在标号和loop指令的中间
框架:
mov cx, 循环次数
s:
循环执行的程序段
loop s