-
long exchange(long *xp, long y)
-
{
-
long x = *xp;
-
*xp = y;
-
return x;
-
}
arm-linux-gcc -O2 load.c -S
-
exchange:
-
@ Function supports interworking.
-
@ args = 0, pretend = 0, frame = 0
-
@ frame_needed = 0, uses_anonymous_args = 0
-
@ link register save eliminated.
-
mov r3, r0 #r0的值存入r3
-
ldr r0, [r0, #0] #把r0地址指向的值存入r0,r0此时又作为函数的返回值
-
str r1, [r3, #0] #*x = y;
-
bx lr #函数返回
1. 子程序通过寄存器R0~R3来传递参数. 这时寄存器可以记作: A0~A3 , 被调用的子程序在返回前无需恢复寄存器R0~R3的内容,
同时,R0也被用来传递函数的返回值
2. 在子程序中,使用R4~R11来保存局部变量,这时寄存器R4~R11可以记作: V1~V8 .如果在子程序中使用到V1~V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作.在THUMB程序中,通常只能使用寄存器R4~R7来保存局部变量.
3.寄存器R12用作子程序间scratch寄存器,记作ip; 在子程序的连接代码段中经常会有这种使用规则.
4. 寄存器R13用作数据栈指针,记做SP,在子程序中寄存器R13不能用做其他用途. 寄存器SP在进入子程序时的值和退出子程序时的值必须相等.
5. 寄存器R14用作连接寄存器,记作lr ; 它用于保存子程序的返回地址,如果在子程序中保存了返回地址,则R14可用作其它的用途.
6. 寄存器R15是程序计数器,记作PC ; 它不能用作其他用途.
7. ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的.
阅读(279468) | 评论(0) | 转发(0) |