版权声明:本文为博主原创文章,未经博主同意不得转载。 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指令的几个问题的更多相关文章

  1. 从编译器源代码中提取ARMv8的指令编码

    2012年11月份的资料,之前ARMv8手冊还没公布,我想办法从编译器的binutils中提取出了全部ARMv8指令的二进制编码,之前不能随便发,如今相当于解禁了^_^. 问题1:提取ARMv8的指令 ...

  2. ARM64编译工具链下载

    下面是自制的用于编译ARMv8指令的交叉编译工具链: 1.运行在PC上,支持SVE指令,不支持SVE ACLE,版本GCC9.2 https://pan.baidu.com/s/1_NnwajWCel ...

  3. armv8(aarch64)linux内核中flush_dcache_all函数详细分析【转】

    转自:http://blog.csdn.net/qianlong4526888/article/details/12062809 版权声明:本文为博主原创文章,未经博主允许不得转载. /* *  __ ...

  4. armv8(aarch64)linux内核中flush_dcache_all函数详细分析

    /* *  __flush_dcache_all() *  Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY( ...

  5. ARMv8 Linux内核源代码分析:__flush_dcache_all()

    1.1 /* *  __flush_dcache_all() *  Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ EN ...

  6. ARMv8 Linux内核head.S源码分析

    ARMv8Linux内核head.S主要工作内容: 1. 从el2特权级退回到el1 2. 确认处理器类型 3. 计算内核镜像的起始物理地址及物理地址与虚拟地址之间的偏移 4. 验证设备树的地址是否有 ...

  7. ARMv8 Linux内核异常处理过程分析

    NOTE:为了方便大家阅读,制作了PDF版文档.下载请猛戳这里 老样子,为了赚点积分下载其它人的文件,下载以上资料须要资源分2分. 假设没有积分请留言全部文档,留下邮箱就可以. 看了Linaro提供的 ...

  8. ARMV8体系结构简介

    armv8 1.前言 本文的主要内容来源于ARMV8白皮书v5,对ARMV8做一个概述.包含如下的内容: 首先从背景谈起,讲述ARM的发展历程: 之后介绍ARMV8体系结构的基本特征: 介绍A64指令 ...

  9. armv8 memory translation

    AArch32,arm的32bit架构: AArch64,arm的64bit架构: ARMv8.2-LPA,是armv8.2中的新feature,扩大了IPA和PA的支持范围,从48bit扩展到52b ...

随机推荐

  1. RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列

    一.理论: .net环境下,C#代码调用RabbitMQ消息队列,本文用easynetq开源的.net Rabbitmq api来实现. EasyNetQ 是一个易于使用的RabbitMQ的.Net客 ...

  2. oracle中数据类型number(m,n)

    oracle中数据类型number(m,n)中m表示的是所有有效数字的位数,n表示的是小数位的位数.m的范围是1-38,即最大38位. 1> .NUMBER类型细讲:Oracle   numbe ...

  3. 关于ORA-12505, TNS:listener does not currently know of SID given in connect descriptor报错问题解决办法

    1.本机tnsnames.ora 配置如下 test4= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.1 ...

  4. 悟空模式-java-原型模式

    [却说那妖精与大圣斗经半日,不分胜败.行者把棒丢起,叫一声“变!”就以一变十,以十变百,以百变千,半天里,好似蛇游蟒搅,乱打妖邪.妖邪慌了手脚,将身一闪,化道清风,即奔碧空之上逃走.行者念声咒语,将铁 ...

  5. CSS 水平居中和垂直居中

    1.水平居中——行内元素 text-align: center; 2.水平居中——定宽块状元素 margin: auto,满足定宽和块状两个条件的元素是可以通过设置“左右margin”值为“auto” ...

  6. 走通Django的基本流程

    工程目录及文件的说明 manage.py:一个命令行工具,可以使我们用多种方式对Django项目进行交互 __init__.py:一个空文件,它告诉Python这个文件的上级目录应该看做一个pytho ...

  7. h5新增加的存储方法

    h4中使用的cookie把用户信息保存在客户端浏览器,但是它受到很多限制. 大小:最多能存储4k 带宽:它是随着http请求一起发送到服务器的,因此浪费一部分的带宽. 复杂度:操作复杂. h5新增加了 ...

  8. 从零开始学习html(十五)css样式设置小技巧——下

    六.垂直居中-父元素高度确定的单行文本 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8&quo ...

  9. SharePoint Server 2013安装

    坑死人不偿命的呀 在Windows Server 2012 R2上安装SharePoint Server 2013,安装了半天,结果卡在“Windows Server AppFabric”安装错误上, ...

  10. FineReport8.0如何连接FineIndex取数分析

    1. 描述 在3.7及之前版本,FineReport连接都是通过安装多维数据集插件,然后通过多维数据库的方式连接FineBI(3.4-3.6对应711,3.7对应8.0),从4.0版本开始,FineR ...