[ARM]内联汇编

ARM内联汇编与常用指令(持续更新中) 介绍ARM内联汇编 阅读详情
AI摘要

本文详细介绍了内联汇编的基本语法及其应用实例,包括挥发性限定符、操作数约束及寄存器修改等内容,帮助读者深入理解并掌握内联汇编的使用。

内联汇编语法

在这里插入图片描述

语法

(1)asm

​ 这块直接写做

__asm__ 

​ 表示这是一段内联汇编。

(2)asm-qualifiers

​ 这里取值有三种 volatile , inline , goto:

​ volatile的意思是易变的、不稳定的,用来告诉编译器不要随便优化这段代码,否则可能出问题。比如汇编指令“mov r0, r0”,它把r0的值复制到r0,并没有实际做什么事情,你的本意可能是用这条指令来延时。编译器看到这指令后,可能就把它去掉了。加上volatile的话,编译器就不会擅自优化。

(3)AssemblerTemplate

​ 汇编指令,用双引号包含起来,每条指令用“\n”分开,比如:

"mov %0 , %1\n"
"add %0 , %1 ,%2\n"

**(4)OutputOperands **

​ 输出操作数,内联汇编执行时,输出的结果保存在哪里。格式如下,当有多个变量时,用逗号隔开:

[ [asmSymbolicName] ] constraint (cvariablename)

asmSymbolicName 是符号名 ,随便取,也可以不写

constraint表示约束,有如下常用取值:

constraint描述
mmemory operand,表示要传入有效的地址,只要CPU能支持该地址,就可以传入
rregister operand,寄存器操作数,使用寄存器来保存这些操作数
iimmediate integer operand,表示可以传入一个立即数

cvariablename:C语言的变量名。

​ 示例1如下:

[result] "=r" (sum)

​ 它的意思是汇编代码中会通过某个寄存器把结果写入sum变量。在汇编代码中可以使用“%[result]”来引用它。

​ 示例2如下:

"=r" (sum)

​ 在汇编代码中可以使用“%0”、“%1”等来引用它,这些数值怎么确定后面再说。

(5)InputOperands

​ 入操作数,内联汇编执行前,输入的数据保存在哪里。格式如下,当有多个变量时,用逗号隔开:

[ [asmSymbolicName] ] constraint (cexpression)

​ asmSymbolicName是符号名,随便取,也可以不写。

​ constraint表示约束,参考上一小节,跟OutputOperands类似。

cexpression:C语言的表达式。

​ 示例1如下:

[a_val]"r"(a), [b_val]"r"(b)

​ 它的意思变量a、b的值会放入某些寄存器。在汇编代码中可以使用%[a_val]、%[b_val]使用它们。

​ 示例2如下:

"r"(a), "r"(b)

​ 它的意思变量a、b的值会放入某些寄存器。在汇编代码中可以使用%0、%1等使用它们,这些数值后面再说。

(6)Clobbers

​ 在汇编代码中,对于“OutputOperands”所涉及的寄存器、内存,肯定是做了修改。但是汇编代码中,也许要修改的寄存器、内存会更多。比如在计算过程中可能要用到r3保存临时结果,我们必须在“Clobbers”中声明r3会被修改。

​ 下面是一个例子:

: "r0", "r1", "r2", "r3", "r4", "r5", "memory"

​ 我们常用的是有“cc”、“memory”,意义如下:

Clobbers描述
cc表示汇编代码会修改“flags register”
memory表示汇编代码中,除了“InputOperands”和“OutputOperands”中指定的之外, 还会读、写更多的内存

实践

​ (1)首先来分析一个累加汇编函数

int add(int a, int b)
{
     int sum;
     __asm__ volatile (
             "add %0, %1, %2"
             :"=r"(sum)
             :"r"(a), "r"(b)
             :"cc"
     );
     return sum;

根据上述的语法进行分解

(1)  __asm__			// 内联汇编
(2)  volatile			// 告诉编译器不能优化
(3)  add %0, %1, %2		// 汇编语句
(4)  "=r"(sum)			// %0 = sum
(5)  "r"(a), "r"(b)		 // %1 = a  %2 = b
(6)  "cc"				//加法可能改变 cpsr上的flag标志位

​ (2)进阶版, 已知 在ARMv8架构中 的异常等级分为 EL0,EL1,EL2,EL3 ,想从 EL0 通过 EL3 必须使用 “smc #0”指令

,并且需要配置 r0, r1 ,r2 ,r3 , r4 , r5这些寄存器充当传参,在EL3执行完相应的服务后会将返回值返回到寄存器r0,如何实现该功能?

​ 先分解条件

(1)  __asm__			// 内联汇编
(2)  volatile			// 告诉编译器不能优化
(3)  ldr r0 , =%[val0]
     ldr r1 , =%[val1]
     ldr r2 , =%[val2]
     ldr r3 , =%[val3]
     ldr r4 , =%[val4]
     ldr r5 , =%[val5]
     smc #0				
     mov %[result],r0    // 汇编语句
(4)  [result]"=r"(ret)	 // 输出赋值 
(5)  [val0]"r"(a0),[val1]"r"(a1),[val2]"r"(a2),[val3]"r"(a3),[val4]"r"(a4),[val5]"r"(a5)	//输入赋值
(6)  "r0"				// r0寄存器需要被修改

内联汇编

unsigned int smc(unsigned int a0, unsigned int a1, unsigned int a2, unsigned int a3, unsigned int a4, unsigned int a5)
{
    unsigned int ret;
    __asm__ volatile(
    		"ldr r0 , =%[val0]\n"
        	"ldr r1 , =%[val1]\n"
         	"ldr r2 , =%[val2]\n"
        	"ldr r3 , =%[val3]\n"
          	"ldr r4 , =%[val4]\n"
         	"ldr r5 , =%[val5]\n"
        	"smc #0\n"
  		    "mov %[result],r0\n"
        	:[result]"=r"(ret)
        	:[val0]"r"(a0),[val1]"r"(a1),[val2]"r"(a2),[val3]"r"(a3),[val4]"r"(a4),[val5]"r"(a5)
        	:"r0"
    );
    return ret;
}
【优化系列】ARM优化之内联汇编(inline)优化方法 DATE: 2020.10.1 文章目录前言1、系列总结2、参考3、ARM内联汇编优化方法 前言 前面博客里面已经总结了ARM纯汇编优化和Intrinsic优化方法,如下: 【arm】arm架构32位汇编优化总结 , 【arm】arm架构64位(AArch64)汇编优化总结 【优化系列】ARM优化之Intrinsic汇编方法 本文主要讲解ARM内联汇编arm inline的编写方法和注意事项。 1、系列总结 【ARM系列】ARM NEON汇编优化系列汇总 2、参考 ARM GCC的内联汇编详解 (ARM 阅读详情

相关推荐

基于PWM的汽车仪表步进电机微步驱动优化实践

本文深入探讨了基于PWM的微步驱动技术,用于优化汽车仪表步进电机的运行性能。通过将传统的分步驱动升级为PWM微步细分驱动,利用正弦/余弦查表法合成旋转磁场,有效消除了指针抖动与噪声,实现了指针的平滑、精准运动。文章以STM32和VID2905电机为例,提供了详细的硬件连接、代码实现及高级优化技巧,为提升汽车仪表体验提供了实用方案。

weixin_29169505的博客 510

ARM 内联汇编-1

其中ARM架构的CSPR寄存器中的关键几位N,Z,C,V与8086架构EFLAG中的NF ,SF ,ZF ,CF,OF相对应,主要是用于汇编计算中,使用源操作数计算的目标结果的状态记录和压栈、出栈、跳转状态保存和恢复。Q 该指令常用在饱和算法中,如果运算结果发生饱和(超出数据类型,导致溢出),这些状态将被FPSCR寄存器记录,则将结果自动截断,使其避免溢出。注)、上表指令后面可以追加一些后缀,比如"B", "H"和"W"分别表示从给定的内存地址依次取1个字节(8位),2个字节和4个字节。

wmzjzwlzs的专栏 1341

Lmbench测试集 --- 延迟测试工具lat_mem_rd

lmbench测试集简介 以及 lat_mem_rd延迟测试工具: 如何测试、测试结果、源码分析

MonologueYY的博客 1万+

arm 内联汇编基础

arm 内联汇编代码优化

点滴的岁月 1861

niushop靶场漏洞查找-文件上传漏洞等(超详细)

发现报错,而且这个报错十分熟悉,与我们所学的sqli报错注入特别像。这里查询到后面的url有且仅有一个,目测估计是后台。上传的图片是包含一句话木马的图片。发现获取到了webshell。实战漏洞-niushop。

qq_59020256的博客 1727

CDD数据库文件制作(二)——服务配置(0x27)

主要根据诊断调查表,针对0x27服务在CDD中的每一步配置给出详细介绍 1.会话切换配置 1.1.根据诊断调查表进行信息提取 1.2.子功能添加 1.2.1.Level1安全等级1创建 1.2.2.Level3安全等级3创建 1.2.3.安全等级名字查看与修改 1.3.会话切换信息提取(应用程序下) 1.4.会话转换配置(应用程序下) 1.5.会话切换信息提取(引导程序下) 1.6.会话转换配置(引导程序下) 2.安全等级配置信息提取 2.1.安全访问配置(level1) 2.2.安全访问配置(level2

LOVE135149的博客 2929

ARM64内联汇编

ARM64内联汇编简单介绍

小立仔 3978

Cesium初级开发教程之三十:Primitive集合

教程示例网站:https://thomaz529.github.io。

484

Linux-ARM汇编及ARM片内寄存器

作为Linux学习中ARM裸机开发第二篇博文,本篇简要介绍了补充汇编语言的一些基础知识以及ARM-A系列片内CPU寄存器。如文章有任何问题欢迎大家指出呀!再后面就要开始进行点灯操作了。

嵌入式入坑,专注点灯。 1729

三维重建(十三)——多视角重建

本文综述了多视角三维重建技术,涵盖静态和动态场景的重建方法。介绍了从图像获取到纹理映射的SFM流程,以及非刚性重建(NRSFM)的挑战和解决方案。重点探讨了基于可微渲染的重建方法,以及数据采集策略、相机标定和同步技术。文章还讨论了如何用单视角相机模拟多视角重建,总结了关键技术和未来研究方向。

河海大学研究生在读的学习笔记 1058

沉降预测算法-指数曲线法

沉降预测的指数曲线法原理和代码实现

yh523的博客 1009

ARM内联汇编

首先,让我们来共同了解一下 GCC 内联汇编的一般格式: asm( 代码列表 : 输出运算符列表 : 输入运算符列表 : 被更改资源列表 ); 在代码列表中,每个汇编语句都要用"  "括起来。 例: asm( " add %0,%1,%2\n\t" " mov r1,%1\n\t" :"+r"(sum) :"r"(a),"r"(b)

GameIT 3579

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[ARM-assembly]-ARM ASM内联汇编学习

格式 __asm__ qualifiers ( // 汇编代码部分 : OutputOperands //在内联汇编代码中被修改的变量列表 : InputOperands //在内联汇编代码中用到的变量列表 : Clobbers //在内联汇编代码中用到的寄存器列表 ); qualifiers:一般是用 volatile 修饰词 (1)、OutputOperands //在内联汇编代码中被修改的变量列表 [asmSymbolicName]

baron-周贺贺-代码改变世界ctw 5113

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ARM GCC的内联汇编详解 (ARM GCC Inline Assembler Cookbook)

说明:  在linux内核源码中,定义了一个__asm__的宏,其定义为:        #define __asm__ asm  另外有一个经常和 __asm__一起被用到的宏 __volatile__ 定义如下:       #define __volatile__ volatile    下面的文章中是直接用 asm ,但是,我们在linux的源码中看到的大部分都是 __asm

duanlove(技术路途)专栏 7295

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

arm下的gcc内联汇编

arm下的gcc内联汇编 __asm__ __volatile__内嵌汇编用法简述 在阅读C/C++原码时经常会遇到内联汇编的情况,下面简要介绍下__asm__ __volatile__内嵌汇编用法。 带有C/C++表达式的内联汇编格式为: __asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modif

格物致知 1865

10、 ARM 内联汇编学习笔记

基本思想:随手记录一下ARM的内联汇编的基础语法,以便更深入的学习NCNN源码~ http://www.ethernut.de/en/documents/arm-inline-asm.html参考官网 (1)、基本的汇编语法结构为 asm volatile ( code 代码列表 : output operand list 输出运算符列表 : input operand list 输入运算符列表 : clobber list 被更改资源列表 ); 或者也可以写成这样 __asm__ _.

sxj731533730 1857

ARM GCC中内联汇编语法

ARM嵌入式开发中的GCC内联汇编简介 嵌入式开发交流群280352802,欢迎加入! 在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择。但如果完全通过汇编代码实现,又会过于复杂、难以调试。因此,C语言内嵌汇编的方式倒是一个不错的选择。然而,使用内联汇编的一个主要问题是,内联汇编的语法格式与使用的编译器直接

旭 2455

ARM GCC 内联汇编参考手册

ARM GCC 内联汇编参考手册 【下载地址】ARMGCC内联汇编参考手册 《ARM GCC 内联汇编参考手册》是嵌入式开发者的必备工具,专为在ARM架构上使用GCC编译器进行内联汇编编写而设计。手册详细解析了内联汇编的基本语法、常用指令以及C语言与汇编的混合编程技巧,帮助开发者深入理解并高效运用这些技术。无论您是初学者...

gitblog_06799的博客 349

linux arm gcc 内联汇编参考手册

关于本文档 GNU C 编译器为 ARM 精简指令系统处理器提供了在 C 代码中内嵌汇编的功能。这种非常酷的特性提供了一些 C 代码没有的功能,比如手工优化软件关键代码、使用相关的处理器指令。 本文假设你已经熟悉 ARM 汇编程序,因为本文档不是 ARM 汇编教程,也不是 C 语言教程。 本文中所有的例程只使用 GCC v4 测试过,但是它们多数都应该能在早期版本上工作。 GCC asm ...

whatday的专栏 2587

ARM GCC内联汇编

修饰的操作符都是read-only的,input operand list都是read-only,所以想对同一变量又读又写,那只能将它放在output operand list并用。破坏列表,告诉编译器我在这段汇编代码中改变了什么,比如改变了寄存器,内存等等,这样编译器会在执行这段汇编代码之前保存一下将被改变的数据。在错误的写法中,由于不带&,造成rd和tab共用了寄存器r3;加上&后,rd用的r2,没有受到干扰,这些行为和编译器类型及版本有关系,果然编译器对咱指定的"r4"做了保存恢复的操作。

boom的博客 1085

ARM嵌入式开发中的GCC内联汇编简介

ARM嵌入式开发中的GCC内联汇编简介 嵌入式开发交流群280352802,欢迎加入! 在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择。但如果完全通过汇编代码实现,又会过于复杂、难以调试。因此,C语言内嵌汇编的方式倒是一个不错的选择。然而,使用内联汇编的一个主要问题是,内联汇编的语法格式与使用的编译器直接相关,也就是说...

系统运维 935

Linux ARM平台上的内联汇编学习(asm ,inline assembly)

在Linux+ARM平台上使用内联汇编(inline assembly),可以通过GCC(GNU Compiler Collection)提供的内联汇编语法来实现。内联汇编允许开发者在C/C++代码中直接嵌入汇编指令,对于编写性能敏感的代码、访问特定硬件特性或者实现某些底层功能非常有用。下面就结合内联汇编的优缺点为出发点,明白为什么要学习和掌握它,以及以一个内联汇编代码为例,熟悉一下内联汇编相关语法规则。内联汇编作为一种在高级语言代码中直接嵌入低级机器指令的技术,具有其独特的优势和潜在的局限性。

1551

[ARM 汇编]高级部分—内联汇编与C语言混合编程—3.1.2 ARM内联汇编语法

在本节中,我们将讨论ARM内联汇编的语法,包括基本语法、操作数约束和寄存器约束等部分。我们将通过实例和案例代码来详细介绍每个部分。

Andy0214的专栏 7159

ARM GCC内联汇编(Inline Assembly)的一些参考资料

ARM GCC Inline Assembler Cookbook http://www.ethernut.de/en/documents/arm-inline-asm.html 简评:用的ARM指令集,写的比较详细。英文版,有空时可以尝试翻译一下。 GCC-Inline-Assembly-HOWTO http://www.ibiblio.org/gferg/ldp/GCC-I

WaveRider2012的笔记 2212
上一篇: [git]相关问题解析
下一篇: [ATF]导读
瓜皮张先生
博客等级 码龄8年 23粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值