0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

哪几种情况中必须使用内联汇编或嵌入型汇编

电子设计 来源:电子设计 作者:电子设计 2020-12-24 12:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

ARM系列文章,请点击以下汇总链接:

《从0学arm合集》

一、gcc 内联汇编

内联汇编即在C中直接使用汇编语句进行编程,使程序可以在C程序中实现C语言不能完成的一些工作,例如,在下面几种情况中必须使用内联汇编或嵌入型汇编。

程序中使用饱和算术运算(Saturating Arithmetic)程序需要对协处理器进行操作在C程序中完成对程序状态寄存器的操作格式:__asm__ __volatile__("asm code"
:output
:input
:changed registers);

asm或__asm__开头,小括号+分号,括号内容写汇编指令。指令+ 用双引号引上。

参数

「asm code」主要填写汇编代码:


"mov r0, r0 "
"mov r1,r1 "
"mov r2,r2"

「output(asm->C)」用于定义输出的参数,通常只能是变量:

:"constraint" (variable)
"constraint"用于定义variable的存放位置:
r 表示使用任何可用的寄存器
m 表示使用变量的内存地址
+ 可读可写
= 只写
& 表示该输出操作数不能使用输入部分使用过的寄存器,只能用"+&"或"=&"的方式使用

「input(C->asm)」用于定义输入的参数,可以是变量也可以是立即数:

:"constraint" (variable/immediate
"constraint"用于定义variable的存放位置:
r 表示使用任何可用的寄存器(立即数和变量都可以)
m 表示使用变量的内存地址
i 表示使用立即数

Note:

使用__asm__和__volatile__表示编译器将不检查后面的内容,而是直接交给汇编器。如果希望编译器为你优化,__volatile__可以不加没有asm code也不能省略""没有前面的和中间的部分,不可以相应的省略:没有changed 部分,必须相应的省略:最后的;不能省略,对于C语言来说这是一条语句汇编代码必须放在一个字符串内,且字符串中间不能直接按回车换行,可以写成多个字符串,注意中间不能有任何符号,这样就会将两个字符串合并为一个指令之间必须要换行,还可以使用 使指令在汇编中保持整齐举例

例1:无参数,无返回值这种情况,output和input可以省略:

asm
( //汇编指令
"mrs r0,cpsr "
"bic r0,r0,#0x80 "
"msr cpsr,r0 "
);

例2:有参数 ,有返回值让内联汇编做加法运算,求a+b,结果存在c中

int a =100, b =200, c =0;
asm

add %0,%1,%2 "
: "=r"(c)
: "r"(a),"r"(b)
: "memory"
);

%0 对应变量c%1 对应变量a%2 对应变量b

例3:有参数 2 ,有返回值

让内联汇编做加法运算,求a+b,结果存在sum中,把a-b的存在d中

asm volatile

"add %[op1],%[op2],%[op3] "
sub %[op4],%[op2],%[op3] "
:[op1]"=r"(sum),[op4]"=r"(d)
:[op2]"r"(a),[op3]"r"(b)
:"memory"
);

%0 对应变量c%1 对应变量a%2 对应变量b

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式设计
    +关注

    关注

    0

    文章

    393

    浏览量

    22365
  • C程序
    +关注

    关注

    4

    文章

    255

    浏览量

    37423
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    汇编语言还有必要学习吗

    1、嵌入式操作系统需要汇编语言 2、实时性要求非常高的地方,需要汇编语言,比如FFT算法。 3、汇编语言做运算那叫一个痛苦,下面是一段双字节乘法,浮点数就更难搞
    的头像 发表于 11-25 11:46 452次阅读
    <b class='flag-5'>汇编</b>语言还有必要学习吗

    汇编语言的起源

    一、汇编语言是什么? 我们知道,CPU 只负责计算,本身不具备智能。你输入一条指令(instruction),它就运行一次,然后停下来,等待下一条指令。 这些指令都是二进制的,称为操作码
    发表于 11-20 07:19

    inline ASM(内联汇编)的细节分享

    内联汇编,否则,仍然是带有C++表达式的内联江编,此时\"instructionlist\"的寄存器的写法需要遵守相关的规定: 寄存器前必须
    发表于 10-31 09:11

    内联汇编的妙用

    一、问题描述 AES加密模式,有一种CTR模式,其流程如下图: 加密时,除了明文和密钥外,还需要一个初始向量COUNTER1,将其加密的结果和明文异,即可得到密文;下一块明文加密
    发表于 10-31 06:28

    简单的内联汇编介绍

    前言1、在程序我们可以嵌入汇编直接对我们加入的硬件进行相应的操作 2、在RISC-V架构定义的CSR寄存器需要使用特殊的 CSR 指令进行访问,如果在 C/C++程序
    发表于 10-30 08:04

    RISC-V的工具链GCC内联汇编

    具体实现方法和步骤 在RISC-V架构定义的CSR寄存器需要使用特殊的CSR指令进行访问,如果C、C++程序需要访问CSR寄存器,只能使用内嵌汇编指令的方法。在C、C++程序
    发表于 10-30 06:59

    蜂鸟自定义指令软件讲解和内联汇编(一)

    内联汇编介绍 asm volatile(“.insn r 0x7b, 2, 1, x0, %1, x0” : “=r”(zero) : “r”(addr)); (1)GCC内联汇编
    发表于 10-24 10:51

    GCC内联汇编

    需要用到C/C++内联汇编语法asm volatile(“instructions”) 以在C代码嵌入
    发表于 10-24 07:46

    通过内联汇编调用乘法指令mulh\\mulhsu\\mulhu

    mulh、mulhu与mulhsu指令,不能直接验证,需要其他方法。因此,我们想到了在C语言中嵌入内联汇编,分别生成三条指令的接口函数,之后便只需在C语言中调用者三函数便可执行mulh、mulhu
    发表于 10-24 06:52

    浮点运算单元的实现——浮点指令内联汇编(一)

    代码实现 在硬件实现FPU后,可通过内联汇编的方式,指定浮点指令对其进行测试,以下罗列出相关测试代码。 //fmadds_test __STATIC_FORCEINLINE float
    发表于 10-23 06:51

    汇编语言教学中文资料

    电子发烧友网站提供《汇编语言教学中文资料.rar》资料免费下载
    发表于 06-30 15:15 7次下载

    Windows环境下32位汇编语言中文资料

    电子发烧友网站提供《Windows环境下32位汇编语言中文资料.rar》资料免费下载
    发表于 06-30 15:14 0次下载

    分布式存储有哪几种类型?

    分布式存储有哪几种类型?分布式存储系统是一种将数据分散存储在多台独立节点上的技术,根据数据模型可分为键值存储、列式存储、文档存储和图形存储等类型;按数据存储单位可分为基于文件、块和对象的存储;按
    的头像 发表于 02-20 11:00 1125次阅读

    常见的有源变压器有哪几种

    麻烦问一下大家,我们常见的有源变压器有哪几种?最关键的问题是,有源变压器和无源变压器建模方法相同吗?有源变压器如何进行建模?真心求教,在线等,谢谢了。
    发表于 01-22 07:47

    输入电压达到正负5v、精度比较高最好是12bit以上的,六通道的ADC芯片一般选哪几种

    输入电压达到正负5v、精度比较高最好是12bit以上的,六通道的ADC芯片一般选哪几种,因为ADC之后是直接接FPGA处理的、最好是那种ADC芯片好呢、性能越好越好、
    发表于 01-22 06:47