gpt4 book ai didi

assembly - 将一个字节压入堆栈(IA32)

转载 作者:行者123 更新时间:2023-12-03 06:24:05 25 4
gpt4 key购买 nike

我的课本上有一个问题:根据操作数给出正确的后缀:

push $0xFF

答案是:

pushl $0xFF

但是为什么不pushb $0xFF(我认为pushb不存在)或pushw $0xFF(pushw确实存在),既然0xFF是一个字节,为什么它必须是'l',即32位/4字节?

最佳答案

AT&T 语法中 push默认操作数大小(以及所有其他汇编器,如 NASM 和 MASM)是当前模式的宽度。 (16 位模式下为 16 位,32 位模式下为 32 位,64 位模式下为 64 位。)这与 call/ret 的“堆栈宽度”匹配>.

How many bytes does the push instruction push onto the stack when I don't specify the operand size?

pop 的默认版本也是不需要额外机器代码前缀进行编码的版本。

当存在歧义时,大多数指令都需要明确的操作数大小,例如mov $1234567, (%esp) 无效,但 mov %eax, (%esp) 合法,因为寄存器隐含了操作数大小。

但是 push - 有趣的是立即:push 的非默认宽度很少使用,以至于 asm 语法设计者选择给它一个默认宽度,而不需要 pushl $0xff (AT&T) 或 push dword 0xff (NASM)。请注意,Intel 语法排在第一位; AT&T紧随其后。因此,也许 AT&T 语法设计者遵循了早期 Intel 语法汇编程序的惯例。

我指出这一点是因为对于 AT&T 语法来说,大小后缀仅多了 1 个字母,但在 Intel 语法中看起来更笨重。

push-immediate 在总是在堆栈上传递参数的传统低效调用约定中大量使用,因此使其易于键入是有意义的。

<小时/>

你的教科书真的说过“推一个字节”,还是你编造的?

正如您所说,您不能在 x86 中仅推送一个字节。

您的汇编器甚至无法使用 pushl imm8 编码,因为 0x000000FF 不适合符号扩展的 8 位整数。只有从 -128 (0xFFFFFF80) 到 127 (0x0000007F) 的值适合有符号 8 位整数。

关于assembly - 将一个字节压入堆栈(IA32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51889844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com