汇编递归过程中的无限循环
Infinite loop in assembly recursive procedure
在递归过程中添加 WriteDec 和 CRLF 调用时,它会进入无限循环。
- 我的动机是每次右移后立即打印出eax和crlf的值。
- 当到达 0 时,似乎有无限递归调用,因为它一直在打印 0。
- 我的印象是不应该是这种情况,因为 ZF = 1 第一次 eax = 0,因此它跳转到跳过结束递归的标签。
以下代码在 EAX 寄存器 = 0 时导致无限循环
.code
MAIN PROC
mov ecx, 10
L1:
push 10
call f1
call exitProcess
main ENDP
f1 PROC
push ebp
mov ebp, esp
sub esp, 4
mov eax, [ebp+8]
shr eax, 1
call WriteDec
call CRLF
mov [ebp-4], eax
jz skip
call f1
skip:
mov eax, [ebp+8]
call WriteDec
call CRLF
; ** comment out ** mov ebp, [ebp]
mov esp, ebp
pop ebp
ret 4
f1 ENDP
END MAIN
预期结果:
5
2
1
0
1
2
5
10
罪魁祸首在这里:
mov [ebp-4], eax
jz skip
在 x86 中,MOV 指令不设置任何标志,因此 JZ 将采用上述函数调用遗留下来的 ZF 标志的状态。
正确的代码如下:
mov [ebp-4], eax
test eax, eax
jz skip
在递归过程中添加 WriteDec 和 CRLF 调用时,它会进入无限循环。
- 我的动机是每次右移后立即打印出eax和crlf的值。
- 当到达 0 时,似乎有无限递归调用,因为它一直在打印 0。
- 我的印象是不应该是这种情况,因为 ZF = 1 第一次 eax = 0,因此它跳转到跳过结束递归的标签。
以下代码在 EAX 寄存器 = 0 时导致无限循环
.code
MAIN PROC
mov ecx, 10
L1:
push 10
call f1
call exitProcess
main ENDP
f1 PROC
push ebp
mov ebp, esp
sub esp, 4
mov eax, [ebp+8]
shr eax, 1
call WriteDec
call CRLF
mov [ebp-4], eax
jz skip
call f1
skip:
mov eax, [ebp+8]
call WriteDec
call CRLF
; ** comment out ** mov ebp, [ebp]
mov esp, ebp
pop ebp
ret 4
f1 ENDP
END MAIN
预期结果:
5
2
1
0
1
2
5
10
罪魁祸首在这里:
mov [ebp-4], eax
jz skip
在 x86 中,MOV 指令不设置任何标志,因此 JZ 将采用上述函数调用遗留下来的 ZF 标志的状态。
正确的代码如下:
mov [ebp-4], eax
test eax, eax
jz skip