在Keil C51中调用汇编代码的三种方法

在以下三个情况下, 我们可能会需要将汇编代码嵌入到我们开发的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中特意的使用汇编代码.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值