4

我注意到 MOV 应该从寄存器复制和覆盖数据,但是如果任何其他寄存器中没有当前数据,MOV 是否会将一定大小的字节从 RAM 移动到寄存器以临时保存它,或者如何这项工作到底是什么?

为了澄清我的问题,假设我使用:

MOV AL, 0x10;

在这种情况下,移动到 8 位寄存器的“10”位数据在哪里?

这是从 RAM 移动到 AL 的 8 位来保存,还是“10”字节只是一个不在内存中的暂存器数字?

我不明白这一点,如果有人能解决这个问题,那就太棒了。

我的问题是我需要知道在哪里使用了多少内存以及使用了多少内存,以及如何以及究竟是什么解决了它(教程并没有明确这一点)。

4

4 回答 4

6

猜测心理障碍:重要的是要了解 RAM 既包含代码又包含包含数据。值 0x10 来自代码。它被汇编器编码成机器代码指令。该代码在开始执行您的代码时被操作系统加载到 RAM 中。

值得注意的是它不是一个变量,指令将始终加载 0x10,无论程序的状态如何。RAM 的其他部分存储您在汇编程序中声明的数据。就像 .data 和 .stack 部分一样。但是此特定指令并未以其他方式使用。

增加可能的混淆:它不必RAM 中。在没有操作系统或引导驱动器的嵌入式系统上,代码通常被烧录到 ROM 中。处理器并不关心它,它只是从内存总线读取字节,使用 EIP 寄存器(指令指针)告诉内存子系统它需要什么字节。

于 2013-01-07T22:35:51.213 回答
4

您的代码位于 RAM 中,即代表MOV AL, 0x10;0x10 的字节是指令的一部分,它不是单独存储的。通常,它不会在执行时来自 RAM,而是来自 CPU 上的指令流水线,CPU 在它认为合适的时候将指令从 RAM 提取到它的流水线中。

想要一本关于组装的免费在线书籍,请尝试http://cs.smith.edu/~thiebaut/ArtOfAssembly/artofasm.html

第 4 章处理内存寻址 http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH04/CH04-1.html

有很多概念可以让您了解,各种形式的内存寻址以及如何使用 CPU 架构一开始似乎令人生畏,但当您尝试时会慢慢开始变得有意义。

于 2013-01-07T22:21:10.140 回答
2

我想您的设备/机器中的主内存是 RAM。因此,基本上您的应用程序将在运行时存在(例如,在您从硬盘运行该应用程序后,它将被加载到设备内存中)。顺便说一句,处理器可执行的所有二进制指令现在都在 RAM 中。

为了简化这一点,假设处理器将从第一个单元格开始读取内存,如 0,将尝试了解如何处理它,完成后将继续移动到下一个单元格,在这种情况下为 1,依此类推.

现在让我们说在我们的假想处理器mov al, 0x10中等于。0xAABB在物理内存中,0xAA存储在单元格号200xBB21。我们的处理器仍在忙于读取流。当它到达内存时20,它将加载0xAA在这种情况下的二进制值。顺便说一句,在我们的处理器文档中,这意味着用以下数据填充 AL。在我们的例子中,以下数据是0xBB,所以处理器会这样做。

如你看到的:

  • 在这里,在我们的示例中,所有内容都存在于 RAM 中(在运行时),包括可执行指令、数据等。
  • CPU 从 RAM 中读取它,并将尝试做任何应该/必须做的事情
  • 正如您可能注意到的那样,它不是在运行时mov al, 0x10分配的,而是由编译器硬编码的,并存储到一个可执行文件中(例如)
  • 所以,这个假想0xBB存在于 RAM 中,但您不能在运行时更改它。再次记住,它不是在运行时创建的,它只是在运行时加载到 RAM 中

我希望它可以帮助您更好地理解这一点。

于 2013-01-10T13:27:01.260 回答
1

组装说明

mov al, 0x10 

等于0xb010二进制

mov al, 0xff

等于 0xb0ff

如果您在 Windows 上,您可以单击开始 - 运行 - 调试并在调试窗口中写入

a      
[Enter]
mov al, ff
[Enter]
[Enter]

它将 mov al, ff 更改为二进制

然后你可以看到 0xb0ff by..

u 100
[Enter]

a 
mov al, ff

表示 'assemble' mov al, ff 并保存到当前位置(可能是 0x100)

u 100表示“拆开”位置 0x100

于 2013-01-08T10:12:47.453 回答