Tim*_*een 14 x86 assembly intel
我已经知道你不能将一个字节直接推到英特尔奔腾的堆栈上,有人能解释一下吗?
我被给出的原因是因为esp寄存器是字可寻址的(或者,这是我们模型中的假设),它必须是"偶数地址".我会假设递减一些32位二进制数的值不会弄乱寄存器的对齐,但显然我不够了解.
我已经尝试了一些NASM测试并提出如果我声明一个变量(咬db 123)并将其推入堆栈,esp减少4(表明它推了32位?).但是,"推送字节咬"(抱歉我选择的变量名称)将导致一种错误:
test.asm:10:错误:不支持的非32位ELF重定位
在这个困难的时期,任何智慧的话都会受到高度赞赏.我是大学一年级学生,对于我在任何一个方面的天真抱歉.
小智 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 章