- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有件事我无法消化。我正在学习一些汇编程序,现在我正在学习寻址章节。我理解用于解除引用的括号的概念,但不知怎的,当我看到它的用法时,我就是无法理解它的要点。更准确地说,这是我的困惑开始的地方:
mov al, [L1]
在这里,我假设 L1 作为示例,它是某种宏,稍后会替换为机器代码中的真实地址,对吗?
所以这条指令的作用是:取消引用 al
寄存器(因为你几乎无法更改物理地址)并将值更改为存储在 L1
中的值。
如果到目前为止一切正常:
mov [L1], al
这意味着,一定已经存储了一个地址(因此这样做是有道理的),并且您将其更改为内存中的其他位置,对吗?
如果你能告诉我没关系,如果你没有看到任何错误,请这样做,这将使我能够继续学习。
最后一件事,NASM 在我的代码下添加了一堆 0xAA55
(这个序列应该结束程序吧?),为什么它出现了这么多次?
最佳答案
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 系列较新处理器的信息不完整且有些过时,则此 primer on the 8086 architecture对于开始使用 x86 系列的汇编语言可能非常有用。
从这个“古老的 CPU”(实际上仍在使用)开始的优点是,基本概念都在那里,不受新的寄存器组、奇特的寻址模式、操作模式和其他概念的阻碍。较新的 CPU 的更大尺寸、功能和模式只是引入了选项的组合爆炸,所有(大多数?)它们都以自己的方式有用,但本质上与启动无关。
关于assembly - 汇编程序中的寻址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2364162/
我是一名优秀的程序员,十分优秀!