我目前正在学习汇编编程,遵循Kip Irvine"汇编语言x86编程"书。
在书中,作者试图解释data label
数据标签标识变量的位置,提供a 在代码中引用变量的便捷方法。以下是 例如,定义一个名为count的变量:
count DWORD 100
汇编程序 为每个标签指定一个数字地址。
所以我对data label
的作用的理解是:数据标签count
是一个包含数值的变量,其中数值是内存中的一个位置。当我在代码中使用count
时,我实际上在内存中使用该位置中包含的值,在本例中为100。
我对数据标签的理解是否正确?如果有些不正确,有人可以指出错误吗?
答案 0 :(得分:6)
标签是一种写入内存地址的象征性方式,仅此而已。标签本身不占用空间,只是让您稍后在内存中引用该位置的便捷方式。
(好吧,它们也可以变成目标文件中的符号,以允许在链接时计算数字地址,而不是在汇编时计算。但对于在同一文件中定义和引用的标签,这种额外的复杂性大多是不可见的;请参阅下面有关地址是链接时间常数的信息,而不是汇编时间。)
e.g。
; NASM syntax, but the concepts apply exactly to MASM as well
; For MASM, you may need BYTE PTR or whatever size overrides in loads.
section .rodata ; or section .data if you want to be able to store here, too.
COUNT:
db 0x12
FOO:
db 0
BAR:
dw 0x80FF ; same as db 0xff, 0x80
像mov eax, [COUNT]
这样的4字节加载将得到0x80FF0012(因为x86是little-endian)。来自FOO
的{{1}}的2字节负载将获得0xFF00。
实际上,您可以通过这种方式使用常量的重叠加载,例如:字符串,其中一些是其他的子串。对于以null结尾的字符串,只有通用后缀才能以这种方式组合到同一存储空间中。
现在这是否意味着mov cx, [FOO]
是一个4字节的变量或一个1字节的变量?不,不。汇编语言确实没有"变量"。
变量是一种更高级别的概念,您可以使用标签 以汇编语言实现,并保留一些静态空间 。请注意,标签与上例中的COUNT
指令是分开的。
但变量不需要有任何静态存储空间:例如你的循环计数器变量可以(通常应该)仅存在于寄存器中。
变量甚至不需要有一个固定的位置。它可以在不使用它的函数的一部分中溢出到堆栈,但是存在于函数的另一部分的寄存器中。在编译器生成的代码中,变量经常在寄存器之间移动,因为编译器甚至不会尝试对同一个变量使用相同的寄存器。
请注意,MASM会根据后面的指令隐式地将标签与操作数大小相关联。因此,如果db
给出操作数大小不匹配错误,则可能必须编写mov eax, dword ptr [count]
。
有些人认为这是一个功能,但其他人认为这个神奇的操作数大小的东西是完全奇怪的。 NASM语法没有任何这种魔力。您可以了解线条的组装方式,而无需查找标签的定位位置。 mov eax, [count]
是NASM中的错误,因为没有任何意味着操作数大小。
不要以为在C语言中使用变量的所有内容必须在汇编语言程序中具有带标签的静态存储。但是如果你确实想要使用术语"变量"对于静态数据存储+像Kip Irvine这样的标签,然后继续。
另请注意,数据标签与代码标签并不特殊或不同。没有什么可以阻止你写add [count], 1
。将12 00 FF 80解码为(序列)x86指令作为读者的练习,但是(如果它在具有执行权限的页面中),它将被CPU取出并解码
同样,没有什么能阻止您将代码标签中的数据作为内存操作数加载。由于性能原因混合代码和数据通常不是一个好主意(所有CPU都使用拆分L1D和L1I缓存),但这也有效。在典型的操作系统(如Linux)中,可执行文件的文本段包含代码和只读数据部分,并使用读取和执行权限进行映射。 (但不是写权限,因此除非您修改了权限,否则尝试存储将会出错。)
JIT编译器将机器代码写入缓冲区然后跳转到那里。它可以是带有标签的静态缓冲区,但通常它是动态分配的缓冲区,其地址是变量。
静态地址通常是链接时常量,但通常不是汇编时常量。 (除非您正在编写引导加载程序或其他已明确加载到已知地址的内容,否则jmp COUNT
可能会有用。)这意味着您可以执行org 0x100
,但不能{{1} }}。 (对象文件格式支持整数位移,但不支持其他数学运算符。)
在PIC代码中,标签地址甚至不是链路时间常数,但至少在64位PIC代码中,从代码到数据标签的偏移是链路时间常数,因此可以使用RIP相对寻址而无需额外的间接水平(通过全球抵消表)。