(持续更新)
汇编指令
1.loop指令
loop在汇编中用作循环,会执行标号到loop之间的部分,循环结束条件是cx寄存器的值为0。下面是一个例子,令ax寄存器中的值累加6次。
assume cs:code
code segment
mov ax,0
mov cx,6
s: inc ax
loop s
mov ax,4c00h
int 21h
code ends
end
约定一下,(xxx)代表xxx寄存器中的值。
循环部分的执行流程为,遇到loop指令的时候,(cx)先减1,如果(cx)==0,则循环结束,执行下一条语句,否则调到标号对应的位置。这里有一个容易迷惑人的地方,就是如果先判断(cx)-1的值,那循环只执行了5次,那如何做到的使(ax)为6呢。原因很简单,在第一次遇到标号s对应的汇编指令时,该指令会执行一次,无视标号。(标号并不是指令,只是起到指示地址的作用,编译后会被转化为实际的地址。)只有在遇到loop指令时,才会进行判断,然后选择是否跳转到标号的位置执行相应的命令。
运行一下程序,执行debug程序,观察程序运行的每一步。
inc第一次执行,cx寄存器并不受影响
执行到loop的时候,cx寄存器发生了变化。而且可以看到,在被编译后,s已经没有了,变成了其实际的IP寄存器的位置0006。
后面就不全展示了。
2.div指令
该指令用于除法运算,除数存放在一个8位寄存器中,被除数在存放在ax中。得到的商在al寄存器中,余数在ah寄存器中。
下面是一个例子。
mov ax,26
mov bl,10
div bl
观察一下寄存器中的值。