Assembly 英特尔IA32体系结构中的堆栈宽度是多少?

Assembly 英特尔IA32体系结构中的堆栈宽度是多少?,assembly,stack,Assembly,Stack,是IA32体系结构和所有类型微处理器/微控制器的堆栈宽度8位宽 我目前正在读汇编语言。在解释“call”时,它表示堆栈指针减少了4,程序计数器被推入堆栈。这是否意味着堆栈缓冲区的宽度为8位宽,因为程序计数器为32位长?我试图在《英特尔IA32体系结构软件开发手册》中找到它,但似乎无法证实 谢谢 Sziang在IA32体系结构中,内存以字节为单位寻址 因此,为了在堆栈上再放置4个字节,需要将堆栈指针移动4。这意味着8位是指令集中最小的可寻址内存单元(一个字节)。IA32中的所有内存地址表示RAM中

是IA32体系结构和所有类型微处理器/微控制器的堆栈宽度8位宽

我目前正在读汇编语言。在解释“call”时,它表示堆栈指针减少了4,程序计数器被推入堆栈。这是否意味着堆栈缓冲区的宽度为8位宽,因为程序计数器为32位长?我试图在《英特尔IA32体系结构软件开发手册》中找到它,但似乎无法证实

谢谢
Sziang

在IA32体系结构中,内存以字节为单位寻址


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

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

对x86 CPU的“堆栈”推送值的操作(例如,涉及ESP的操作,如推送、调用等)均以4字节增量推送。堆栈的有效宽度为4字节/32位。如果您是为x64 CPU编码,它有8个字节宽,但您询问了IA32


我总是让堆栈指针在4字节(DWORD)边界上对齐。我不知道你是否能调整堆栈,使其正常工作;如果是这样的话,那么在访问内存进行推送和弹出操作(这在实际代码中非常常见)时,您将付出严重的性能损失,因为实际处理器希望以两个大小块的小功率进行读取。

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

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

从英特尔文档(用于推送):

[……]

对于手册(总是最后一句话),请检查:

我感觉到某个地方要么有一个投票失败的机器人,要么有一个bug。。。这似乎发生了很多,突然。谢谢anon和cogwheel,这就是我正在寻找的答案。关于sziangCorrect(要在堆栈上放置4个字节,堆栈指针将更改为4),但没有回答此问题。从“英特尔参考手册”中,PUSH指令说明:没有任何指令,如“PUSH al”。“push imm8”根据堆栈指针的大小调整堆栈:“堆栈段的地址大小属性确定堆栈指针大小(16、32或64位)[第4-320页卷B指令集参考]”。所以,如果你运行在16位模式,它将推动16位,但我不认为这是“IA32”模式至少不在精神的问题。(我从1987年开始就没有编写过16位宽的堆栈推送)。事实上,1也是2的一个小幂:-)我很惊讶你知道上一次编写16位推送的确切年份。但是+1用于教育我。我没有意识到无论操作数大小,它们都是32位推送。我想我已经离开asm世界太久了。很容易记住;那一年我得到了我的第一块奔腾芯片和一个真正的Unix机箱。没有更多的16位内容。@GJ我没有说任何关于堆栈宽度的内容。OP想知道为什么推一个32位的值会使堆栈指针移动4。原因是堆栈指针存储内存地址,而内存地址基于字节。我的回答没有错,事实上,提问者接受了一个几乎相同的答案,这个答案比我的答案早几秒钟。@Cogwheel,但问题是:英特尔IA32体系结构中的堆栈宽度是多少?回答问题时,你有两个选择:1)根据标题狭义地解释问题,忽略所有其他上下文;2) 阅读提问者的整个帖子,试着找出他们想要理解的高层次概念。我们支持#2,而你却否决了我们。@Cogwheel:我之所以否决,是因为答案不对。我已经预料到在程序堆栈中会出现一些堆栈溢出。但这可能是堆栈溢出的另一个问题@GJ:你似乎又一次完全没有抓住重点。。。我回答了他在正文中写到的问题:“这是否意味着堆栈缓冲区的宽度是8位宽,因为程序计数器是32位长?”
"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."