在汇编中可以使用 loop 段地址:偏移地址
并配合 cx 达到循环执行的目的,但是在一些资料中看到说,cx 是循环的次数,我觉得这是不对的。
比如下面这段代码的作用是使得最终的 ax 中的值为 3
assume cs:code
code segment
start: sub ax, ax
mov bx, 1
mov cx, 3
lp: add ax, bx
loop lp
code ends
end start
- 首先,将 ax 置 0
- 将 bx 内容置为 1
- 将 cx 的内容置为 3
- ax 中的内容加 1,加后 ax 的内容是 1
- 进入 loop 指令
loop 指令的执行步骤是这样的
- (cx) = (cx) - 1
- 判断 cx 中的值,不为零则跳转至标号处继续执行
那么整个 loop 的步骤是
第 1 次
cx = 3 - 1
cx 为 2 大于 0
ax 累加 1,此时 ax 中的值为 2
第 2 次
cx = 2 - 1
cx 为 1 大于 0
ax 累加 1,此时 ax 中的值为 3
第 3 次
cx = 1 - 1
cx 为 0
结束循环,ax 不再继续累加
所以,虽然 cx 开始时被设置成了 3,但是循环的次数并不是 3,而是 2。如果用 c 语言去描述这段汇编的执行顺序应该是
int cx = 3;
int ax = 0;
ax++;
cx--;
while(cx){
ax++;
cx--;
}