【发布时间】:2021-09-09 08:27:21
【问题描述】:
我正在阅读assembly code optimization manual 第 2.3 节常见编码陷阱 - 第 9 页
不匹配的 PUSH 和 POP 指令。对于通过函数的所有可能路径,PUSH 和 POP 指令的数量必须相等。示例:
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 等其他指令呢?
【问题讨论】:
-
没有跳转指令推送返回地址。只有
call可以。 -
当您绝对不想影响堆栈时,将控制权转移到不是函数结尾的地址更为常见关于需要什么堆栈调整/需要恢复寄存器的假设。需要多少这些指令的变体,以及使用哪些(组合)寄存器?
-
如果您不确定指令的确切作用,请在 Intel 或 AMD 的手册中查找。 felixcloutier.com/x86/jcc 是从英特尔的 PDF 中抓取的。