Assembly 是",;MOV";在汇编中分配内存的指令?

Assembly 是",;MOV";在汇编中分配内存的指令?,assembly,Assembly,我注意到MOV应该在寄存器之间复制和覆盖数据,但如果任何其他寄存器中都没有数据,MOV是否会将某个大小的字节从RAM移动到寄存器以临时保存它,或者这是如何工作的 为了澄清我的问题,假设我使用: MOV AL, 0x10; 在这种情况下,移动到8位寄存器的“10”位数据在哪里 这是从RAM移到AL作为8位保存,还是“10”字节只是一个不在内存中的草稿行编号 我不明白这一点,如果有人能解决这一问题,那将是令人惊讶的 我的问题是,我需要知道在哪里和使用了多少内存,以及如何和如何准确地寻址它(教程没有

我注意到MOV应该在寄存器之间复制和覆盖数据,但如果任何其他寄存器中都没有数据,MOV是否会将某个大小的字节从RAM移动到寄存器以临时保存它,或者这是如何工作的

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

MOV AL, 0x10;
在这种情况下,移动到8位寄存器的“10”位数据在哪里

这是从RAM移到AL作为8位保存,还是“10”字节只是一个不在内存中的草稿行编号

我不明白这一点,如果有人能解决这一问题,那将是令人惊讶的


我的问题是,我需要知道在哪里和使用了多少内存,以及如何和如何准确地寻址它(教程没有明确说明这一点)。

您的代码存在于RAM ie中,表示
MOV AL的字节,0x10,0x10是指令的一部分,它不是单独存储的。通常,它不会在执行点来自RAM,而是CPU上的一条指令管道,CPU根据自己的需要将指令从RAM提取到管道中

想要一本关于组装的免费在线书籍,请尝试

第4章讨论内存寻址


有很多概念需要你去思考,各种形式的内存寻址以及如何使用CPU体系结构在一开始似乎令人望而生畏,但当你尝试这些东西时,会慢慢开始变得有意义。

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

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

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

汇编指令

mov al, 0x10 
在二进制中等于
0xb010

mov al, 0xff
等于0xb0ff

如果你在windows上 您可以单击开始-运行-调试 在调试窗口中,编写

a      
[Enter]
mov al, ff
[Enter]
[Enter]
它变了 莫夫艾尔,ff 二进制

然后您可以看到0xb0ff 由

表示“组装”mov al、ff并保存到当前位置(可能为0x100)


u 100
表示“未装配”位置0x100

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

为了简化这一点,假设处理器将从第一个单元开始读取内存,如0,将尝试了解如何处理它,完成后将转到下一个单元,在本例中为1,依此类推

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

如你所见:

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

我希望它能帮助你更好地理解这一点。

它在说明书中。@GManNickG你能再澄清一点吗?你是说RAM是由指令本身访问的,而不是移动的?我不明白。你能告诉我们为什么你需要知道这个吗。请给出更多的上下文也许缺少的概念是MOV不是一条指令。它们有很多,一个移动10到AL,另一个移动42到BX,等等。在传统意义上,ASM中并没有真正的“分配”内存。记忆就在那里。我仍然真的不明白这有什么意义。。。指令存储在RAM中,但如何将数据移动到处理器以使用它?当它“在”处理器中时,您如何知道RAM中的什么和什么是并发的,或者在并行指令之间互换地在设备之间移动?好的,对于您所展示的指令,它不涉及为了数据目的访问RAM,指令包含所有必要的部分。为了寻址内存以便存储数据或检索数据,通常您有一块分配的内存(如何获得它取决于它是在操作系统上运行的,还是嵌入的,或者其他什么)。您加载一个以该块开头的寻址寄存器,然后
u 100
[Enter]

a 
mov al, ff