07_ARMv8_汇编器Using as
https://github.com/carloscn/blog/issues/19
07_ARMv8_汇编器Using as
关键字
伪指令
汇编宏
1 关键字
1.1 label 和 symbol
代表它所在的地址,也可以当做变量或者符号。
全局symbol:
.global xxxxx
局部symbol (label):在函数内使用,开头以0-99直接的数字为标号名,通常和
b
指令结合使用。f
:指示编译器向前搜索b
:指示编译器向后搜索
1.2 伪指令
对齐伪指令.align
声明align后面的汇编必须从下一个能被2^n整除的地址开始分配。ARM64系统中,第一个参数表示2^n大小。
Define: .align [abs-expr[, abs-expr[, abs-expr]]
string1的地址必须是能被8整除的。
数据定义伪指令
.byte
把8位数当做数据插入到汇编当中.hword
把16位数当成数据插入到汇编当中.long
和.int
:把32位数当成数据插入到汇编当中.quad
:64位数.float
:浮点数.ascii "string"
:把string当做数据插入到汇编当中,ascii未操作定义字符串需要自行插入‘\0’.asciz "string"
: 不需要手动插入'\0'的string。
执行伪指令
.rept
:重复执行伪指令.equ
和.set
:赋值操作.equ symbol, expression
函数相关伪指令
.gloabl
:定义一个全局的符号,可以为变量可以为函数.include
:引用头文件.if, .else, .endif
:控制语句.ifdef symbol
:判断symbol是否定义.ifndef symbol
:未定义.ifc string1, string2
:判断两个字符串是否相等.ifeq expression
: 判断expression的值是否为0.ifeqs string1, string2
: 等同于ifc.ifge expression
:判断值是否≥0.ifle expression
:判断值是否≤0.ifne expression
:判断值是否不为0
段相关的伪指令
.section
.section name, "flag"
flag就是ELF文件中的adewxMSGT?可以查看文档,我们在02_ELF文件结构_浅析内部文件结构中描述了ELF的段的结构,可以参考。
b
bss section (uninitialized data)
n
section is not loaded
w
writable section
d
data section
r
read-only section
x
executable section
If no flags are specified, the default flags depend upon the section name. If the section name is not recognized, the default will be for the section to be loaded and writable.
If the optional argument to the
.section
directive is not quoted, it is taken as a subsegment number (see section Sub-Sections).For ELF targets, the
.section
directive is used like this:The optional flags argument is a quoted string which may contain any combintion of the following characters:
a
section is allocatable
w
section is writable
x
section is executable
例子:把符号映射到.idmap.text段,属性为awx
.pushsection
.pushsection
:下面的代码push接到指定的section当中。
.popsection
.popsection
:结束push
两个伪指令需要成对使用,仅仅是把pushsection和popsection的圈出来的代码复制链接到指定的section中,其他代码还在原来的section。
这个例子就是把my_sub_func从 .text段里面提取出来然后链接到.idmap.text里面。
实验
【题目】
使用汇编的数据定义伪指令,可以实现表的定义,例如Linux内核使用.quad和.asciz定义了一个kallsyms的表,地址和函数名的对应关系:
0x800800 -> func_a
0x800860-> func_b
0x800880-> func_c
请在汇编里定义一个类似的表,在C语言中根据函数的地址查找表,并且正确打印函数的名称。这个非常常用,我们在调试死机状态的时候可以根据这样的方法把函数的调用名称和栈指针打出来,方便我们调试。
2 汇编宏
2.1 定义
.macro macname macargs ...
.endm
示例1:
在kernel里面有这样的代码:
最后结果是b el1_irq
2.2 实验
在汇编文件通过如下两个函数:
long add_1(a, b)
long add_2(a, b)
然后写一个宏定义
.macro add a, b, label
#这里调用add_1或者add_2函数,label等于1或者2
.endm
Ref
最后更新于