[经验分享] 调用汇编代码的三种方法

[复制链接]
 楼主| sdlls 发表于 2024-7-15 11:40 | 显示全部楼层 |阅读模式
在以下三个情况下, 我们可能会需要将汇编代码嵌入到我们开发的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);
1
编译器会自动生成REV16指令, 极大的提高了程序的效率, 所以大部分情况下, 我们并不需要在Keil中特意的使用汇编代码.


您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

5173

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

55

主题

5173

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部