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

    浏览量

    21502
  • C程序
    +关注

    关注

    4

    文章

    255

    浏览量

    36328
收藏 人收藏

    相关推荐

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

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

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

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

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

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

    ARM汇编语言工具

    电子发烧友网站提供《ARM汇编语言工具.pdf》资料免费下载
    发表于 11-06 09:12 0次下载
    ARM<b class='flag-5'>汇编</b>语言工具

    TMS320C28x汇编语言工具

    电子发烧友网站提供《TMS320C28x汇编语言工具.pdf》资料免费下载
    发表于 11-01 09:32 0次下载
    TMS320C28x<b class='flag-5'>汇编</b>语言工具

    op07c和op37的封装有哪几种

    咨询op07c和op37的封装有哪几种
    发表于 09-25 08:24

    蒸汽流量计有哪几种?了解流量计多种类型与应用

    工业管道蒸汽的流量测量,选型时主要通过介质类型、介质温度、工作压力、流量范围等参数进行挑选,下面来了解一下 蒸汽流量计有哪几种 。 一、 涡街流量计: (一)工作原理:利用卡门涡街原理测量蒸汽
    的头像 发表于 09-09 13:55 840次阅读
    蒸汽流量计有<b class='flag-5'>哪几种</b>?了解流量计多种类型与应用

    光电开关型号有哪几种

    光电开关是一种常用的传感器,广泛应用于自动化设备、机器人、物流系统等领域,用于检测物体是否存在、物体的位置、物体的速度等。 1. 槽光电开关的基本原理 槽光电开关主要由发射器和接收器两部分
    的头像 发表于 09-04 11:30 1159次阅读

    RISC-V汇编语言

    传递。 自然,如果想在浮点寄存传递浮点参数,需要相应的浮点 ISA 添加 F D 扩展。因此要编译 RV32I 的代码(GCC 选项-march=rv32i),必须使用 ilp32 ABI
    发表于 08-19 18:07

    LED驱动芯片的引脚功能主要包括哪几种

    至关重要的角色   LED驱动芯片的引脚功能主要包括哪几种?   LED驱动芯片的引脚功能主要包括以下10种:   1. 电源引脚(VCC、VDD):用于连接芯片的电源正极,提供工作电压。用户需要根据规格书指定的电源电压范围来选择合适的供电电压。  2. 接地引脚(
    的头像 发表于 08-12 10:19 2310次阅读

    RISC-V 汇编在线仿真器 Ripes OnLine 简介

    不用安装任何软件,直接做浏览器运行汇编代码。 Editor Processor Cache Memory I/O Ripes simulator online 可让您在不安装软件的情况下运行
    发表于 06-28 13:43

    网络跳线的标准有哪几种

    更高的带宽和性能。双绞线在网络的连接方式有两种:直通式和交叉式。直通式跳线的线序一般遵循T568AT568B标准,而交叉式跳线则是指两端的水晶头采用不同的线序,通常用于连接异类设备,如交换机与电脑、路由器与电脑等。 光纤跳线标准:光纤跳线使用光来传输数据,而不
    的头像 发表于 06-14 10:42 1401次阅读

    断路器有哪几种

    断路器有哪几种  断路器是一种用于保护电气线路和设备的重要元件,它可以在电路发生短路过载时自动切断电源,以避免设备损坏和火灾等危险。断路器的种类繁多,根据不同的分类标准,可以分为以下几种: 1.
    的头像 发表于 06-10 16:19 2803次阅读

    STM32单片机有哪几种常见的开发环境?

    STM32单片机是一款广泛应用于嵌入式系统开发的单片机,针对其开发,有以下几种常见的方式:STM32单片机有哪几种常见的开发环境?KeilMDK是一款广泛使用的单片机集成开发环境,支持多种单片机系列
    的头像 发表于 05-18 08:04 3771次阅读
    STM32单片机有<b class='flag-5'>哪几种</b>常见的开发环境?

    如何用Keil生成bin、汇编、C与汇编混合文件?

    用Keil生成bin、汇编、C与汇编混合文件
    发表于 04-08 06:17