历史上的今天
返回首页

历史上的今天

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

正在发生

2020年01月19日 | ARMv8中branch指令分类、格式及用法

2020-01-19 来源:eefocus

ARMv8虽然还没有出商用芯片,但是ARM内部已经有成型的模拟器了,其中ARMv8的Fast Models已经内测,虽然还没上市。目前已有ARMv8的Foundation Model可以用来测试ARMv8的应用程序。


一:ARMv8 Branch指令分类:


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等等)


二:指令格式:


#################################################################################################


b ## mask: 0xfc000000 ##opcode: 0x14000000 ## ['ADDR_PCREL26']


|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|


imm26 after split: imm26


|0 |0 |0 |1 |0 |1 |A |A |A |A|A |A |A |A |A |A |A |A |A |A |A |A |A |A |A |A |A |A |A |A |A |A |


mask as follow:


|1 |1 |1 |1 |1 |1 |0 |0 |0 |0|0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |


A  - imm26


#################################################################################################


CSDN的编辑器不好,对不齐,以上是branch指令的opcode


三:用法及解析


另外,上面代码例子中,为什么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

推荐阅读

史海拾趣

Display Engineering Services公司的发展小趣事

以下是五个电子行业里Display Engineering Services公司发展起来的相关故事:

故事一:
在科技日新月异的今天,XX公司凭借其在Display Engineering Services领域的专业技术和创新能力,逐渐崭露头角。起初,XX公司只是一家专注于显示屏研发的小型技术公司,但在市场需求的驱动下,公司意识到为客户提供定制化的显示屏解决方案具有巨大潜力。于是,XX公司开始将重心转移到Display Engineering Services上,通过深入了解客户需求,提供从设计、制造到安装的全流程服务。经过数年的努力,XX公司不仅积累了丰富的经验,还建立起一支专业的技术团队,赢得了业界的广泛认可。

故事二:
YY公司的发展历程颇具传奇色彩。该公司最初只是一家为电子产品提供显示屏配件的供应商。然而,随着市场竞争的加剧,YY公司意识到单纯提供配件已无法满足客户需求。于是,公司决定转型为Display Engineering Services提供商,致力于为客户提供显示屏的定制设计和优化服务。YY公司凭借其卓越的技术实力和敏锐的市场洞察力,成功转型,并在短时间内实现了业务的快速增长。如今,YY公司已成为行业内的佼佼者,其显示屏解决方案广泛应用于各个领域。

故事三:
ZZ公司是一家专注于Display Engineering Services的创业公司。在创立之初,公司面临着资金短缺、技术瓶颈等诸多困难。然而,创始人凭借对技术的热爱和对市场的敏锐洞察,带领团队攻克了一个又一个技术难题。同时,ZZ公司还积极寻求外部合作,与多家知名企业建立了紧密的合作关系,共同开发具有市场竞争力的显示屏产品。在团队成员的共同努力下,ZZ公司逐渐在Display Engineering Services领域崭露头角,成为了一家备受瞩目的创新型企业。

故事四:
AA公司的发展历程充满了挑战与机遇。在成立初期,公司面临着激烈的市场竞争和不断变化的客户需求。为了应对这些挑战,AA公司决定加大研发投入,不断提升自身的技术实力。同时,公司还积极拓展国际市场,与全球多家知名企业建立了合作关系。通过不断的技术创新和市场拓展,AA公司逐渐在Display Engineering Services领域树立了良好的品牌形象,赢得了客户的信赖和支持。

故事五:
BB公司是一家历史悠久的Display Engineering Services企业。多年来,公司始终坚持以客户需求为导向,不断提升服务质量和技术水平。为了保持竞争优势,BB公司不断引进先进的生产设备和技术人才,加强内部管理和质量控制。同时,公司还积极参与行业交流和合作,与国内外多家知名企业建立了良好的合作关系。在多年的发展中,BB公司积累了丰富的经验和技术优势,成为了行业内的领军企业之一。其显示屏解决方案广泛应用于各个领域,并获得了多项国内外技术专利和荣誉。

DIOO公司的发展小趣事

随着科技的不断发展,DIOO公司始终致力于技术创新和产品创新。在90年代初,DIOO公司推出了一款革命性的智能音响系统,该系统集成了最先进的音频处理技术、语音识别技术和人工智能技术,为用户提供了前所未有的便捷和智能体验。这一创新产品迅速在市场上占据了领先地位,并成为了DIOO公司的标志性产品之一。

喜美克斯(Cvilux)公司的发展小趣事

在追求经济效益的同时,喜美克斯公司也高度重视环境保护。他们积极采用环保材料和生产工艺,减少生产过程中的污染排放。此外,公司还积极参与各种环保公益活动,倡导绿色消费理念,为电子行业的可持续发展做出了积极贡献。

Churod Electronics Co Ltd公司的发展小趣事

中汇瑞德电子股份有限公司的创业之路并非一帆风顺。2006年,公司创始人周康平凭借对电子行业的深刻理解和前瞻视野,决定涉足继电器制造领域。当时,市场竞争激烈,技术门槛高,但周康平坚信,只要专注于技术研发和产品质量,就能在市场中脱颖而出。他带领团队日夜奋战,攻克了一个又一个技术难题,逐渐在继电器制造领域站稳了脚跟。

科通(COMTEK)公司的发展小趣事

面对快速变化的电子行业市场,科通技术始终坚持以技术创新为驱动,不断推动公司的转型升级。公司加大在研发方面的投入,积极引进先进的技术和设备,提升产品的技术含量和附加值。同时,科通技术还不断拓展业务领域,从单一的元器件分销逐渐发展到提供全方位的技术整合方案和应用方案,为客户提供更加全面、专业的服务。

Dongguan City Niuhang Electronics Co.LTD公司的发展小趣事

在快速发展的同时,Dongguan City Niuhang Electronics Co.LTD始终关注社会责任和可持续发展。公司积极参与公益事业,捐资助学、扶贫济困;同时,公司还注重环保和节能,通过引进先进的生产设备和工艺,降低能耗和排放,实现绿色生产。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了新的动力。

请注意,以上故事为虚构内容,旨在展示Dongguan City Niuhang Electronics Co.LTD可能经历的发展阶段和事件。实际情况可能有所不同,具体信息请参考公司官方发布的相关资料。

问答坊 | AI 解惑

传感器用电路

求助: 传感器在汽车应用中所用的电路设计,用什么软件,望能提供相关资料!     真诚谢谢!   邮箱: lj521999@126.com…

查看全部问答>

滤波器设计手册

滤波器设计手册…

查看全部问答>

Android移植之WIFI

1. 前言 硬件平台: marvel 310 软件平台: maemo4 内核: 2.6.28 (经过 marvel 的移植) 2. 移植思想 1, WIFI 模块本身和 cpu 之间的接口; 我们的模块和 cpu 之间的接口是 sdio 的,也就是说必须要先保证 SDIO 本身 ...…

查看全部问答>

华硕工厂资料-主板上电原理介绍

华硕工厂资料-主板上电原理介绍…

查看全部问答>

WinCE产品收费情况

公司开发产品,如果量很大的话,那么收费情况是什么样子的?像EVC,PB等开发工具是不是都要正版的?请教下…

查看全部问答>

如何通过串口给仪器发送ASCII码!

如何通过串口给仪器发送ASCII码!有没有好的思路探讨一下。最好是用C语言编写,纠结中啊。…

查看全部问答>

一个菜鸟,准备进入IC设计

    我想进入IC设计这方面的领域。以前学习软件开发,伴随着软件开发经验越多,感觉硬件太差,这时想搞清楚计算机电路设计构造,尤其是芯片设计。在网上查找了些资料,才发现这时有关IC设计领域的事情。     或许是软件经验太 ...…

查看全部问答>

美光360摄像头能够和支持656接口的dsp进行对接吗?

我象把美光360(MT9V011)作为我ipcamera的接口,而dsp只支持656接口,而MI360没有说是否支持656接口。360应该输出的就是数字RGB接口,CCIR656接口不知道能否支持RGB的格式。 …

查看全部问答>

一个有趣的小工具,总线直通车,bus pirate

网上看到一个老外做的有趣的小工具,bus pirate,就是利用PC做控制台,通过一个PIC单片机板子,模拟输出各种常用的单片机总线信号,比如I2C,SPI,1WIRE等等,这样就可以对常用的各种总线接口的芯片进行直接操作,不需要利用单片机编程序的麻 ...…

查看全部问答>

ISE VHDL 如何消除锁存器

写了一个状态机,从RAM里读读写写了64次,综合以后报警,说读写的地址端口有锁存器(12位地址,所以一共有24个). 上网查了一下,锁存器是只有if没有else时出现的,但修改以后锁存器一个没少。 下面是我程序的一部分, w_add      ...…

查看全部问答>