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 更大的尺寸、功能和模式只是引入了选项的组合爆炸,所有(大多数?)它们都以它们的方式有用,但基本上与启动无关。