【问题标题】:how to differentiate between memory (heap) - and stack- addresses如何区分内存(堆)和堆栈地址
【发布时间】:2012-11-02 07:37:41
【问题描述】:

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

lea rax, rbp - 8

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

mov qword [rax], 14

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

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

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

会这样吗?

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

【问题讨论】:

  • 栈和堆是指令集之上的概念。指令集在给定的寄存器中读取和写入内存地址,地址对程序有意义,但对硬件没有任何意义。您可以使用堆栈指针来读取堆,并使用 gpr 来读取堆栈,硬件并不关心。
  • 谢谢你,正是这些愚蠢的事情让你熬了一夜......

标签: assembly heap-memory stack-memory addressing


【解决方案1】:

CPU怎么知道,数据在哪里,当我做这个 mov qword [rax], 14

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

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

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

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

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

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

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

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

【讨论】:

  • CPU 不直接访问 RAM,是吗?我以为这一切都通过了 MTU,我在考虑虚拟地址空间,但话又说回来,我没有在问题中这么说……但这是否意味着堆栈的大小是有限的?
  • @user1821933 这取决于架构,它可以直接访问ram,也可以通过缓存使用直接访问或DMA。
  • @user1821933 你可能指的是 MMU,不是每个 CPU 都有一个,有些甚至没有缓存或需要外部存储器 (MCU),在这种情况下 CPU 可以直接从内存或通过 DMA 传输,无论哪种方式,堆栈与堆的事情都不相关,是的,堆栈大小是有限的,RAM是有限的:)
  • 在指令级别,内存地址不必有意义,您可以轻松地告诉处理器访问没有外围设备或内存映射的地址,汇编器应该接受该地址并正确编码指令,处理器应该正确地启动指令,从那里发生的错误是直接影响执行还是在执行该指令后发生取决于体系结构。
  • 将事物分开到适当的位置很重要。 .data、.text 等,堆栈与堆,有符号与无符号加减法,字符与字节,这些都是与硬件没有直接关系的编程概念。有堆栈指针和堆栈指针指令,但这与那里的实际内存无关,或者谁任意定义了一个字节在堆栈中,另一个字节在堆中,另一个字节在 .text 等也分开处理器及其外围设备的指令集,包括 mmu 等。
猜你喜欢
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2021-05-10
  • 1970-01-01
  • 2014-04-21
  • 2012-08-09
  • 1970-01-01
相关资源
最近更新 更多