armv8 里面似乎没有了 v7 中的块访存指令,就是一次性访问一块内存的指令。我们还是先介绍下 v7 中的块访存指令。
V7中的块访存指令
手册中介绍了很多种该指令的变种形式,其实了解了这个指令的英文含义就都很好理解。
LD - load,加载
M - Memory,内存
IA,IB,DA,DB,这四个表示的是模式。
FA,FD,EA,ED,这四个是针对特殊寄存器的特殊写法。
举个例子:
1E 00 90 E8 LDMIA R0, {R1-R4}
该指令表示的意思是,从 R0 表示的地址处开始读内存,一次性读4个64bit的数出来,放到 R1 到 R4 中。储存的顺序,就是序号顺序。我们看其格式描述:
寄存器列表一共占据了 16 位,可以描述 16 个寄存器,每一个位为1就表示需给该寄存器赋值。
1E 就是第1位到第4位是1。符合 R1 - R4 的描述。
下面,我们重点介绍一下指令后缀,IA,IB,DA,DB。
IA,IB,DA,DB
I - increase
A - after
D - decrease
B - before
知道了英文含义,应该就能理解其含义了,与**i++
** 和++i
差不多。
看指针行为,先读 R0 寄存器内存地址处的数据,读完再下移,直到 4 个数据都读完。最后R0的值是不变的。如果需要改变 R0 的值,需要加上 ! 后缀。
看指针行为,先下移,再读 R0 寄存器内存地址处的数据,直到 4 个数据都读完。最后R0的值是不变的。如果需要改变 R0 的值,需要加上 ! 后缀。
DA 与 DB 就是反着来的,就不重复了。
IB 与 DB 的行为和栈操作会比较像,push与 pop。
FA,FD,EA,ED
FD:满递减堆栈。
FA:满递增堆栈。
EA:空递减堆栈。
ED:空递增堆栈。
我们尝试在 ida 中 patch 一个指令:
stmdb sp!, {R0-R3}
发现,ida 给我们生成的指令是:
0F 00 2D E9 STMFD SP!, {R0-R3}
实际上,是因为该指令的第一个操作数是 SP,所以才会生成 FD 后缀。所以,STMFD 与 STMDB 是一样的。
比如,我们经常会在函数的头尾看到如下指令:
STMFD SP!, {R3-R7,LR}
...
...
LDMFD SP!, {R3-R7,PC}
第一条指令就是,保存 R3-R7 的值,保存返回地址,最后一条指令,就是还原 R3-R7 的值,将返回地址赋值给 PC。
V8中的块访存指令
虽然,V8中没有了V7中的那些指令,但是还有一个平替指令,就是 STP 指令,我们在函数头尾有时候也能见到。
看下 STP 指令的介绍:
stp 指令是 str 的变种指令,p 可以理解成 pair 的意思,可以同时操作两个寄存器。从V7中的最多操作16个,变成了2个,威力下降了不少。
举一个例子:
stp x29, x30, [sp, #0x10] ; 将 x29, x30 的值按序存入 sp 偏移 16 个字节的位置
看一下,mencpy 的汇编:
.text:000000000001C3E0 28 24 41 A9 LDP X8, X9, [X1,#0x10]
.text:000000000001C3E4 2A 2C 42 A9 LDP X10, X11, [X1,#0x20]
.text:000000000001C3E8 2C 34 43 A9 LDP X12, X13, [X1,#0x30]
.text:000000000001C3EC 81 08 7E A9 LDP X1, X2, [X4,#-0x20]
.text:000000000001C3F0 84 0C 7F A9 LDP X4, X3, [X4,#-0x10]
.text:000000000001C3F4 06 1C 00 A9 STP X6, X7, [X0]
.text:000000000001C3F8 08 24 01 A9 STP X8, X9, [X0,#0x10]
.text:000000000001C3FC 0A 2C 02 A9 STP X10, X11, [X0,#0x20]
.text:000000000001C400 0C 34 03 A9 STP X12, X13, [X0,#0x30]
.text:000000000001C404 A1 08 3E A9 STP X1, X2, [X5,#-0x20]
.text:000000000001C408 A4 0C 3F A9 STP X4, X3, [X5,#-0x10]
.text:000000000001C40C C0 03 5F D6 RET
对 STP 的指令使用还是比较疯狂的。
二手的程序员
红日初升,其道大光。河出伏流,一泻汪洋。潜龙腾渊,鳞爪飞扬。乳虎啸谷,百兽震惶。鹰隼试翼,风尘翕张。奇花初胎,矞矞皇皇。干将发硎,有作其芒。天戴其苍,地履其黄。纵有千古,横有八荒。前途似海,来日方长。
公众号