伪操作
伪操作:不会生成代码,只是在编译之前告诉编译器怎么编译
.global symbol
@ 将symbol声明成全局符号
.local symbol
@ 将symbol声明成局部符号
.equ DATA, 0xFF
MOV R1, #DATA
.macro FUNC
MOV R1, #1
MOV R2, #2
.endm
FUNC
.if 0
MOV R1, #1
MOV R2, #2
.endif
.rept 3
MOV R1, #1
MOV R2, #2
.endr
.weak symbol
@ 弱化一个符号,即告诉编译器即便没有这个符号也不要报错
.weak func
B func
.word VALUE
@在当前地址申请一个字的空间并将其初始化为VALUE
MOV R1, #1
.word 0xFFFFFFFF
MOV R2, #2
.byte VALUE
@ 在当前地址申请一个字节的空间并将其初始化为VALUE
MOV R1, #1
.byte 0xFF
.align N
@ 告诉编译器后续的代码2的N次方对其
.align 4
MOV R2, #2
.arm
@ 告诉编译器后续的代码是ARM指令
.thumb
@ 告诉编译器后续的代码是Thumb指令
.text
@ 定义一个代码段
.data
定义一个数据段
.space N, VALUE
@ 在当前地址申请N个字节的空间并将其初始化为VALUE
MOV R1, #1
.space 12, 0x12
MOV R2, #2
@ 不同的编译器伪操作的语法不同
C和汇编的混合编程
C语言和汇编语言混合编程的原则:在哪种语言环境下符合哪种语言的语法规则;
1、在汇编中将C语言中的函数当做标号来处理;
2、在C语言中将汇编语言的标号当做函数处理;
1. 方式一:汇编语言调用(跳转)C语言
MOV R1, #1
MOV R2, #2
BL func_c
MOV R3, #3
2. 方式二:C语言调用(跳转)汇编语言
.global FUNC_ASM
FUNC_ASM:
MOV R4, #4
MOV R5, #5
C内联(内嵌)汇编
ATPCS协议(ARM-THUMB Procedure Call Standard)
ATPCS协议主要内容
栈的种类
使用满减栈
寄存器的使用
2.1 R15用作程序计数器,不能作其他用途
2.2 R14用作链接寄存器,不能作其他用途
2.3 R13用作栈指针,不能作其他用途
2.4 当函数的参数不多于4个时使用R0-R3传递,当函数的参数多于4个时,多出的部分用栈传递
2.5 函数的返回值使用R0传递
2.6 其它寄存器主要用于存储局部变量