伪操作
不会生成代码,只是告诉编译器在编译阶段怎么编译
@.global symbol
声明symbol为全局变量,在其他.s文件中可以说直接使用
@.local symbol
声明symbo为局部变量,仅能在此.s文件中使用
@.equ DATA 0XFF
类似于声明的作用,定义DATA 即为0XFF
@.macro FUNC
@MOV R1,#1
@MOV R2,#2
@.endm
@FUNC
@.if 0
@MOV R1,#1
@MOV R2,#2
@.endif
@条件编译
@.rept
@MOV R1,#1
@MOV R2,#2
@.endr
@语句重复三次
@.weak symbol
@.weak func
@弱化一个符号,编译器不对其报错
@MOV R1,#1
@.word 0xffffffff
@MOV R2,#2
@在当前地址申请一个字的空间并将其初始化
@MOV R1,#1
@.byte 0xff
@.align 2 -----对齐的伪操作,告诉编译器后续的代码2的2次方对齐,如果没有该操作编译器会报错,因为每一条指令应该从4的倍数地址开始
@MOV R2,#2
@在当前地址申请一个字节的空间并将其初始化
@.space 12,0x12
@在当前地址申请任意字节的空间并将其初始化
C和汇编混合编程
在哪种语言环境下就应该符合该语言的规则
在汇编中c语言的函数当标号使用
在c语言中把汇编语言的标号当函数处理
1.汇编语言调用C语言
@MOV R1,#1
@MOV R2,#2
@BL FUNC_C --FUNC_C定义在.C文件中
@MOV R3,#3
2.C语言调用汇编语言
@.global FUNC_ASM
FUNC_ASM:
MOV R4,#4
MOV R5,#5
3.C内联汇编
需先声明asm按照下面格式编写
ATPCS协议主要内容:
1.规定了栈的种类,使用满减栈FD
2.规定了寄存器的使用
R15用作程序计数器,不能作其他用途
R14用作链接寄存器,不能作其他用途
R13用作栈指针,不能作其他用途
当函数的参数不多于4个时使用R0-R3传递,当函数的参数多于4个时,多出的部分用栈传递,函数的返回值使用R0传递
其它寄存器主要用于存储局部变量
3.规定了参数传递规则
根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规则是不同的.
(1)参数个数可变的子程序参数传递规则
对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数. 在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。然后,依次将各名字数据传送到寄存器R0,R1,R2,R3; 如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈. 按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递.
(2)参数个数固定的子程序参数传递规则
对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同,如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递: 各个浮点参数按顺序处理;为每个浮点参数分配FP寄存器;分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器.第一个整数参数通过寄存器R0~R3来传递,其他参数通过数据栈传递.
4.子程序结果返回规则
1.结果为一个32位的整数时,可以通过寄存器R0返回.
2.结果为一个64位整数时,可以通过R0和R1返回,依此类推.
3.结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回. 4.结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回. 5.对于位数更多的结果,需要通过调用内存来传递.