关于ARMv8指令的几个问题
版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/qianlong4526888/article/details/27512629
NOTE:下面内容仅仅针对ARMv8。
问题一:ARMv8 branch指令格式及使用方法(《ARMv8ISA overview》中 page 25有相关叙述):
1、 无条件分支+马上数:直接跳转到某地址,不能跳转到寄存器
指令有两个:”b label” ”bl label”。在编译过程,编译器会将label翻译成马上数。
举例:编写汇编代码例如以下
main:
label: nop
b label
ret
编译而且反汇编后:
0000000000400510 <main>:
label():
400510: d503201f nop
400514: 17ffffff b 400510 <main>
400518: d65f03c0 ret
2、 无条件分支+寄存器:
blr Xm:跳转到由Xm目标寄存器指定的地址处,同一时候将下一条指令存放到X30寄存器中。
比如:blr x20.
br Xm:跳转到由Xm目标寄存器指定的地址处。不是子程序返回
ret {Xm}:跳转到由Xm目标寄存器指定的地址处。
是子程序返回。Xm能够不写,默认是X30.
3、 条件分支:所有条件分支的跳转目标都是马上数!
ARMv8的条件分支写法:b.cond label。
当中cond是条件码共十六个(EQ,NE,CS等等)
问题二:ARMv8指令分类:
关于ARMv8的指令,在《ARMv8ISA overview》中做了分类。5.2章——5.6章是INT型指令,5.7是浮点指令,5.8是SIMD(即ARMv7中提到的NEON)指令。
关于SIMD指令怎样操作,在5.8节有简介,建议先看下4.4.2节关于FP/SIMD寄存器的说明。
另外,INT指令与FP指令之间的操作是针对不同的寄存器。所有两者之间没多少关系,至多就是INT型指令改动了寄存器内容,FP指令将改动后的寄存器当做源操作数读取。
问题三:
1、 ARMv8有没有两个目的操作数的指令?
答:有。比如LDP指令,从内存某地址处载入两个字到目的寄存器中,使用方法:LDP Wt1, Wt2, addr。
2、 ARMv8中源操作数超过三个的指令及分类:
(1) 扩展寄存器类操作。如:ADD X1, X2, W3, UXTB #2
这里把UXTB和#2分别当做一个源操作数。
(2) 移位寄存器类操作,如:ADD W1,W2,W3, lsl #2
眼下能确定的仅仅有这两类,最多不超过四种类型。假设须要我会做出具体的表。
另外,关于问题一中。为什么b指令的base opcode是0x14000000,而“b label”指令翻译成二级制是0x17ffffff的解答例如以下:
Branch指令是相对当前pc的分支指令。
1、 在ARMv8中,相对于当前b指令向后跳转时,编译器生成指令的二进制encoding(即b指令终于生成的二进制代码)的步骤例如以下:
向后跳转时,branch指令将除base opcode之外的位所有置一,然后做减法例如以下:
位地址),再减一。
label():
400510: d503201f nop
400514: 17ffffff b 400510 <main>
400518: d65f03c0 ret
上面的样例中,b指令所在地址为400514,label所在的地址是400510(label仅仅是个标签,不占用空间,其指示的是离自己近期的下一条指令地址)。依据上述公式能得到encoding=0x17ffffff—(400514—400510)/4=0x17ffffff.
同理就能理解下面代码:
000000000040051c <label2>:
label2():
40051c: d503201f nop
400520: d503201f nop
400524: d503201f nop
400528: 17fffffd
b 40051c <label2>
Encoding=0x17ffffff—(400528—40051c)/4—1= 0x17ffffff—2 = 17fffffd
2、理解了向后跳转。则向前跳转是同理的:
向前跳转时,branch指令将除base opcode之外的位所有置零,然后做加法例如以下:
指令的Encoding = (0x14000000 &0xfc000000)+(branch指令的目标地址—当前b指令所在的指令地址)/4
0000000000400510 <main>:
$x():
: 14000003
b 40051c <label2>
400514: aa0203e1 mov x1, x2
400518: aa0203e1 mov x1, x2
000000000040051c <label2>:
Encoding=0x14000000 + (40051c—400510)/4 = 0x14000000 + 3=0x14000003
(其它体系结构临时没做过測试,只是预计应该一样)
关于ARMv8指令的几个问题的更多相关文章
- 从编译器源代码中提取ARMv8的指令编码
2012年11月份的资料,之前ARMv8手冊还没公布,我想办法从编译器的binutils中提取出了全部ARMv8指令的二进制编码,之前不能随便发,如今相当于解禁了^_^. 问题1:提取ARMv8的指令 ...
- ARM64编译工具链下载
下面是自制的用于编译ARMv8指令的交叉编译工具链: 1.运行在PC上,支持SVE指令,不支持SVE ACLE,版本GCC9.2 https://pan.baidu.com/s/1_NnwajWCel ...
- armv8(aarch64)linux内核中flush_dcache_all函数详细分析【转】
转自:http://blog.csdn.net/qianlong4526888/article/details/12062809 版权声明:本文为博主原创文章,未经博主允许不得转载. /* * __ ...
- armv8(aarch64)linux内核中flush_dcache_all函数详细分析
/* * __flush_dcache_all() * Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY( ...
- ARMv8 Linux内核源代码分析:__flush_dcache_all()
1.1 /* * __flush_dcache_all() * Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ EN ...
- ARMv8 Linux内核head.S源码分析
ARMv8Linux内核head.S主要工作内容: 1. 从el2特权级退回到el1 2. 确认处理器类型 3. 计算内核镜像的起始物理地址及物理地址与虚拟地址之间的偏移 4. 验证设备树的地址是否有 ...
- ARMv8 Linux内核异常处理过程分析
NOTE:为了方便大家阅读,制作了PDF版文档.下载请猛戳这里 老样子,为了赚点积分下载其它人的文件,下载以上资料须要资源分2分. 假设没有积分请留言全部文档,留下邮箱就可以. 看了Linaro提供的 ...
- ARMV8体系结构简介
armv8 1.前言 本文的主要内容来源于ARMV8白皮书v5,对ARMV8做一个概述.包含如下的内容: 首先从背景谈起,讲述ARM的发展历程: 之后介绍ARMV8体系结构的基本特征: 介绍A64指令 ...
- armv8 memory translation
AArch32,arm的32bit架构: AArch64,arm的64bit架构: ARMv8.2-LPA,是armv8.2中的新feature,扩大了IPA和PA的支持范围,从48bit扩展到52b ...
随机推荐
- WPF备忘录(2)WPF获取和设置鼠标位置与progressbar的使用方法
一.WPF 中获取和设置鼠标位置 方法一:WPF方法 Point p = Mouse.GetPosition(e.Source as FrameworkElement); Point p = (e.S ...
- Windows7下IIS+php配置教程 http://www.jb51.net/article/113812.htm
这篇文章主要为大家详细介绍了Windows7下IIS+php配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 WINDOWS 7 IIS+php配置教程,具体内容如下 打开 开始 -> ...
- windows中80端口被System占用,PID=4的问题
在windows中如果tomcat需要使用80端口,发现该端口已经被占用,而netstat -ano发现该80端口被一个System的进程占用了,而PID=4.我们可以通过下面的方式找到对应的进程,然 ...
- 环境配置问题: 关于IDEA配置tomcat
1. 先下载并解压缩一个tomcat7 2.打开idea 3. -Xms256M -Xmx1024M -XX:PermSize=64M -XX:MaxPermSize=128M 关于热部署设置参考: ...
- [小技巧]Filezilla无法确定拖放操作目标,由于shell未正确安装__解决办法
重装系统及相关软件之后,用filezilla拖拽ftp上的文件到桌面的时候,提示"无法确定拖放操作目标......" 解决办法很简单,执行如下几步就OK了 ①在CMD中,进入Fil ...
- hdu1072(Nightmare)bfs
Nightmare Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- 【12】外观模式(Facade Pattern)
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化.然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作“ ...
- AngularJS table 按照表头字段排序功能(升序和降序)
一.表格按照表头排序 <!doctype html> <html ng-app="a3_4"> <head> <title>表头排序 ...
- 洛谷P3586 [POI2015]LOG(贪心 权值线段树)
题意 题目链接 Sol 显然整个序列的形态对询问没什么影响 设权值\(>=s\)的有\(k\)个. 我们可以让这些数每次都被选择 那么剩下的数,假设值为\(a_i\)次,则可以\(a_i\)次被 ...
- Bootstrap4响应式布局之栅格系统
前面说了Bootstrap4的下载和简单使用,现在我们接着往下学习,Bootstrap4的响应式布局主要依靠栅格系统来实现的.面老K先来讲解一下Bootstrap4的栅格系统,让你能够更快的了解Boo ...