关于在ARM中(MDK下)C与汇编混合编程的问题

关于在ARM中(MDK下)C与汇编混合编程的问题 

主要是:MDK下的内联汇编和内嵌汇编

主要来源于:http://bbs.21ic.com/icview-156494-1-1.html ([微控制器/MCU]小窍门:Cortex-M3在MDK C语言中嵌入汇编语言的方法)

  ============================================================

*************************************************************

在传统的ARM处理器中(ARM7/ARM9),如果要在C程式中嵌入汇编,可以有两种方法 

内联汇编的方  方法如下:
int PCBsheji(int i)

{

  int r0; 

  __asm 

  {

ADD r0, i, 1

    EOR i, r0, i

  }

  return i;

}

在汇编语句可以直接做用C语言中的变量.编译器会对这些代码进一步优化,函数返回也由编译器自动给出,但是有些限制就是不能对SP,LR,PC等直接操作,或者会出错,并且只能是ARM状态的代码.

 

使用嵌入式汇编的方式  示例代码如下

#include <stdio.h>

__asm void my_strcpy(const char *src, char *dst)

{    

loop LDRB  r2, [r0], #1  //R0保存第一个参数

STRB  r2, [r1], #1  //R1保存第二个参数

CMP   r2, #0

BNE   loop

BLX    lr  //返回指令须要手动加入

}

int main(void)

{

  const char *a = "Hello world!";

  char b[20];

  my_strcpy (a, b);

  printf("Original string: '%s'\n", a);

  printf("Copied   string: '%s'\n", b);

  return 0;

}

嵌入式汇编的好处就是它看起来更像是一个函数,它的第一个参数放在R0,第二个参数放在R1,以此类推.
    在嵌入式汇编的代码中,只能够使用汇编代码,如果须要访问C程式中的变量,可以使用_cpp关键字,编译器自动为这些C的变量加上IMPORT引用;

 LDR r0, =__cpp(&some_variable)  

   LDR r1, =__cpp(some_function)  

   BL  __cpp(some_function)

   MOV r0, #__cpp(some_constant_expr) 

编译器不会对嵌入式汇编做优化,也不会自动加入函数反回等,所以可以在嵌入式汇编程式中完成绝大部分纯汇编文件才能完成的工作,比如说对SP这些寄器的操作.
    

由于内联式汇编只能在ARM状态中进行,Cortex-M3只支持Thumb-2,所以Cortex-M3只能使用内嵌汇编的方式,也就是第二种方式

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值