为什么不可能将一个字节压入Pentium IA-32上的堆栈?

Tim*_*een 14 x86 assembly intel

我已经知道你不能将一个字节直接推到英特尔奔腾的堆栈上,有人能解释一下吗?

我被给出的原因是因为esp寄存器是字可寻址的(或者,这是我们模型中的假设),它必须是"偶数地址".我会假设递减一些32位二进制数的值不会弄乱寄存器的对齐,但显然我不够了解.

我已经尝试了一些NASM测试并提出如果我声明一个变量(咬db 123)并将其推入堆栈,esp减少4(表明它推了32位?).但是,"推送字节咬"(抱歉我选择的变量名称)将导致一种错误:

test.asm:10:错误:不支持的非32位ELF重定位

在这个困难的时期,任何智慧的话都会受到高度赞赏.我是大学一年级学生,对于我在任何一个方面的天真抱歉.

Yul*_*liy 10

在某些情况下,它会使堆栈指针无法完成其工作.例如,假设您有一个函数将一个字节压入堆栈然后调用另一个函数.调用最终会尝试将未对齐的返回地址写入堆栈,从而导致错误.


小智 6

它基于堆栈的创建方式:

堆栈段的地址大小属性决定了堆栈指针大小(16、32 或 64 位)。当前代码段的操作数大小属性决定了堆栈指针的递减量(2、4 或 8 个字节)。

在非 64 位模式下:如果地址大小和操作数大小属性为 32,则 32 位 ESP 寄存器(堆栈指针)递减 4。如果两个属性都为 16,则 16 位 SP 寄存器(堆栈指针)指针)减 2。

来源:http : //www.intel.com/Assets/PDF/manual/253667.pdf

页。4-320 卷 2B

编辑

只是想指出一个有趣的阅读是手册中关于堆栈的部分,它将进一步解释创建堆栈段。

http://www.intel.com/Assets/PDF/manual/253665.pdf

第 6.2 章