汇编调 C ,C 调汇编,嵌入汇编和内联汇编

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值