英特尔IA32架构中的堆栈宽度是多少?

时间:2010-06-30 04:58:54

标签: assembly stack

对于IA32架构和所有类型的微处理器/微控制器,堆栈的宽度是否为8位宽。

我目前正在阅读有关汇编语言的http://ozark.hendrix.edu/~burch/csbsju/cs/350/handouts/x86.html。在解释“call”时,它表示堆栈指针减少了4并且程序计数器被推入堆栈。这是否意味着堆栈缓冲区的宽度为8位宽,因为程序计数器是32位长?我尝试在intel IA32架构软件开发手册中找到它但似乎无法证实它。

由于 Sziang

4 个答案:

答案 0 :(得分:5)

在IA32架构中,内存以字节为单位进行寻址。

因此,为了在堆栈上再放4个字节,需要将堆栈指针移动4个。

答案 1 :(得分:3)

在x86 CPU的“堆栈”上推送值的操作(例如,涉及ESP的操作,如PUSH,CALL等)都以4字节为增量推送。堆栈的有效宽度为4字节/ 32位。如果您正在编写x64 CPU,它的宽度为8个字节,但您询问的是IA32。

我总是将堆栈指针对齐在4字节(DWORD)边界上。我不知道你是否可以DWORD-misalign堆栈并让它正常工作;如果确实如此,那么在访问内存以进行推送和弹出时会给你带来严重的性能损失(这在实际代码中非常频繁地进行),因为真正的处理器想要以小功率的两个大小的块读取。

答案 2 :(得分:3)

这是我第一次听说“堆叠宽度”。

push / pop / call / ret具有默认宽度(与处理器操作模式匹配)。 但堆栈本身没有宽度。 (对齐是一个完全不同的故事。)

来自英特尔文档(推送):

"In non-64-bit modes: if the address-size and operand-size attributes are 32,
the 32-bit ESP register (stack pointer) is decremented by 4.
If both attributes are 16, the 16-bit SP register (stack pointer)
is decremented by 2."

[...]

"In 64-bit mode, the instruction’s default operation size is 64 bits.
In a push, the 64-bit RSP register (stack pointer) is decremented by 8."

对于手册(总是有最后一个字),请检查: Intel Processor Manuals

答案 3 :(得分:2)

这意味着8位是指令集(字节)中最小的可寻址存储单元。 IA32中的所有存储器地址表示RAM的8位偏移的倍数。