我正在阅读汇编代码优化手册第 2.3 节常见编码陷阱 - 第 9 页
无与伦比的 PUSH 和 POP 指令。对于通过函数的所有可能路径,PUSH 和 POP 指令的数量必须相等。例子:
Run Code Online (Sandbox Code Playgroud)push ebx test ecx, ecx jz Finished ... pop ebx Finished: ; Wrong! Label should be before pop ebx ret
这里,如果 ECX 为零,则不会再次弹出推送的 EBX 值。结果是RET指令会弹出EBX之前的值并跳转到错误的地址。
我的疑问是:jz
指令不是将返回地址存储在堆栈中吗?什么其他指令一样jmp
,jg
,jge
,jl
,jle
等?