如果我有一个无符号字节,我想把他推入堆栈,我必须推一个字。“为什么?我读过x86堆栈是基于字的,但我不明白......
例如,“push byte 0xa8”需要符号扩展为word,所以它是“push word 0x00a8”。但是使用word,dword和qwords这不会发生(更多的字节代表无符号)。
答案 0 :(得分:7)
堆栈的一般概念有一个类型,您可以推送和弹出该类型的项目。对于x86,该类型是活动操作数大小。这不是一个错误。
“英特尔允许” - 不,他们不这样做。在16位模式下,您只能推送一个单词,而不是别的。在32位模式下,您只能推送一个dword,而不是别的。在64位模式下,你只能推送一个qword,没有别的(你甚至没有得到64位立即版本)。这没有超越,但这会让你快速陷入困境。由于没有8位操作模式,因此无法获得8位推送。
这也保持了堆栈的自然对齐。如果要访问堆栈上的字节数据,可以将其视为通用内存,并在分配对齐的块后照常使用mov
和其他指令。