打印
[经验分享]

调用汇编代码的三种方法

[复制链接]
785|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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中特意的使用汇编代码.


使用特权

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

本版积分规则

32

主题

4737

帖子

1

粉丝