浅谈C语言与汇编语言混合编程

1、ATPCS/AAPCS协议:

(1)C和汇编参数传递
规定参数在4个以内,依次对应r0-r3寄存器
参数在4个以外,用栈传递
(2)返回值传递
规定使用r0
(3)使用栈类型
规定使用满减栈
*栈的操作类型浅谈C语言与汇编语言混合编程_第1张图片
①空增栈
浅谈C语言与汇编语言混合编程_第2张图片
②空减栈
浅谈C语言与汇编语言混合编程_第3张图片
③满增栈
浅谈C语言与汇编语言混合编程_第4张图片
④满减栈
浅谈C语言与汇编语言混合编程_第5张图片

2、互相调用

(1)汇编调用C
bl +函数名称

void func(void)
   {}
_start:
   mov r0, #1
    mov r1, #2
    bl func
    mov r2, #3
	.end

调转现象:
浅谈C语言与汇编语言混合编程_第6张图片
浅谈C语言与汇编语言混合编程_第7张图片
(2)C调用汇编
a、文件和文件之间跳转
汇编文件:
满足汇编代码外部调用声明:.global
C文件:
满足C语言调用其他外部C函数声明:函数声明
b、在C语言中专门内嵌一个特殊函数:asm
GNU编译环境下:
asm volatitle {
“” @//汇编代码
:output @//输出寄存器列表
:input @//输入寄存器列表
:change @//修改的寄存器列表
}
说明:
1)如果害怕编译器优化内嵌汇编代码,在__asm__后加__volatitle__防止编译器优化
2)汇编代码必须放在一个"“中间,并且”"中间不能有enter回车换行,只能用\n换行,\t为指令格式对齐,编译器不会检查内嵌汇编语法,而是直接交给汇编器完成
3)输出寄存器列表:ASM汇编—>C语言
4)输入寄存器列表:C语言—>ASM汇编
5)告诉编译器你修改过的寄存器,编译器会自动把保存这些寄存器值的指令加在内嵌汇编之前,再把恢复寄存器值的指令加在内嵌汇编之后

_start:
  mov r0, #1
    mov r1, #2
    bl func
    mov r2, #3
	
    
    .global func_asm
func_asm:
    mov r0, #1
    add r0, #1
    mov pc, lr 
   
 
    .end
void func_asm(void);


void func(void)
{
    func_asm();
}
  

   

一次跳转:
浅谈C语言与汇编语言混合编程_第8张图片
二次跳转:
浅谈C语言与汇编语言混合编程_第9张图片

你可能感兴趣的:(ARM)