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