在以下三个情况下, 我们可能会需要将汇编代码嵌入到我们开发的Keil C程序中.
- 有一段现成的汇编代码, 只需少量修改便可投入使用, 减少工作量
- 目前的程序需要提高速度, 如中断处理代码段
- 需要直接操作寄存器或特定的IO设备.
那么, 我们怎么实现在C代码中融合汇编代码呢? 有以下三种方式:
一、使用内联汇编代码
具体方式
__asm
{
/*Put your assembly here*/
}
实例如下
int my_char=65281;
int my_char_rev;
__asm
{
REV16 my_char_rev, my_char
}
printf("%d\n",my_char);
printf("%d",my_char_rev);
注意
内联汇编器不提供对 ARM 处理器的物理寄存器的直接访问。如果将 ARM 寄存器名称用作内联汇编指令中的操作数,则它将成为对同名变量的引用,而不是物理 ARM 寄存器。
二、使用汇编宏
具体方式
#pragma ASM
; /*Put your assembly here*/
#pragma ENDASM
注意
此方法仅适用于C51
三、在C程序中直接调用汇编函数
具体方式
主函数如下, 注意调用的汇编函数需要用extern关键字
#include "HeadFile.h"
extern void my_assembly(void);
int main()
{
my_assembly();
return 0;
}
新建一个my_assembly.s文件
NAME MY_ASSEMBLY
?PR?my_assembly?MY_ASSEMBLY SEGMENT CODE
PUBLIC my_assembly
RSEG ?PR?my_assembly?MY_ASSEMBLY
my_assembly:
; do something
END
添加my_assembly.s进入工程中, 即可在工程中调用该汇编函数
注:
目前, Keil的编译器已经比较智能, 能够将某些C代码翻译成特定的汇编指令以提高代码密度及程序效率, 如此大小端转换函数:
b = ((a & 0x00ff) << 8) | ((a & 0xff00) >> 8);
编译器会自动生成REV16指令, 极大的提高了程序的效率, 所以大部分情况下, 我们并不需要在Keil中特意的使用汇编代码.