目录
10.1伪操作
C语言中,带;的称为语句,一般可以编译。带#的称为预处理指令,预处理时处理,不参与编译。
伪操作类似于带#
@ 3.伪操作:不会生成代码,只是在编译之前告诉编译器怎么编译
@ GNU的伪操作一般都以‘.’开头
@ .global symbol
@ 将symbol声明成全局符号
@ .local symbol
@ 将symbol声明成局部符号
@ .equ DATA, 0xFF
@ 类似于宏定义DATA代表0xFF
@ MOV R1, #DATA
@ .macro FUNC @封装开头
@ MOV R1, #1
@ MOV R2, #2
@ .endm @封装结尾
@ FUNC @封装结尾
@ .if 0 @if开头
@ MOV R1, #1
@ MOV R2, #2
@ .endif @if结尾
@.rept 3 @重复编译x遍
@ 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 @ 在当前地址申请12个字节的空间并将其初始化为0x12
@ MOV R2, #2
@ 不同的编译器伪操作的语法不同
10.2C和汇编的混合编程
@ C和汇编的混合编程
@ C和汇编的混合编程原则:在哪种语言环境下符合哪种语言的语法规则
@ 1. 在汇编中将C中的函数当做标号处理
@ 2. 在C中将汇编中的标号当做函数处理
@ 3. 在C中内联的汇编当做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
@ 3. C内联(内嵌)汇编
10.3ATPCS协议
ATPCS协议(ARM-THUMB Procedure Call Standard)
ATPCS协议解决不同的编译器在编代码时做到兼容
1.栈的种类
1.1 使用满减栈
2.寄存器的使用
2.1 R15用作程序计数器,用于存储程序的指针,不能作其他用途
2.2 R14用作链接寄存器,用于存储返回地址,不能作其他用途
2.3 R13用作栈指针,只能用于存储栈指针,不能作其他用途
2.4 R0-R3:当函数的参数不多于4个时使用R0-R3传递,当函数的参数多于4个时,多出的部分用栈传递
2.5 函数的返回值使用R0传递
2.6 其它寄存器主要用于存储局部变量
10.4ARM体系结构总结
作业
1.简述ATPCS(ARM-THUMB Procedure Call Standard)协议的主要内容是什么
主要内容包括以下几个方面:
1. 寄存器使用规范:ATPCS规定了在函数调用过程中哪些寄存器需要被保存,哪些可以被修改,哪些需要被恢复。具体来说,ATPCS规定了R0-R3、R12、lr、pc寄存器需要被保存,其他寄存器可以被修改。
2. 参数传递规范:ATPCS规定了函数参数的传递方式,即前四个参数通过R0-R3寄存器传递,其他参数通过栈传递。
3. 栈使用规范:ATPCS规定了栈的使用方式,包括栈的增长方向、栈帧的组成、栈帧的大小等。 4. 返回值规范:ATPCS规定了函数返回值的传递方式,即通过R0寄存器传递。
ATPCS是ARM-THUMB平台上的一种标准,它的主要目的是为了确保不同的编译器和库之间能够正确地进行函数调用和参数传递,从而实现代码的可移植性。