GNU汇编
注:所有关键字都以‘.’开头
一、基本
.arch ISA 告诉汇编器当前汇编文件的指令集架构(Instruction Set Architecture)
{.section} .section_name{,"flags"} 声明一个段的开始,以下一个段的开始或文件尾结束
section_name:
.text 代码段
.data 数据段
.rodata 只读数据段
.bss 未初始化数据段,bss段可以不声明
.mysection 自定义段
flags:
a 可分配段
w 可写段
x 可执行段
.code number_of_bits 按number_of_bits设置ARM(32)或Thumb(16)指令
.global symbol 符号导出,C默认是导出,不导出要加static,汇编默认是不导出
.align power_of_2{,fill_value{,max_padding}}
对齐到power_of_2字节,用fill_value或 0(默认值)来填充对齐
如需要填充的字节数大于max_padding,则对齐不会发生
alias_name .req register 为register取一个别名,如: aa .req r0, bb .req aa
.include "filename" 等于 C的#include "filename"
.err 以一个错误导致汇编结束(是编译文件时结束而不时运行时)
.end 表示一个汇编文件的结束,剩下的部分可以加注释,一般省略
# expr注释 只能放在行的开头,注释至行尾
@ 注释 可放在行的任意位置,注释至行尾
label_name: label_name表示当前的地址
二、数据类型
.ascii "string" 定义字符串变量,不会在string后面自动加 ‘\0’
.asciz "string" 定义字符串变量,会自动加‘\0’
.byte byte1{,byte2}... 定义char型变量(1字节),如有多个数据则是定义char数组
.hword hword1{,hword2}... 定义short型变量(2字节),如有多个数据则是定义short数组
.word word1{,word2}... 定义int型变量(4字节),如有多个数据则是定义int数组
.space number_of_byte{,fill_byte} 定义number_of_byte大小的空间,以fill_byte填充,fill_byte默认是 0
注:以上定义的数据类型都是当前段的全局变量 ,还有其它类似的数据类型,如:.string == .asciz, .int == .word,...
.comm name,number_of_byte{,element_size}
在bss段定义number_of_byte大小的空间,name是该空间的起始地址
element_size只是说明每个元素的大小,可以不要
三、条件分支
.if 定义一个条件代码块,以.endif结束
.ifdef symbol """
.ifndef symbol """
.elseif expr 使用在.if和.endif之间
.else 使用在.if和.endif之间
.endif 条件代码块的结束
四、循环
.irp param {,val1}{,val2}{,val3}... 开启一个循环的代码块,有多少个val就循环多少次,代码块中用\param来代替val 和shell的for i in类似
.rept number_of_times 开启一个循环的代码块,循环number_of_times次
.irp i r1,r2,r3
mov r0,\i
.endr
.rept 10
mov r0,r1
.endr
五、宏
.equ symbol_name,value 等于C的#define symbol_name value
.set variable_name,value 等于.equ
.macro name {arg1}{,arg2}{,arg3}... 宏函数
.exitm 退出宏函数
.if \a > \b
mov r0,#\a
.elseif \b > 0
mov r0,#\b
.else
exitm
.endif
.endm
注:所有关键字都以‘.’开头
一、基本
.arch ISA 告诉汇编器当前汇编文件的指令集架构(Instruction Set Architecture)
{.section} .section_name{,"flags"} 声明一个段的开始,以下一个段的开始或文件尾结束
section_name:
.text 代码段
.data 数据段
.rodata 只读数据段
.bss 未初始化数据段,bss段可以不声明
.mysection 自定义段
flags:
a 可分配段
w 可写段
x 可执行段
.code number_of_bits 按number_of_bits设置ARM(32)或Thumb(16)指令
.global symbol 符号导出,C默认是导出,不导出要加static,汇编默认是不导出
.align power_of_2{,fill_value{,max_padding}}
对齐到power_of_2字节,用fill_value或 0(默认值)来填充对齐
如需要填充的字节数大于max_padding,则对齐不会发生
alias_name .req register 为register取一个别名,如: aa .req r0, bb .req aa
.include "filename" 等于 C的#include "filename"
.err 以一个错误导致汇编结束(是编译文件时结束而不时运行时)
.end 表示一个汇编文件的结束,剩下的部分可以加注释,一般省略
# expr注释 只能放在行的开头,注释至行尾
@ 注释 可放在行的任意位置,注释至行尾
label_name: label_name表示当前的地址
二、数据类型
.ascii "string" 定义字符串变量,不会在string后面自动加 ‘\0’
.asciz "string" 定义字符串变量,会自动加‘\0’
.byte byte1{,byte2}... 定义char型变量(1字节),如有多个数据则是定义char数组
.hword hword1{,hword2}... 定义short型变量(2字节),如有多个数据则是定义short数组
.word word1{,word2}... 定义int型变量(4字节),如有多个数据则是定义int数组
.space number_of_byte{,fill_byte} 定义number_of_byte大小的空间,以fill_byte填充,fill_byte默认是 0
注:以上定义的数据类型都是当前段的全局变量 ,还有其它类似的数据类型,如:.string == .asciz, .int == .word,...
.comm name,number_of_byte{,element_size}
在bss段定义number_of_byte大小的空间,name是该空间的起始地址
element_size只是说明每个元素的大小,可以不要
三、条件分支
.if 定义一个条件代码块,以.endif结束
.ifdef symbol """
.ifndef symbol """
.elseif expr 使用在.if和.endif之间
.else 使用在.if和.endif之间
.endif 条件代码块的结束
四、循环
.irp param {,val1}{,val2}{,val3}... 开启一个循环的代码块,有多少个val就循环多少次,代码块中用\param来代替val 和shell的for i in类似
.rept number_of_times 开启一个循环的代码块,循环number_of_times次
.endr 结束.irp和.rept的循环
例:
mov r0,\i
.endr
.rept 10
mov r0,r1
.endr
五、宏
.equ symbol_name,value 等于C的#define symbol_name value
.set variable_name,value 等于.equ
.macro name {arg1}{,arg2}{,arg3}... 宏函数
.exitm 退出宏函数
.endm 宏函数结束
例:
.if \a > \b
mov r0,#\a
.elseif \b > 0
mov r0,#\b
.else
exitm
.endif
.endm