2

有些东西我无法消化。我正在学习一些汇编程序,现在我正在处理寻址这一章。我理解用于取消引用的括号的概念,但是当我看到它的用法时,我就是无法理解它的意义。更确切地说,这是我的困惑开始的地方:

mov al, [L1]

在这里,我假设 L1 作为示例案例是某种宏,它稍后会替换机器代码中的真实地址,对吧?

所以这条指令的作用是:取消引用al寄存器(因为您几乎无法更改物理地址)并将值更改为存储在L1.

如果到目前为止一切正常:

mov [L1], al

类似地,这意味着必须存储一个地址(因此这样做有一定的意义),然后您将其更改为内存中的其他位置,对吗?

如果你能告诉我没关系,万一你没有看到任何错误,请这样做,这将使我有可能继续学习。

最后一件事,NASM 在我的代码下添加了一堆0xAA55(这个序列应该结束程序吧?),为什么会出现这么多次?

4

3 回答 3

4

L1通常/可能是一个标签与内存中的一个特定地址相关联。程序员为方便起见定义了各种标签,这些标签用于象征性地表示内存中的特定位置(L1 是一个糟糕的名称;标签通常表示该位置的潜在用途:例如,PingCounter、ErrorMessage、Login之类的)。

1 字节静态存储的标签是 C 编译器char L1;在全局范围内实现的方式。


在 NASM 语法中,mov edi, L1将汇编为 的mov eax, imm32形式mov,即标签地址将成为机器码中的 32 位立即数。(汇编器不知道最终的数值,但链接器知道。)请注意,在 MASM 语法中,这将是一个负载,您需要mov edi, OFFSET L1立即获取一个标签地址。

mov al, [L1]将汇编成不同的指令,将 32 位地址嵌入机器代码中作为要取消引用的地址。该指令从地址 L1 加载 1 个字节,并将其放在 AL 中。

在汇编语言中,这种间接寻址模式是通过将给定指令的源或目标操作数括起来的方括号来表示的。(但不是两者兼有:x86 每条指令最多只支持一个显式内存操作数。)

mov al, [L1]

使用存储在 L1 中的地址来定位内存中的某个位置,并在该位置读取 1 个字节(= 8 位 = AL 寄存器的大小),并将其加载到 AL 寄存器中。

  mov [L1], al

反过来做。即,具体来说,读取存储在L1 中的地址,使用该地址在内存中找到一个特定位置并将AL 寄存器的内容存储在那里。


如果您了解以下关于 x86 系列中较新的处理器的信息是不完整的并且有些过时,那么这本 8086 架构入门可能对开始使用 x86 系列的汇编语言非常有用。
从这种“古老的 CPU”(实际上仍在使用)开始的优点是基本概念都在那里,不受新的寄存器集、花哨的寻址模式、操作模式和其他概念的影响。较新的 CPU 更大的尺寸、功能和模式只是引入了选项的组合爆炸,所有(大多数?)它们都以它们的方式有用,但基本上与启动无关。

于 2010-03-02T15:29:26.537 回答
3

很难理解你的问题,但我会尽力提供帮助。

在汇编中,符号只是地址的名称。在您的汇编源代码中,L1 是在别处定义的符号,汇编器会将其解析为内存偏移量。

取消引用时(使用 [] 表示法),您可以取消引用寄存器(如“mov al, [esi]”)或地址(如“mov al, [L1]”)。两个语句都做同样的事情,唯一的区别是地址来自哪里。

我建议下载Intel CPU 文档并浏览指令参考。如果您不想不知所措,请从较旧的 x86 处理器(例如,486 或更早版本)开始阅读,该文档并不完全友好,但手头有它非常有用。

我不知道 NASM 的具体细节,我在 15 年前用 Turbo Assembler 学习了汇编,这些知识今天仍然有用:)

另外,我是否建议您尝试谷歌搜索“x86 汇编教程”,您会发现大量可能对您有用的相关文档。

于 2010-03-02T15:38:32.987 回答
1

哦,最后一件事,NASM 在我的代码下添加了一堆 0xAA55(这个序列应该结束程序吧?),为什么会出现这么多次?非常感谢你读到这里..

我很确定这仅适用于您创建引导加载程序的情况。它是“引导签名”。假设您将此代码写入软盘(您生成的机器代码是否也正好是 512 字节?),那么当您想使用此引导加载程序代码启动计算机时,BIOS 将查看软盘并确定它是否是实际的引导加载程序。为了做到这一点,它会查看软盘第一个扇区的最后两个字节,这应该0xAA55表明它是可引导的..(同样,如果你从硬盘驱动器或拇指启动,这也是一样的。 -drive 或其他。CD 略有不同,因为它们有 4096 字节扇区)

在您的源代码中,就像最后一行一样$(times.. db 0xAA55或类似的东西?如果您不打算制作引导加载程序,则可以有效地删除该行。

于 2010-03-02T17:36:49.377 回答