IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> [ARM]内联汇编 -> 正文阅读

[嵌入式][ARM]内联汇编

内联汇编语法

在这里插入图片描述

语法

(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;
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-18 11:20:34  更:2021-11-18 11:20:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:59:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码