(七)[bx]、lea 和 Loop --汇编笔记

汇编语言

Posted by YiMiTuMi on March 18, 2020

[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

菖蒲 – 相信者的幸福