打印
[微控制器/MCU]

小窍门:Cortex-M3在MDK C语言中嵌入汇编语言的方法

[复制链接]
8541|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Massif123|  楼主 | 2010-2-3 13:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在传统的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这些寄器的操作.

相关帖子

沙发
bit6019| | 2010-2-17 22:22 | 只看该作者
这样啊,学习了

使用特权

评论回复
板凳
年轻不在| | 2010-2-18 19:05 | 只看该作者
学习了

使用特权

评论回复
地板
北京户口| | 2010-2-18 20:12 | 只看该作者
等待第二种方法面试!

使用特权

评论回复
5
xidaole| | 2016-5-19 09:27 | 只看该作者
牛牛!!现在还有没有人做纯汇编的。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

276

帖子

1

粉丝