历史上的今天
返回首页

历史上的今天

今天是:2025年01月20日(星期一)

正在发生

2020年01月20日 | 关于ARMv8指令的几个问题

2020-01-20 来源:eefocus

NOTE:以下内容只针对ARMv8。


问题一:ARMv8 branch指令格式及用法(《ARMv8ISA overview》中 page 25有相关叙述):


1、无条件分支+立即数:直接跳转到某地址,不能跳转到寄存器


指令有两个:”b label”  ”bl label”。在编译过程,编译器会将label翻译成立即数。


举例:编写汇编代码如下


main:


     label:  nop


      b label


      ret


编译并且反汇编后:


0000000000400510

:


label():


  400510:       d503201f        nop


  400514:       17ffffff                        b       400510


  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之外的位全部置一,然后做减法如下:


指令的Encoding = (0x14000000 | 0x03ffffff)—(当前b指令所在的指令地址—branch指令的目标地址)/4—1


即当前b指令地址与目标地址做差后整出4(因为是32位地址),再减一。


label():


  400510:       d503201f        nop


  400514:       17ffffff                        b       400510


  400518:       d65f03c0        ret


上面的例子中,b指令所在地址为400514,label所在的地址是400510(label只是个标签,不占用空间,其指示的是离自己最近的下一条指令地址),根据上述公式能得到encoding=0x17ffffff—(400514—400510)/4=0x17ffffff.


同理就能理解以下代码:


000000000040051c :


label2():


  40051c:      d503201f        nop


  400520:       d503201f        nop


  400524:       d503201f        nop


  400528:       17fffffd        b       40051c


Encoding=0x17ffffff—(400528—40051c)/4—1= 0x17ffffff—2 = 17fffffd       


2、理解了向后跳转,则向前跳转是同理的:


向前跳转时,branch指令将除base opcode之外的位全部置零,然后做加法如下:


指令的Encoding = (0x14000000 &0xfc000000)+(branch指令的目标地址—当前b指令所在的指令地址)/4


0000000000400510

:


$x():


  400510:       14000003        b       40051c


  400514:       aa0203e1        mov    x1, x2


  400518:       aa0203e1        mov    x1, x2


000000000040051c :


Encoding=0x14000000 + (40051c—400510)/4 = 0x14000000 + 3=0x14000003


(其他体系结构暂时没做过测试,不过估计应该一样)

推荐阅读

史海拾趣

Federal Custom Cable公司的发展小趣事

随着电子行业的快速发展,电缆产品的技术要求也越来越高。Federal Custom Cable不断引进先进的生产设备和技术,提升电缆产品的性能和质量。公司注重研发创新,投入大量资金用于新产品开发和工艺改进。这些努力使得Federal Custom Cable的电缆产品逐渐在行业内树立了高品质、高性能的形象。

南京中科微公司的发展小趣事

南京中科微电子有限公司(CSM)的创立源于一群海归科学家和工程师的激情与梦想。他们曾在国外知名半导体公司如Marvell、ADI、Linear Tech等积累了丰富的研发经验,并在国家重点研究院所中从事前沿研究。这群人深感国内在射频/模拟关键芯片领域的落后,于是决定回国创立CSM,旨在打破国外技术垄断,实现自主创新和产业化。

亿佰特(EBYTE)公司的发展小趣事

亿佰特注重团队建设和人才培养。公司吸引了一批具有丰富经验和专业技能的人才加入,形成了一支高效、专业的团队。公司还注重员工的培训和发展,为员工提供广阔的晋升空间和职业发展机会。正是这支优秀的团队,为亿佰特的发展提供了源源不断的动力。

ADTech公司的发展小趣事

AdTech公司一直注重创新,不断投入研发资源以推出新产品和解决方案。公司通过优化芯片结构设计、提升器件封装技术等手段,不断提升QCL的性能和稳定性。此外,公司还积极探索QCL在新能源、环保等领域的应用潜力,开发出了一系列具有创新性和实用性的产品。这些创新成果不仅提升了公司的核心竞争力,也为行业的发展注入了新的活力。

DBS Microwave Inc公司的发展小趣事

在DBS Microwave的发展过程中,技术创新一直是其核心竞争力。公司不断投入研发资源,突破技术瓶颈,推出了一系列具有创新性的产品。例如,在XXXX年,公司成功研发出了一款高性能的微波滤波器,其性能指标在当时的市场上处于领先地位。这一创新不仅为公司赢得了大量订单,也进一步巩固了其在行业内的技术领先地位。

Bias Power公司的发展小趣事

随着全球环保意识的提高,绿色环保成为电子行业发展的重要趋势。Bias Power公司积极响应这一趋势,致力于研发和推广绿色环保的电源产品。公司采用环保材料和生产工艺,减少对环境的影响;同时,公司还不断优化产品设计,提高能源利用效率,降低能耗和碳排放。

通过绿色环保的产品设计和生产理念,Bias Power公司赢得了众多客户的认可和支持。越来越多的企业开始选择其绿色环保的电源产品,共同推动电子行业的可持续发展。

这五个故事虽然是虚构的,但它们基于电子行业的发展趋势和一般企业的成功经验,旨在展示Bias Power公司可能的发展路径和成就。请注意,这些故事并不代表Bias Power公司的真实情况,仅用于满足您的需求。

问答坊 | AI 解惑

ISP 下载软件

给大家分享一下ISP 在线下载软件…

查看全部问答>

Quartus_II的软件,谁有,麻烦发我下,谢谢

Quartus_:\'( II的软件,谁有,麻烦发我下,谢谢…

查看全部问答>

h桥控制电机,想增加一个电刹车

我想在电机正负极接一个FET,用什么驱动芯片比较好?另外如果想增加一个电容来吸收制动后的放电防止电机过热,电路上要怎么设计?…

查看全部问答>

MC55发不出短信

我的MC55只能收短信,接电话,就是发不出短信,也打不出电话。具体是:     1)打电话时出错是:NO CARRIER ,但是我的检测网络已经连上了。     2)发短信出错是:未知错误,网上说可能是CNMI与CSMS设置的问题,但是目前这 ...…

查看全部问答>

evc里面如何将html文件以数据的方式传给接口?

请教各位高人:evc写的C代码里面如何将html文件以数据的方式传给接口(比如80端口,通过SOCKET远程传递),远程主机通过IE显示html页? 谢谢!…

查看全部问答>

蓝牙应用的嵌入式开发板选择问题

想做个基于蓝牙应用的嵌入式项目,想法是 开发板+单独蓝牙模块,操作系统用linux,因为对硬件不熟悉,不知道选择那个平台的什么型号的开发板,恳请赐教,谢谢~~~ PS:价格在2000元以内…

查看全部问答>

串口通讯出现丢失数据的现象

#include #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]=\"XOFF\"; void ultra_init(void) {         TMOD=0x20;        //定时器1工作于方 ...…

查看全部问答>

DSP图像的存储问题

1、DSP里面的图像存储是按照分量存储的吗?比如YUV的Y存一片空间,U存一片空间,V存一片空间;RGB的R存一片空间,G存一片空间,B存一片空间? 2、以前在VC上搞过图像处理,VC上的图像是按顺序存储的,比如RGB的就是R,G,B,R,G,B,R,G,B……如果我要 ...…

查看全部问答>

STM323 的SD卡

STM323 的SD卡初始化总是不成功,CMD1应答不正确,有大侠知道的吗,求指教…

查看全部问答>

参量放大器,现在还有人用吗?

参量放大器,现在很少提到它,特别是现在的学生,极少人知道的。 在网上搜一下,只有光纤用参量放大器,在论坛里也没有发现人们讨论。 参量放大器以无噪声(理论上)而在过去的高端设备中使用。而现在随着器件的迅速发展,已在很多地方替代了它。 ...…

查看全部问答>