Assembly 这是否保证CPU以堆栈增长的相反方向获取内存?

Assembly 这是否保证CPU以堆栈增长的相反方向获取内存?,assembly,stack,Assembly,Stack,对于堆栈增长到较低地址的体系结构,上面获取-0x18%rbp~-0x20%rbp;反之亦然 这是真的吗 如果是这种情况,技术原因是什么?一般来说,CPU不知道堆栈是如何实现的,这通常取决于编译器 因此,在您的情况下,它将获取一个从地址%rbp-0x18开始的单词。如果一个字是4字节,那么它将获取跨越{%rbp-0x18,%rbp-0x17,%rbp-0x16,%rbp-0x15}的字。一般来说,CPU不知道堆栈是如何实现的,这通常取决于编译器 因此,在您的情况下,它将获取一个从地址%rbp-0x

对于堆栈增长到较低地址的体系结构,上面获取-0x18%rbp~-0x20%rbp;反之亦然

这是真的吗


如果是这种情况,技术原因是什么?

一般来说,CPU不知道堆栈是如何实现的,这通常取决于编译器


因此,在您的情况下,它将获取一个从地址%rbp-0x18开始的单词。如果一个字是4字节,那么它将获取跨越{%rbp-0x18,%rbp-0x17,%rbp-0x16,%rbp-0x15}的字。

一般来说,CPU不知道堆栈是如何实现的,这通常取决于编译器


因此,在您的情况下,它将获取一个从地址%rbp-0x18开始的单词。如果一个字是4字节,那么它将获取跨越{%rbp-0x18,%rbp-0x17,%rbp-0x16,%rbp-0x15}的字。

否。这两个字是不相关的。一个是ISA的财产,另一个是平台的ABI


顺便说一句,我不知道有哪种体系结构上的多字节访问不在升序地址上。

没有。这两者是不相关的。一个是ISA的财产,另一个是平台的ABI



顺便说一句,我不知道有哪种体系结构的多字节访问不在升序地址上。

您在寻找x86特定的答案吗?因为并不是所有的CPU都有一个堆栈增长的自然方向。这就是为什么我说相反。没有任何堆栈增长方向的假设。你在寻找一个x86特定的答案吗?因为并不是所有的CPU都有一个堆栈增长的自然方向。这就是为什么我说相反。没有任何堆栈增长方向的假设。你的意思是它与堆栈增长方向无关吗?@Je Rog:是的。我不知道曾经存在过的每个处理器的细节,但是在我能想到的所有处理器上,内存读/写/加载/存储指令总是指定元素的最低地址。这可能是因为您从未处理过堆栈增长到更高地址的情况?@Je Rog:内存访问是堆栈方向不变的。这是因为堆栈不是唯一存在数据的位置。在x86上,唯一受堆栈增长方向影响的指令是push、pop和各种调用和ret,其中可能包括int和iret。您引用的是一个简单的内存获取,它恰好使用rbp作为基址寄存器。访问仍然是按顺序向地址的较大值进行的。你的意思是它与堆栈增长方向无关吗?@Je-Rog:是的。我不知道曾经存在过的每个处理器的细节,但是在我能想到的所有处理器上,内存读/写/加载/存储指令总是指定元素的最低地址。这可能是因为您从未处理过堆栈增长到更高地址的情况?@Je Rog:内存访问是堆栈方向不变的。这是因为堆栈不是唯一存在数据的位置。在x86上,唯一受堆栈增长方向影响的指令是push、pop和各种调用和ret,其中可能包括int和iret。您引用的是一个简单的内存获取,它恰好使用rbp作为基址寄存器。访问仍然按顺序向地址的更大值进行。ISA=此处的编译器供应商?这里不确定一个和另一个的顺序。ISA是指令集架构,是处理器上可用的机器指令集的名称。那么你的意思是堆栈增长方向是平台的ABI吗?@Je-Rog:是;堆栈的增长方向是ABI的属性。同一硬件上的两个操作系统可以通过使用不同的ABI使堆栈朝相反的方向增长。是否有任何参考,因为这与@Oli Charlesworth的想法不同,这通常取决于compilerISA=编译器供应商?这里不确定一个和另一个的顺序。ISA是指令集架构,是处理器上可用的机器指令集的名称。那么你的意思是堆栈增长方向是平台的ABI吗?@Je-Rog:是;堆栈的增长方向是ABI的属性。同一硬件上的两个操作系统可以通过使用不同的ABI使堆栈朝相反的方向增长。是否有任何参考,因为这与@Oli Charlesworth的想法不同,这通常取决于编译器
0x00000000004004b7 <func+31>:   mov    -0x18(%rbp),%rax