序
前文《arm64》、《arm32》已经介绍arm,aarch64优化的一些基本知识,本文着重介绍优化过程中容易混淆的点,或需注意的点。
1. 关于指令编码长度
1.1 aarch32
A32模式(ARM instruction sets),指令固定的编码长度为32bit
T32模式(Thumb instruction sets),指令可以编码成16bit长,也可编码成32bit长
1.2 aarch64
指令固定的编码长度为32bit
参考https://static.docs.arm.com/ddi0487/ca/DDI0487C_a_armv8_arm.pdf A1.3.2 The ARM instruction sets
2. 关于当前指令的地址
2.1 aarch32
在ARM32状态下,当前执行指令的地址通常是pc-8,而在Thumb状态下通常是pc-4。参考地址:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0013d/index.html 程序计数器(pc)
疑问?
指令的编码长度为32位,即4字节,为什么arm模式下,当前指令是pc-8:
拿ARMv7三级流水线做示例,如图,假设add指令fetch时,指令地址为pc1; add指令decode时,下一条指令sub又进入fetch阶段,此时pc2 = pc1 + 4; add指令execute时,sub指令后的cmp油进入fetch阶段,此时pc = pc2 + 4, 因此add指令执行时真正的pc地址pc1 = pc-8。
参考https://blog.csdn.net/lee244868149/article/details/49488575/
2.2 aarch64
在arm64状态下,当前执行指令的地址通常是pc,英文原文:
Program counter
The current Program Counter (PC) cannot be referred to by number as if part of the general register file and therefore cannot be used as the source or destination of arithmetic instructions, or as the base, index or transfer register of load and store instructions.
The only instructions that read the PC are those whose function it is to compute a PC-relative address (ADR, ADRP, literal load, and direct branches), and the branch-and-link instructions that store a return address in the link register (BL and BLR). The only way to modify the program counter is using branch, exception generation and exception return instructions.
Where the PC is read by an instruction to compute a PC-relative address, then its value is the address of that instruction. Unlike A32 and T32, there is no implied offset of 4 or 8 bytes.
参考http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/ch05s01s03.html 5.1.3. Registers
3. 关于形参超过指令个数,访问方法
3.1 aarch32
arm32下,前4个参数是通过r0~r3传递,第4个参数需要通过sp访问,第5个参数需要通过sp + 4 访问,第n个参数需要通过sp + 4*(n-4)访问。
3.2 aarch64
arm64下,前8个参数是通过x0~x7传递,第8个参数需要通过sp访问,第9个参数需要通过sp + 8 访问,第n个参数需要通过sp + 8*(n-8)访问。
4. aarch64下< Vn>.< Ts>[< index2>]的用法
示例: mov < Vd>.< Ts>[< index1>], < Vn>.< Ts>[< index2>]
其中Ts的值需要注意,只能是以下情况之一:
B
H
S
D
不要将Ts写成8B、2s等,因为是取矢量寄存器(Vn)中的元素,所以带数字是多此一举,反而导致在ios下编译有问题。
5. aarch64下imm需注意的地方
示例:cmp < Wn|WSP>, #< imm> {, < shift>}
其中imm是无符号立即数,取值范围[0, 4095]。
此处说明的是:在使用立即数的时候,需要看指令所支持的立即数范围。
6. aarch64下v寄存器的写法
示例: add v4.4H, v4.4H, V5.4H
指令有没有问题?在Linux下编是不会提示错误的,但是在ios下(mac电脑上编)会提示指令不合法,正确的写法:
add v4.4H, v4.4H, v5.4H 注意到没?V5.4H 改成了v5.4H,大小写!!!
上一篇:ARMv8-AArch64简述
下一篇:第七章 ARM 反汇编基础(七)(AArch64 汇编指令集)
推荐帖子
- 测控电路设计与应用
- 本书以测控电路设计为重点,较全面地介绍测控电路中典型单元电路的基本概念、原理、设计方法及应用实例等。重点讲述电路的外部特性,注重应用。全书共12章,第1章介绍测控电路的组成、功用及设计方法;第2章介绍传感器的基本概念和典型传感器的接口电路;第3~8章以模拟电路、集成电路为重点,介绍测控电路的典型单元电路设计方法,包括信号的放大、滤波、运算、转换、调制解调和振荡电路;第9章介绍典型执行器件的驱动电路;第10章介绍电路设计中的抗干扰技术;第11章介绍测控电路与计算机接口电路及应用,第12章
- arui1999 下载中心专版
- LM567cn
- 本帖最后由paulhyde于2014-9-1509:28编辑LM567cnLM567cn本帖最后由paulhyde于2014-9-1509:28编辑这都是啥啊?你不懂?还是自己的设计?对别人有借鉴意义吗?标题党的行为,令人讨厌。。。。。。。
- da610 电子竞赛
- CCS怎么读入.dat文件
- 请问一下,我用CCS怎么读入.dat文件。.dat文件是我用matlab生成的,生成时是按照CCS的格式要求的,里面存的是十进制的数组。我想把这些数在我的CCS里用起来,最好是能放进一个矩阵,但我不知道该怎么写这几句C语句。在网上看了不少,但都得不到准确解答,请大家帮忙。CCS怎么读入.dat文件
- txdaaron DSP 与 ARM 处理器
- ccs
- 你好,请问仿真器和ccs连接不上,应该怎么解决?ccs最好有截图?请描述一下具体环境,仿真器类型?具体问题具体对待,问题可能有几个方面“:软件安装有问题;软件配置问题(仿真器与具体型号匹配问题);3仿真器好坏。最好上图
- bingshuiwu DSP 与 ARM 处理器
- 使用IROM_Fusing_Tool对sd卡写入的数据怎么擦除
- 在使用sd烧写Linux系统到板载NANDFlash的时候显示如下图:,接下来插入到开发板上,选择sd卡启动,烧写成功。在上面的图中,我们可以看到sd卡总共有3805184个扇区,其中u-boou-movi.bin写在扇区3804110至扇区3805181中,kernel写在扇区3795918至扇区3799674中,root-qtopia.img和u-boot.binfornand分别在扇区3600000至3717941和扇区3800000至3800406中。现在如果我想擦除IROM_Fus
- lyp260846137 嵌入式系统
- 自制简单实用的C51单片机开发板
- 业余学习单片机好几年了,一直也没什么大的进展,全凭兴趣吧,开始学时也不知道要买什么样的开发板,花了560RMB从某网站买了块开发板,收到后就有点后悔了,主要是没有学习教程,配送的例程还是汇编的。汗......后来,后来索性300元买掉了。后来找到郭天祥老师的教程,发现那开发板很多都配不上,都需要自己改IO口,再回来又看到杜洋的面包板入门单片机觉得还不错,就用面包板插零件学习了一段时间,中途又玩了一段Arduino,后来觉得其不如51来的直接,就放下回到51上,一路来也
- jeanscyz 51单片机