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

    文章

    389

    浏览量

    21145
  • C程序
    +关注

    关注

    4

    文章

    253

    浏览量

    35750
收藏 人收藏

    评论

    相关推荐

    HMDS与BARC一定要除去吗?有哪几种去除的方式?

    HMDS,BARC是光刻工序中比较常用的化学品,但是它们并不能用显影液除去,根据是什么?它们一定要除去吗?有哪几种去除的方式?
    的头像 发表于 12-22 10:29 622次阅读
    HMDS与BARC一定要除去吗?有<b class='flag-5'>哪几种</b>去除的方式?

    什么是步进电机?步进电机分哪几种?

    电子发烧友网站提供《什么是步进电机?步进电机分哪几种?.pdf》资料免费下载
    发表于 11-28 14:21 1次下载
    什么是步进电机?步进电机分<b class='flag-5'>哪几种</b>?

    请问MMF103的SPI支持哪几种模式?

    MMF103的SPI支持哪几种模式?
    发表于 11-02 06:38

    硅片有哪几种晶向?有几种定位边?定位边是如何定位的?

    硅片是大多数芯片的载体。但是一块硅片中却隐藏了很多不为人知的细节,比如:硅片有哪几种晶向?有几种定位边?定位边是如何定位的?定位边与定位槽有什么区别?等等。今天就来详细讲解一下。
    的头像 发表于 10-29 10:33 4989次阅读
    硅片有<b class='flag-5'>哪几种</b>晶向?有<b class='flag-5'>几种</b>定位边?定位边是如何定位的?

    数控机床高速电主轴有哪几种工作原理?

    数控机床高速电主轴有哪几种工作原理?|深圳恒兴隆机电
    的头像 发表于 10-17 10:13 862次阅读

    EMI滤波器有哪几种应用和选择?

    EMI滤波器有哪几种应用和选择?|深圳比创达EMC
    的头像 发表于 10-09 10:32 891次阅读
    EMI滤波器有<b class='flag-5'>哪几种</b>应用和选择?

    ARM开发人员套件1.2版汇编指南

    ARM开发者套件(ADS)拥有: ·一个独立的汇编程序ARMASM·一个内置在C和C++编译器的优化内联汇编程序。 这些汇编器作为输入的语
    发表于 09-01 10:41

    充电桩配合使用的变压器有哪几种

    充电桩配合使用的变压器有哪几种 充电桩是对电动汽车进行充电的重要设备,而变压器则是充电桩的配套设备之一。变压器在充电桩的使用中扮演着重要的角色,它可以将高电压转换为适用于电动汽车的低电压,确保充电
    的头像 发表于 08-18 10:54 3127次阅读

    RealView开发工具包汇编程序指南

    RealView编译工具(RVCT)具有: ·一个独立的汇编程序,ARMASM·优化C和C++编译器内置的内联嵌入汇编程序。 这些
    发表于 08-12 07:30

    NucleiStudio是否支持修改编译器使得支持自定义指令格式从而能嵌入对应的内联汇编

    NucleiStudio 是否支持修改编译器使得支持自定义指令格式,从而能嵌入对应的内联汇编
    发表于 08-11 11:36

    RISC-V查看汇编代码的几种方式

    很多时候需要对照C和汇编进行分析和调试,所以需要查阅汇编代码,以下分享几种方式。
    的头像 发表于 06-09 19:13 2060次阅读
    RISC-V查看<b class='flag-5'>汇编</b>代码的<b class='flag-5'>几种</b>方式

    哪几种情况下会造成伺服电机抖动?

    哪几种情况下会造成伺服电机抖动?怎样才能解决这些伺服电机抖动带来的问题?分别是怎么解决的?
    发表于 05-24 09:41 204次阅读

    Spring事务在哪几种情况下会不生效?

    日常开发中,我们经常使用到spring事务。最近星球一位还有去美团面试,被问了这么一道面试题: Spring 事务在哪几种情况下会不生效?
    的头像 发表于 05-10 17:53 574次阅读
    Spring事务在<b class='flag-5'>哪几种</b><b class='flag-5'>情况</b>下会不生效?

    ESD模型有哪几种你知道吗?

    ESD模型有哪几种你知道吗?
    的头像 发表于 05-09 10:00 1187次阅读
    ESD模型有<b class='flag-5'>哪几种</b>你知道吗?

    在Rust中使用内联汇编

    与 GCC 内联汇编语法一样,Rust 希望即使需要手写汇编,程序员也能将一部分工作交给编译器来高效完成,这部分工作就是寄存器分配,毕竟只有编译器了解内联
    的头像 发表于 05-04 09:54 572次阅读