assembly - 内存寄存器如何用于保存不同的类型?

标签 assembly memory memory-management dynamic-memory-allocation cpu-registers

我的印象是,如果程序为变量类型integer(大小为 8 个字节)保留内存,则保留的内存将是 8 个不同的寄存器,它们依次出现在内存中.

我的问题如下:

  1. 假设答案会有所不同,我上面的陈述是否是一个很好的概括,即不同类型变量所需的每个字节都等同于使用内存中 1 个寄存器的那个变量? (即1个字节需要内存中的一个寄存器)

  2. 如果这是真的,内存中的每个寄存器有多少位?或者,如果我买了一台 32 位计算机,这是否意味着内存中的每个寄存器都有 32 位?

  3. 如果整数类型需要 8 个不同的寄存器来满足其 8 字节的大小,那么每个不同的寄存器中包含什么?

  4. 我也在尝试理解类型的概念。我知道如果你有 32 位可以使用,你可以表示从 0 到 4294967295 的unsigned integer 值。然而,如果我将 unsigned integer 4294967295 存储在 32 位的存储单元中-bits CPU 如何知道此存储单元中的二进制表示需要解码为无符号整数 格式?也就是说,为某种类型预留的内存是否指定了某种类型,或者指针是否指定了类型或可能完全不同的东西?

我通常了解二进制算术、汇编语言、引用、指针以及变量和数组如何存储在内存堆中的概念(因此我会使用这些上下文理解任何答案)。我可以用 C、C++ 和 Java 编程。感谢您提供的任何帮助。

最佳答案

1、2、3:不要将内存称为寄存器;尽管我之前已经看到它令人困惑。 64 位处理器有 8 字节宽的寄存器,32 位处理器有 4 字节宽的寄存器,但是当这些寄存器被复制到 RAM 中时,它只是内存中的字节。整数的哪一部分存储在哪个字节中取决于处理器的字节序:小端系统会将 1 位存储在 8 字节的第一个(最低)地址的 0x1 中,而大端系统将存储它在最后。

4:CPU不知道也不关心; “types”是一种高级语言结构,对 CPU 来说一切都是数字:“abcd”是一个数字,因为 0xf0f0f0f0 是一个数字。你必须根据你想要它做什么来给它指令,例如对于 x86,如果您希望将数字视为已签名,请使用 IDIV 而不是 DIV。

关于assembly - 内存寄存器如何用于保存不同的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9287220/

相关文章:

macos - 如何在 NASM 中打印 argv[0]?

performance - 为什么 SSE 标量 sqrt(x) 比 rsqrt(x) * x 慢?

c - Z/OS 上的 C 编译器生成的可执行代码可以在 IBM z/Linux 平台上执行吗?

C# 性能因内存而异

ios - 弱 self 和委托(delegate)

c++ - calloc vs new 用于各种编译器中的复杂结构

assembly - ARM-Assembly : Arithmetic Shift/Logical Shift

linux - Linux中用户空间内存和内核空间内存如何映射到物理内存?

c - malloc 分配的指针的大小

c - 内存映射显示的 RAM 多于物理可用的 RAM