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

时间:2012-11-13 20:21:52

标签: assembly stack heap addressing

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

lea rax, rbp - 8

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

mov qword [rax], 14

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

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

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

这会发生吗?

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

1 个答案:

答案 0 :(得分:5)

  

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

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

  

我的意思是,它只是一个地址......如果我在2 ^ 64

预留了内存怎么办?

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

  

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

是的,它被称为stackoverflow :)并且很可能会导致分段错误。

  

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

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

你应该读一本关于计算机体系结构的书,我推荐这篇由Patterson撰写的Computer Organization and Design, 4th Ed