欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编调 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));
}