前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

X86 架构处理器汇编伪指令介绍(x86汇编指令集解析)

qiguaw 2024-10-04 19:44:36 资源文章 12 ℃ 0 评论

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

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

.align integer, pad

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

.ascii "string"

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

.bcd integer

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

.bss

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

.bss symbol, integer

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

.byte byte1,byte2,...,byteN

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

.2byte expression1, expression2, ..., expression

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

.4byte expression1, expression2, ..., expression

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

.8byte expression1, expression2, ..., expression

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

.comm name, size, alignment

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

.data

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

.double float

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

.even

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

.ext expression1, expression2, ..., expression

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

.file "string"

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

.float float

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

.globl symbol1, symbol2, ..., symbol

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

.group group, section, #comdat

.group 伪指令添加一个section到一个COMDAT group中。

COMDAT段由它的段名唯一标识。如果链接编辑器遇到多个SHT_SUNW_COMDAT类型的段,并且具有相同的段名,则保留第一个段,丢弃其余的段。任何被应用于丢弃的SHT_SUNW_COMDAT段的重定位都被忽略。在丢弃的段中定义的所有符号都将被删除。

此外,链接编辑器支持段用于使用-xF选项调用编译器时段序重排的命名约定。如果一个函数被放置在一个这个段被命名为.sectname%funcname 的SHT_SUNW_COMDAT的段中,那么最后被保留的SHT_SUNW_COMDAT 段将被合并到被命名为.sectname的段中。这种方式可以用来将SHT_SUNW_COMDAT 段放置到text, data或任何其他段中作为它们的最终目标。

.hidden symbol1, symbol2, ..., symbol

.hidden伪指令声明了符号symbol1 ~ symbolN具有隐式链接的属性范围。所有在动态模块内部引用这些符号的全部绑定到其模块内部的定义上。这些符号在其模块外部不可见。

.ident "string"

.ident伪指令在comment段中创建包含一个string的条目,string可以是任何字符序列但是不包括双引号字符(””), 要在字符串中包含双引号字符,请在双引号字符之前加上反斜杠(\)(ASCII 0x5C)。

.lcomm name, size, alignment

.lcomm伪指令在bss段分配size字节大小的存储空间。该存储空间由符号name引用。name不能预先定义,size必须为正整数。如果指定了参数alignmentname引用的地址将被对齐为alignment的倍数。如果未指定alignment,则默认对齐方式为4个字节。

.local symbol1, symbol2, ..., symbolN

.local伪指令声明symbol1 ~ symbolN中的每个符号都是local型的。其中的每个符号都定义在输入文件中,其它文件不可以访问这些符号。这些符号之前的绑定将会被覆盖。.local伪指令优先级高于.weak和.global。由于其他文件无法访问.local符号,因此相同名称的.local符号可能存在于多个文件中。.local伪指令只声明该符号在作用域中是local的,但它没有定义该符号。

.long expression1, expression2, ..., expressionN

.long伪指令为当前段expression1 ~ expressionN中的每个expression生成一个长整数(32位,二进制的补码值)。每个expression必须为32位的值,并且必须为整数。.long指令对bss段无效。

.popsection

.popsection伪指令弹出段堆栈的栈顶,并继续处理弹出的段。

.previous

.previous伪指令继续处理之前的段。

.pushsection section

.pushsection伪指令将指定的section压入section堆栈并切换到另一个段。

.quad expression1, expression2, ..., expression

.quad伪指令在当前段中为expression1 ~ expressionN中的每个expression生成一个初始化的字(64位,二进制的补码值)。每个expression必须是64位的值,并且必须位整数。.quad伪指令对bss部分无效。

.rel symbol@ type

.rel伪指令为指定的symbol生成特定type的重定位表项。

.section section, attributes

.section伪指令将section设为当前段。如果section 不存在,那么就会创建一个新的拥有特定名字和attributes的段。如果section是一个未保留的段,那么第一次使用.section伪指令来指定section时必须包含attributes

.set symbol, expression

.set伪指令将expression的值赋给symbolexpression可以是计算结果为数值的任何合法表达式。

.size symbol, expr

声明symbol大小为expr。expr必须为绝对表达式。

.skip integer, value

当我们在为任何数据段生成值时,.skip伪指令会跳过integer个字节,或者(可选地)用指定的value填充integer个字节。

.sleb128 expression

.sleb128伪指令从expression中生成一个带符号的LEB128(Little Endian Base 128)的数字。

.string "string"

.string伪指令将string中的字符放置到目标模块的当前位置,并以一个空字符(‘\0’)结束该stringstring必须包含在双引号(")(ASCII 0x22)。.string伪指令对bss段无效。

.symbolic symbol1, symbol2, ..., symbol

.symbol指令声明列表symbol1~symbolN中的每个symbol都有符号链接器作用域。对动态模块中的symbol的所有引用都绑定到该模块中的定义。在模块之外,symbol被视为全局的。

.tbss

.tbss伪指令将当前段设为tbss段。tbss部分包含未初始化的TLS数据对象,该对象将由运行时连接器初始化为0。

.tcomm

.tcomm伪指令定义了一个TLS普通块。

.tdata

.tdata指令将当前段设为tdata段。Tdata段包含初始化的TLS数据对象的初始化image。

.text

.text指令将当前段定义为text段,一般是代码段。

.type symbol[, symbol, ..., symbol], type[, visibility]

声明symboltypetype 可以是如下类型:

#object #tls_object #function #no_type

Visibility 可以其下面的值:

#hidden #protected #eliminate #singleton #exported #internal

.uleb128 expression

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

.value expression1, expression2, ..., expression

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

.weak symbol1, symbol2, ..., symbolN

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

.zero expression

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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表