c与汇编的混合编程

场景1、c内嵌汇编
$vim main.c
#include <stdio.h>
int main(int argc, char** argv) {
    char a,b,c;
    a = 1;
    b = 2;

/*形式1*/
    asm [volatile] {  //不同的编译器可能是__asm或__asm__,volatile同理
        [汇编代码块]
    }
/*形式2*/
    asm volatile ("mrc p14, 0, %0, c0, c1, 0" : "=r" (status));

    c = a+b;
    return 0;
}

注:内嵌汇编的限制
1.汇编程序跳转只能用B或BL指令,不能直接给PC寄存器赋值
2.在使用物理寄存器时不要使用复杂的c表达式,避免寄存器冲突
3.避免直接使用寄存器R0~R3,R12~R14;
因为在计算表达式时,R0~R3,R12,R14可能用于子程序调用;
而R12,R13可能被编译器用来存放中间编译结果。

场景2、c调用汇编
$vim func.s
EXPORT my_func
my_func
[汇编代码块]

$vim main.c
extern cahr my_func(char par1, char par2);
int main(int argc, char** argv) {
    char a,b,c;
    a = 1;
    b = 2;
    c = my_func(a, b);   //参数将传给寄存器R0~R3或栈
    return 0;
}

场景3、汇编调用c
$vim func.c
cahr my_func(char a, char b) {
    char c = 0;
    c = a + b;
    return c;
}

$vim init.s
IMPORT my_func
MOV R0,#1   //传参
MOV R1,#2   //传参
BL my_func  //跳转

注:无论是c调用汇编还是汇编调用c,
函数传参默认使用寄存器R0~R3,多于4个的参数使用栈,函数返回值放在寄存器R0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值