【问题标题】:Is the "MOV" instruction in Assembly to allocate memory?汇编中的“MOV”指令是否分配内存?
【发布时间】:2013-01-07 22:18:02
【问题描述】:

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

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

MOV AL, 0x10;

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

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

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

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

【问题讨论】:

  • 说明书本身就有。
  • @GManNickG 你能再澄清一下吗?所以你是说RAM是由指令本身访问的,而不是移动的?我不明白。
  • 你能告诉我们为什么你需要知道这一点。请提供更多上下文
  • 也许缺少的概念是 MOV 不是一条指令。有很多,一个移动 10 到 AL,另一个移动 42 到 BX,等等。
  • 您并没有真正在传统意义上的 ASM 中“分配”内存。记忆就在那里。

标签: assembly


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您的代码位于 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 架构一开始可能会让人望而生畏,但随着你的尝试,你会慢慢开始理解。

    【讨论】:

    • 我仍然真的不明白这有什么意义......指令存储在 RAM 中,但是如何将数据移动到处理器以使用它?当它“在”处理器中时,你怎么知道什么时候和什么同时在 RAM 中,或者在并行指令之间可互换的设备之间移动?
    • 好吧,对于您所展示的指令,它不涉及出于数据目的访问 RAM,该指令包含所有必要的部分。为了寻址内存以便您可以存储数据或检索数据,通常您有一个分配的内存块(您如何获得这取决于它是在操作系统上运行,还是嵌入,或其他东西)。您使用该块的开头加载一个寻址寄存器,然后使用带有索引的 mov,例如 mov al, [eax][ebx]
    • 其中 eax 将保存块的基内存地址,而 ebx 将保存您要访问数据的块的索引
    【解决方案3】:

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

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

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

    如你所见:

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

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

    【讨论】:

      【解决方案4】:

      汇编指令

      mov al, 0x10 
      

      二进制等于0xb010

      mov al, 0xff
      

      等于0xb0ff

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

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

      它改变了 mov al, ff 转二进制

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

      u 100
      [Enter]
      
      a 
      mov al, ff
      

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

      u 100 表示“反汇编”位置 0x100

      【讨论】:

      • 该文件包含 0xb0ff 并在您执行时加载到 ram 上。和 cpu 读取 ram 并执行 0xb0ff.
      猜你喜欢
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2018-12-22
      • 2012-04-08
      • 1970-01-01
      相关资源
      最近更新 更多