主题:帮忙看一下eax为何值
cforlinux
[专家分:80] 发布于 2006-08-18 15:42:00
mov eax 0
mov ecx 10
L1: mov eax 3
mov ecx 5
L2: add eax 5
loop L2
loop L1
回复列表 (共8个回复)
沙发
66543 [专家分:200] 发布于 2006-08-19 21:58:00
1CH
板凳
cforlinux [专家分:80] 发布于 2006-08-21 12:10:00
可不可以再解释的具体一些呢?
非常感谢。
3 楼
awfiujff [专家分:110] 发布于 2006-08-23 17:53:00
这提的双重循环是个误导
外循环没意义(每次都把3放到eax里,循环多少次都一样)
内循环把5加到eax里去,一共加5次
即3+5*5=28
28D=1CH
4 楼
12506 [专家分:0] 发布于 2007-08-03 19:51:00
mov eax 0
mov ecx 10 ;这句是废话,没用
L1: mov eax 3 ;eax=3
mov ecx 5 ;ecx=5
L2: add eax 5 ;eax=8
loop L2 ;eax=8+5*5=33
loop L1 ;麻烦了,ecx=0,减去1后为2的32次方,eax=33+5*2^32溢出后等于??????自己算去
5 楼
12506 [专家分:0] 发布于 2007-08-03 19:54:00
mov eax 0
mov ecx 10 ;这句是废话,没用
L1: mov eax 3 ;eax=3
mov ecx 5 ;ecx=5
L2: add eax 5 ;eax=8
loop L2 ;eax=8+5*5=33
loop L1 ;麻烦了,ecx=0,减去1后为2的32次方,eax=33+5*2^32溢出后等于??????自己算去
不好意思,最后、一句错 了,因该是死循环
6 楼
长尾兔 [专家分:3630] 发布于 2007-08-11 06:31:00
to 楼上:我觉得不会死循环的,ecx在第5次L2循环后已是0,然后会直接退出L1循环。因此结果就是 28 (1CH)
7 楼
hyerty [专家分:1110] 发布于 2007-08-30 22:09:00
经验证,这是一个死循环,因为loop每次执行都是先将cx的值减少1,判断cx是否为0,若不为0则跳转到循环标签处。L2循环执行5次之后,cx的值减少为0,于是退出内层循环,执行loop L1,此时cx为0,减少1后变成ffh,所以L1循环会继续进行,这样就形成一个死循环。注意:loop指令不会改变标志寄存器的各位标志,所以虽然其中导致了cx等于0,cx从0减1也需要借位,但各标志位依然不会改变,但若显式执行这些操作则会改变标志位的值。
为了防止cx等于0时循环依然继续,可用loopne代替loop,并在loopne前加一句cmp cx,0设置标志位Z。如果循环体中没有涉及改变cx的值,则这个比较可以放在进入循环体之前,但即使这样,循环还是至少会循环一次,若希望cx=0则不循环,还要加一个JZ跳转,看来越搞越麻烦了,呵呵。
L2每次循环后,ax的值都是1CH,原因可见楼上的分析。
我也刚接触汇编,决定学习NASM,可惜几乎找不到资料,所以可能会考虑先学一些MASM的公共基础。有兴趣学习NASM的,希望多多交流~~
8 楼
臭石头雪球 [专家分:23030] 发布于 2007-09-02 09:56:00
装个 OD ,自己单步调试一下看看嘛。。。
我来回复