回 帖 发 新 帖 刷新版面

主题:帮忙看一下eax为何值

mov eax 0
mov ecx 10
L1: mov eax 3
    mov ecx 5
L2: add eax 5
   loop L2
   loop L1

回复列表 (共8个回复)

沙发

1CH

板凳


可不可以再解释的具体一些呢?
非常感谢。

3 楼

这提的双重循环是个误导
外循环没意义(每次都把3放到eax里,循环多少次都一样)
内循环把5加到eax里去,一共加5次
即3+5*5=28
28D=1CH

4 楼


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 楼


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 楼

to 楼上:我觉得不会死循环的,ecx在第5次L2循环后已是0,然后会直接退出L1循环。因此结果就是 28 (1CH)

7 楼

  经验证,这是一个死循环,因为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 楼

装个 OD ,自己单步调试一下看看嘛。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册