首页 > 编程语言 >转载:ARM 内联汇编语法

转载:ARM 内联汇编语法

时间:2023-04-28 23:24:55浏览次数:74  
标签:汇编 代码 sum 寄存器 内联 ARM asm

https://blog.csdn.net/myprogram_player/article/details/121372941

ARM 内联汇编语法:

asm asm-qualifiers (AsemblemTemplate : OutputOperands [ : InputOperands [ : Clobbers]])

 (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描述
m memory operand,表示要传入有效的地址,只要CPU能支持该地址,就可以传入
r register operand,寄存器操作数,使用寄存器来保存这些操作数
i immediate integer operand,表示可以传入一个立即数

 

​ 示例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标志位

 

标签:汇编,代码,sum,寄存器,内联,ARM,asm
From: https://www.cnblogs.com/fellow1988/p/17363373.html

相关文章

  • 汇编_如何暂存数据
    由双重循环引发的思考内存中定义了二维字符串数组,使用双重循环完成字符遍历。由于loop指令只认cx寄存器,在循环的过程中为了避免cx值被覆写,需要在内层循环前,将外层循环的cx值暂存起来。使用寄存器完成大小写转换assumecs:codesg,ds:datasgdatasgsegmentdb'ibm......
  • 【HarmonyOS】元服务WebView组件 H5使用localstorage
    在日常开发中我们会在应用种接入H5网页,localStorage作为H5本地存储webstorage特性的API之一,主要作用是将数据保存在客户端中。对于快速开发元服务,通过WebView组件运行H5如何使用localstorage呢?下文以API7JavaUI为例为大家做相关的讲解。 【实现步骤】第一步、配置WebView首......
  • 【HarmonyOS】【JS】Tabs如何设置区分TabBar和TabContent的分割线不显示
    【关键字】Tabs,分割线 【问题描述】使用JS开发HarmonyOS应用时,使用Tabs组件,默认自带TabBar和TabContent的蓝色分割线,由于蓝色分割线样式不可设置,若不想要此蓝色分割线,如何去除蓝色分割线? 【问题分析】1、若JS使用Tabs,蓝色分割线为组件自带样式,暂不支持属性支持显示与隐藏......
  • Mac M1(arm 系列芯片)如何安装 Chromium | Puppeteer
    最近写个脚本用到puppeteer,然后安装Chromium出现一点问题,这里记录一下解决方案。Puppeteer自动安装失败在Puppeteer安装时会自动安装Chromium,然而却总是报错502导致下载失败,直接下载可以下载,命令行wget也可以,猜测是因为Puppeteer开启了新的process来安装导致环境......
  • 【汇编学习】指令对标志寄存器的影响总结
    转载自百度网盘指令类型助记符(带*为特权指令)对标志寄存器的影响备注说明举例ZFCFPFSFOFAFDFIFTF数据传送类数据传送MOV不影响标志位 MoveMOVr/m32,imm32MOV* Moveto/fromControlReg......
  • Armbian换清华源
    编辑配置文件nano/etc/apt/sources.listdebhttps://mirrors.tuna.tsinghua.edu.cn/debian/bullseyemaincontribnon-free#deb-srchttps://mirrors.tuna.tsinghua.edu.cn/debian/bullseyemaincontribnon-freedebhttps://mirrors.tuna.tsinghua.edu.cn/debian/bul......
  • HarmonyOS 3.1系统隐藏的这几个小细节 你都发现了么
    就在前不久,华为发布了搭载HarmonyOS3.1系统的HUAWEI P60系列,精致内核搭配典雅外观,一亮相就获得了众多用户的喜爱。而笔者拿到真机进行上手后,发现HarmonyOS3.1在UX交互体验和视觉感观的打磨上都下足了功夫,包括了系统动效的全面优化,图标圆角细节的打磨,个性化AOD随心设置等等。接......
  • pycharm怎么一键多行注释
    pycharm怎么一键多行注释pycharm可以批量注释,快捷键是Ctrl+/,鼠标选中需要注释的多行代码,然后按下Ctrl键和斜杠/键,就可以批量注释(每行前加#)了。选中代码:alt+shift+e,运行选中代码>>>a.title()#首字母大写'ThisIsA'......
  • pycharm中python测试一直‘Instantiating tests...’转圈
    问题描述:defget_formatted_name(first,last):"""生成简洁的姓名"""full_name=first+""+lastreturnfull_name.title()importunittestfromname_functionimportget_formatted_nameclassNamesTestCase(unit......
  • ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测|附代码数据
    全文下载链接:http://tecdat.cn/?p=12174最近我们被客户要求撰写关于ARMA-EGARCH的研究报告,包括一些图形和统计输出。本文比较了几个时间序列模型,以预测SP500指数的每日实际波动率。基准是SPX日收益序列的ARMA-EGARCH模型。将其与GARCH模型进行比较 。最后,提出了集合预测算法......