关于在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
__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只能使用内嵌汇编的方式,也就是第二种方式。