如何区分内存(堆)和堆栈地址

Ban*_*urt 3 heap assembly stack addressing

我的问题是:当我有这样的事情时:

lea rax, rbp - 8
Run Code Online (Sandbox Code Playgroud)

//也许这是我的堆栈上的一个int,因为我的代码中有一个本地"int"变量.当我这样做时,CPU如何知道数据的位置:

mov qword [rax], 14
Run Code Online (Sandbox Code Playgroud)

我的意思是,这只是一个地址......如果我保留记忆2^64 - x怎么办?

不能分配的内存有这种地址吗?

或者如果堆栈增长直到它与您分配的内存具有相同的地址呢?

那会发生吗?

汇编程序不知道rax中的数字是什么,所以它不能是MOVstack和MOVheap,就像远近的JMP一样.

iab*_*der 5

CPU如何知道数据的位置,当我这样做时,移动qword [rax],14

为什么CPU需要知道数据是在堆栈还是堆上?两者都在同一个地方,RAM.

我的意思是,它只是一个地址......如果我在2 ^ 64保留了内存怎么办?

如果地址大于您的地址空间,您将无法在那里保留内存.

或者如果堆栈增长直到它与您分配的内存具有相同的地址呢?那会发生吗?

是的它发生了,它被称为stackoverflow :)并且很可能导致分段错误.

汇编程序不知道rax中的数字是什么,因此它不能是MOVstack和MOVheap

据我所知,没有单独的指令来访问堆栈或堆,就像我说的,堆栈和堆都存在于RAM中.所有CPU关心的是写入或读取的地址,但是,在某些体系结构上,没有内存映射I/O的那些有访问I/O寄存器的特殊指令,大多数体系结构参见I/O只是另一个内存地址.

你应该读一本关于计算机体系结构的书,我推荐这个计算机组织和设计, Patterson的第4版.

  • @ user1821933你可能意味着MMU,不是每个CPU都有一个,有些甚至没有缓存或需要外部存储器(MCU),在这种情况下CPU可以直接从内存或通过DMA传输,无论是哪种方式,堆栈与堆的东西是不相关的,是的堆栈大小是有限的,RAM是有限的:) (2认同)
  • 将事物分成适当的位置很重要..data,.text等,堆栈与堆,签名与无符号加法和减法,字符与字节,这些都是与硬件没有直接关系的编程概念.有堆栈指针和堆栈指针指令,但这与那里的实际内存无关,或者谁有任意定义一个字节在堆栈中另一个字节在堆中,另一个字节在.text等也是分开的处理器及其外围设备的指令集,包括mmu等. (2认同)