资讯专栏INFORMATION COLUMN

[ARM]内联汇编

894974231 / 3512人阅读

摘要:内联汇编语法在这里插入图片描述语法这块直接写做表示这是一段内联汇编。汇编指令,用双引号包含起来,每条指令用分开,比如输出操作数,内联汇编执行时,输出的结果保存在哪里。入操作数,内联汇编执行前,输入的数据保存在哪里。

内联汇编语法

在这里插入图片描述

语法

(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寄存器需要被修改

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123873.html

相关文章

  • ARM汇编指令集_学习笔记(1)

    摘要:汇编与汇编有显著区别。属于复杂指令集属于精简指令集。而寄存器和内存的通信则由单独的指令来完成。进入状态当操作数寄存器的状态位为时,执行指令时可以使微处理器从状态切换到状态。个固定的程序计数器又称,总是指向正在取值的指令,类似于的寄存器。一、什么是ARM汇编? 运行在ARM处理器上的汇编语言就叫ARM汇编。 C程序运行在X86平台,底层就是X86汇编;运行在ARM平台,底层就是ARM汇编。A...

    Ryan_Li 评论0 收藏0
  • Android逆向从入门到入土(smali修改,so修改)

    摘要:闲来无事,学习了下安卓的逆向工程,有助于观摩学习他人的优秀代码,查询了解后发现大体包括两部分反编译,即语法学习层,汇编学习。不多说,做过安卓开发都可以改,重点是的阅读修改。想要深入了解相关知识,可以百度关键字安卓,安卓,安卓,安卓。 闲来无事,学习了下安卓的逆向工程,有助于观摩学习他人的优秀代码,查询了解后发现大体包括两部分:1.dex反编译,即smali语法学习;2.Native层,...

    woshicixide 评论0 收藏0
  • Android逆向从入门到入土(smali修改,so修改)

    摘要:闲来无事,学习了下安卓的逆向工程,有助于观摩学习他人的优秀代码,查询了解后发现大体包括两部分反编译,即语法学习层,汇编学习。不多说,做过安卓开发都可以改,重点是的阅读修改。想要深入了解相关知识,可以百度关键字安卓,安卓,安卓,安卓。 闲来无事,学习了下安卓的逆向工程,有助于观摩学习他人的优秀代码,查询了解后发现大体包括两部分:1.dex反编译,即smali语法学习;2.Native层,...

    frank_fun 评论0 收藏0
  • 震惊!这个操作系统的应用加载只需要“毫秒级”耗时

    摘要:本文主要介绍应用程序加载如何做到毫秒级耗时。图不同视角看左边是从汇编器和链接器的视角来看这个文件,开头的描述了体系结构和操作系统等基本信息,并指出和在文件中的什么位置,在汇编和链接过程中没有用到,所以是可有可的,中保存了所有的描述信息。 1、背景 AliOS Thing 是AliOS家族旗...

    incredible 评论0 收藏0
  • 阿里聚安全攻防挑战赛第三题Android PwnMe解题思路

    摘要:阿里聚安全攻防挑战赛第三题解题思路大家在聚安全挑战赛正式赛第三题中,遇到远程控制的题目。反汇编文件发现中果然有接受相关的内容。也就是说攻击者的网页至少如下反汇编类发现,它会把指向的文件当作特定格式的解析。 阿里聚安全攻防挑战赛第三题Android PwnMe解题思路 大家在聚安全挑战赛正式赛第三题中,遇到android app 远程控制的题目。我们今天带你一探究竟,如何攻破这道题目。 ...

    Aldous 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<