X86 架构处理器汇编伪指令介绍

admin 2024-11-29 143人围观 ,发现102个评论

X86架构处理器汇编伪指令介绍

伪指令指的是那些以(.)(ASCII码是0x2E)开头的指令,但是它们只是汇编器的使用的用来进行辅助汇编编程的,而跟处理器本身没有关系的指令。因此呢,当我们学得越来越多,越来越深入到了计算机底层时,难免会接触到计算机汇编语言,比如阅读操作系统引导程序的代码。由于x86的汇编语言是标准的,比较容易查找,但是对于伪指令可能由于汇编器的不同而有差异,本文是OracleSolarisx86汇编器使用的伪指令,不同的汇编器使用的伪指令可能不同,这点需要注意,但是由于行业之间的默契,它们仍然具有参考价值。

.aligninteger,pad

.align伪指令用来指示下面的数据以integer个字节进行对齐,integer必须是正整数,并且还的是2的指数运算结果,如2,4,8…是用来对因对齐产生的多余空间进行填充的值。可以省略,省略后使用默认值,默认值为text段填充0x90(nop),对于其它段,填充0。

.ascii"string"

.ascii伪指令将一个字符串放入目标模块的当前位置,但是它不会在字符串末尾添加结束符’\0’,string必须包含在””之内。该伪指令对bss段无效。

.bcdinteger

.bcd伪指令在当前段内生成一块10进制(80-bits)数据。该伪指令对bss段无效。

.bss

.bss伪指令将当前段设为bss段。

.bsssymbol,integer

在bss段定义符号symbol并且将当前bss段的位置计数器值添加integer个字节。在这个指令中.bss伪指令后跟有参数,这种情况下,.bss伪指令不会将当前段更改为bss段。参数integer必须是正整数。

.bytebyte1,byte2,,byteN

.byte伪指令生成一组初始化之后的字节到当前段中。该指令对bss段无效。参数byte1~byteN必须是8-bit数据。

.2byteexpression1,expression2,,expression

对于.2byte伪指令,请参考.value伪指令介绍。

.4byteexpression1,expression2,,expression

对于.4byte伪指令,请参考.long伪指令介绍。

.8byteexpression1,expression2,,expression

对于.8byte伪指令,请参考.quad伪指令介绍。

.commname,size,alignment

.comm伪指令在data段分配size个字节的存储空间。size必须是正整数。分配的存储空间被name标识。注意:name不能预先定义。alignment是可选的,如果指定了alignment,那么name所代表的分配的空间的起始地址将被放置在alignment的整数倍的地址上。

.data

.data伪指令将当前段设置为data段。

.doublefloat

.double伪指令生成一个双精度的浮点数常量,并将其插入当前段中。该指令对bss段无效。

.even

.even伪指令将当前程序计数器(.)对齐到一个偶数边界。

.extexpression1,expression2,,expression

.ext伪指令在当前段中为expression1~expressionN的每个expression生成一个8038780-bit浮点数常量。该指令对bss段无效。

.file"string"

.file伪指令创建一个符号表条目,该符号表的名字就是参数string,类型为STT_FILE。string指定了与目标文件关联的源文件名称。

.floatfloat

.float伪指令在当前段中生成一个单精度浮点数常量。该指令对bss段无效。

.globlsymbol1,symbol2,,symbol

.globl伪指令声明了symbol1~symbolN的符号为全局符号。每一个其中的符号或者在外部定义,或者在输入文件定义,并且他们可以在其它文件中被访问。默认的符号绑定将会被覆盖。一个文件中定义的全局符号可以在另一个文件中访问而不用定义。全局符号只能定义一次,多次定义会导致错误。注意.globl仅仅是声明符号是全局的,它并未定义任何符号。

.groupgroup,section,objectfunctionhiddeneliminateexported#internal

.uleb128expression

.uleb128伪指令从expression中生成一个无符号的LEB128(LittleianBase128)的数字

.valueexpression1,expression2,,expression

.value伪指令为当前段的expression1~expressionN每个expression生成一个已初始化的字(word)(16位,二进制的补码值)。每个expression必须为16位整数值。.value伪指令对bss段无效。

.weaksymbol1,symbol2,,symbolN

.weak伪指令声明参数列表symbol1~symbolN中的每个symbol可以在外部定义,也可以在输入文件中定义,并可被其他文件访问。symbol的默认绑定会被.weak指令覆盖。如果一个文件中定义了一个弱符号,那么其他文件中若引用的全局符号名与这个弱符号重名,并且全局符号未定义时,那么该弱符号就被用来使用。未解析的weak符号的值为0.链接编辑器不能解析这些符号。如果一个弱符号与一个已定义的全局符号同名,则该弱符号将被忽略,不会产生错误结果。注意:.weak伪指令并不定义任何符号。

.zeroexpression

当填充数据段时,.zero伪指令用0(0)来填充expression指定的字节数。

猜你喜欢
    不容错过