L1 is通常/可能是label,与内存中的一个特定地址相关联。程序员为了方便起见定义了各种标签,这些标签用于象征性地表示内存中的特定位置(L1 是一个糟糕的名称;标签通常指示该位置的基本用途:例如,PingCounter、ErrorMessage、Login等)。
C 编译器如何实现 1 字节静态存储的标签char L1;
在全球范围内。
在 NASM 语法中,mov edi, L1
将集合到mov eax, imm32 http://felixcloutier.com/x86/MOV.html的形式mov
,即标签地址将成为机器码中的 32 位立即数。 (汇编器不知道最终的数值,但链接器知道。)请注意,在 MASM 语法中,这将是一个负载,您需要mov edi, OFFSET L1
立即获取标签地址。
But mov al, [L1]
将汇编成不同的指令,并将 32 位地址嵌入到机器代码中作为要取消引用的地址。该指令从地址 L1 加载 1 个字节,并将其放入 AL 中。
在汇编语言中,这种间接寻址模式通过将给定指令的源操作数或目标操作数括在方括号中来表示。 (但不能两者兼而有之:x86 每条指令最多只支持一个显式内存操作数。)
mov al, [L1]
使用L1中存储的地址,定位内存中的某个位置,并在该位置读取1个字节(= 8位= AL寄存器的大小),并将其加载到AL寄存器中。
mov [L1], al
反过来做这个。即,具体来说,读取L1中存储的地址,使用该地址找到内存中的特定位置并将AL寄存器的内容存储在那里。
如果您了解以下关于 x86 系列中较新处理器的信息不完整且有些过时,则此信息8086 架构入门 http://howardhuang.us/teaching/cs232/06-Intel-8086-architecture.pdf对于开始使用 x86 系列的汇编语言可能非常有用。
从这个“古老的 CPU”(实际上仍在使用)开始的优点是,基本概念都在那里,不受新的寄存器组、奇特的寻址模式、操作模式和其他概念的阻碍。较新的 CPU 的更大尺寸、功能和模式只是引入了选项的组合爆炸,所有(大多数?)它们都以自己的方式有用,但本质上与启动无关。