Nar*_*yan 4 x86 assembly callstack machine-code opcode
我刚刚发现 push 指令可以有一个立即数 byte 、 word 、 dword 参数,并且每个参数都有不同的操作码。我正在阅读的书中没有示例,所以我不明白汇编程序如何区分这三种类型。例如,如果我编写push 12h汇编器将如何解释它以及堆栈上实际会发生什么?
这取决于组装者。它可以选择具有足够大的最小操作数字段以保存立即数的操作码。它还可能要求您告诉它您想使用哪个变体。
例如,NASM 将组装push 12h成6A 12( push byte 12h)。
如果你想获得push imm16你会说的变体push strict word 12h(strict如果你不希望 NASM 将指令优化为字节推送,这是必要的)。
请注意,立即字节push实际上并没有将字节压入堆栈。在推送之前,该值将被符号扩展到至少 16 位(这发生在执行期间,而不是在编译期间)。