GNU 汇编语法
编写汇编的过程中,其指令、寄存器名等可以全部使用大写,也可以全部使用小写,但是不能大小写混用。
1. 汇编语句的格式
label: instruction @ comment
label
即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意 label 后面的" : ",任何以" : "结尾的标识符都会被识别为一个标号。在汇编语言中,_start
是一个特殊的标号(label),_start
是程序执行的入口点,程序执行的起始地址,当程序加载到内存中时,处理器会跳转到_start
标签所在的地址,从这里开始执行代码。_start
主要作用是初始化程序运行环境,比如栈、全局变量、动态链接环境,然后跳转到用户定义的main
函数执行。instruction
即指令,也就是汇编指令或伪指令@
表示后面的是注释,跟 C 语言的“/*”和“*/”一样,在 GNU 汇编文件中也可以使用“/*”和“*/”来注释comment
就是注释内容
2. 预定义段名
.section
伪操作,用于指定汇编代码或数据应当放入哪个段, 或者定义自己的自定义段,每个段以段名开始,以下一段名或者文件结尾结束
.text
表示代码段
.data
初始化的数据段
.bss
未初始化的数据段
.rodata
只读数据段
.byte
定义单字节数据,比如.byte 0x12
.equ
赋值语句,比如.equ num,0x12
,表示num=0x12
.short
定义双字节数据,比如.short 0x1234
.long
定义一个 4字节数据,比如.long 0x12345678
.align
数据字节对齐,比如.align4
表示4字节对齐
.end
表示源文件结束
.global
定义一个全局符号,比如.global _start
.section .data // 数据段
message:
.asciz "Hello, World!" // 字符串常量
.section .text // 代码段
.global _start // 声明程序入口
_start:
mov eax, 4 // 系统调用号,写操作
mov ebx, 1 // 文件描述符(1是标准输出)
lea ecx, [message] // 将字符串地址加载到 ecx
mov edx, 13 // 要写入的字节数
int 0x80 // 调用内核
mov eax, 1 // 系统调用号,退出程序
xor ebx, ebx // 返回值为0
int 0x80 // 调用内核
Cortex-A7 常用汇编指令
处理器内部数据传输指令
数据传输常用的指令有三个: MOV、 MRS 和 M