汇编调 C ,C 调汇编,嵌入汇编和内联汇编
程序员文章站
2022-06-17 20:30:21
...
一,汇编调用 C
C 语言函数
int my_add_c(int x1, int x2, int x3, int x4)
{
return (x1 + x2 + x3 + x4);
}
汇编函数
MOVS R0, #0x1; 第一个参数 x1
MOVS R1, #0x2; 第二个参数 x2
MOVS R2, #0x3; 第三个参数 x3
MOVS R3, #0x4; 第四个参数 x4
IMPORT my_add_c
BL my_add_c; 调用 my_add_c 函数,结果位于 R0 中
也可以使用 _cpp 关键字代替 IMPORT
MOVS R0, #0x1; 第一个参数 x1
MOVS R1, #0x2; 第二个参数 x2
MOVS R2, #0x3; 第三个参数 x3
MOVS R3, #0x4; 第四个参数 x4
BL _cpp(my_add_c); 调用 my_add_c 函数,结果位于 R0 中
在访问 C 或 C++ 编译时变量表达式时,建议使用 _cpp 关键字,其他工具链需要使用的伪指令可能会有所不同。
对于 GNU 工具链,可以使用 ".global" 使某个标号对其他文件可见。
二,C 调汇编函数
汇编函数:
EXPORT My_Add
My_Add FUCNTION
ADDS R0, R0, R1
ADDS R0, R0, R2
ADDS R0, R0, R3
BX LR;返回结果位于 R0 中
ENDFUNC
C 代码
extern int My_Add(int x1, int x2, int x3, int x4)
int y;
......
y = My_Add(1, 2, 3, 4); /* 调用 My_Add 函数 */
三、嵌入汇编
_asm int My_Add(int x1, int x2, int x3, int x4)
{
ADDS R0, R0, R1
ADDS R0, R0, R2
ADDS R0, R0, R3
BX LR;返回结果位于 R0 中
}
在嵌入汇编代码中,可以利用 _cpp 关键字引入数据符号或地址值。例如:
_asm void function_A(void)
{
PUSH {R0-R2,LR}
BL _cpp(my_test_function);调用 C 函数
LDR R0, = _cpp(&x);得到变量 x 的地址
LDR R0, [R0]
LDR R1, = _cpp(&y);得到变量 y 的地址
LDR R1, [R1]
LDR R2, = _cpp(my_test_function);引入函数的地址
BLX R2;调用 C 函数
POP {R0-R2,LR}
}
四、内联汇编
void set_status(void)
{
int val;
asm volatile ("mrs %0,CPSR" : "=r" (val));
val &=~0x80;
asm volatile ("msr CPSR_c ,%0" : : "r" (val));
}