Assembly中的“MOV”指令是否分配内存?

时间:2013-01-07 22:18:02

标签: assembly

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

澄清我的问题,说我用:

MOV AL, 0x10;

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

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

我不明白这一点,如果有人能理顺这一点,那就太棒了。

我的问题是我需要知道使用的内存的位置和内容,以及如何以及如何解决它(并且教程没有明确说明这一点)。

4 个答案:

答案 0 :(得分:6)

猜测心理障碍:了解RAM包含代码数据非常重要。值0x10来自代码。它由汇编程序编码到机器代码指令中。当代码开始执行代码时,操作系统将该代码加载到RAM中。

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

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

答案 1 :(得分: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架构最初看起来令人生畏,但在尝试填充时会慢慢开始有意义。

答案 2 :(得分:2)

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

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

现在让我们假设处理器mov al, 0x10等于0xAABB。在物理内存中,0xAA存储在20的单元格和0xBB的{​​{1}}。我们的处理器仍然忙着阅读流。当它到达21的内存时,它将加载在这种情况下为20的二进制值。顺便说一句,在我们的处理器文档中,它意味着使用以下数据填充AL 。我们的案例中的以下数据是0xAA,因此处理器会这样做。

如你所见:

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

我希望它可以帮助你更好地理解。

答案 3 :(得分:1)

汇编指令

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

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

u 100表示“取消组合”位置0x100