3

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

lea rax, rbp - 8

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

mov qword [rax], 14

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

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

或者如果堆栈增长到与您分配的内存具有相同的地址怎么办?

这会发生吗?

汇编器不知道 rax 中的数字是多少,因此它不能是 MOVstack 和 MOVheap,就像近 JMP 和远 JMP 一样。

4

1 回答 1

6

当我执行此操作时,CPU 如何知道数据在哪里 mov qword [rax], 14

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

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

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

或者如果堆栈增长到与您分配的内存具有相同的地址怎么办?这会发生吗?

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

汇编器不知道 rax 中的数字是多少,所以它不能是 MOVstack 和 MOVheap

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

你应该读一本关于计算机体系结构的书,我推荐这本计算机组织与设计,帕特森的第 4 版。

于 2012-11-13T20:29:13.467 回答