- 帖子
- 3852
- 积分
- 13044
- 威望
- 16780
- 金钱
- 36761
- 在线时间
- 1139 小时
|
大家好,今天我们来学习下loop循环指令。我们高级语言的堆栈分配初始化可是靠它了呵呵。 首先我们来看下它的指令格式。。
LOOP 标号 ;ECX不为零时跳转至标号循环.标号只是写汇编程序时用来表示一个内存地址的。
例如
token:
xor eax, eax
此时token等于 xor eax, eax指令的内存地址 。标号格式:“ 标号名称: ”。
从它的指令格式中,我们就可以看出来,它是靠判断ecx寄存器是为0来决定是否往下循环的。那么我们可以由此联想到,每次循环之前我们要对ecx进行赋值,也就是赋上循环次数。。
举例
mov ecx, 3h ;循环次数
_loop:;标号,它在汇编中是用来标示内存地址。此时_loop = mov eax, 00304020h的内存地址。它的格式是 标号名:
mov eax, 00304020h ;循环内容
add eax, eax ;循环内容
loop _loop
这里我们来分析下这个循环过程。
1. 首先程序执行
mov ecx, 3
mov eax, 00304020h ;eax = 00304020h
add eax, eax ; eax = eax+eax
loop _loop ;执行到这里ecx-1=2,然后cpu判断ecx寄存器是否为0,如果是的话结束循环往下执行,如果不是则跳转到标号处继续执行。。
2 第二次执行
mov eax, 00304020h ;eax = 00304020h
add eax, eax ; eax = eax+eax
loop _loop ; ecx -1 = 1
;执行到这里ecx-1=1,然后cpu判断ecx寄存器是否为0,如果是的话结束循环往下执行,如果不是则跳转到标号处继续执行。。
3 第三次执行
mov eax, 00304020h ;eax = 00304020h
add eax, eax ; eax = eax+eax
loop _loop ; ecx -1 = 0
;执行到这里ecx - 1 =0, cpu判断ecx已经是0了,就不接着跳转标号继续循环了,则设置设置eip为下一条指令的偏移,继续开始执行。。
其实也很简单。。 loop是靠判断ecx寄存器为依据来进行循环的。 loop指令后面跟的是一个内存地址。也就是要进行起始循环指令的地址。 如果ecx不为0,则跳转到起始循环指令的地址开始执行。
(1)
利用循环来计算3*3,结果存放到eax寄存器中。(提示:可以循环通过add指令来做累加)。
注意:这里是计算3乘3的结果。
(2)
mov eax, 15h
mov ecx, 2h
_loop:
sub eax, 1h
loop _loop
此句指令执行后,eax = ?。 |
|