(gdb) disas
Dump of assembler code for function art::RuntimeCallbacks::DdmPublishChunk(unsigned int, art::ArrayRef<unsigned char const> const&):
0x0000007e80e329e0 <+0>: stp x22, x21, [sp,#-48]!
0x0000007e80e329e4 <+4>: stp x20, x19, [sp,#16]
0x0000007e80e329e8 <+8>: stp x29, x30, [sp,#32]
0x0000007e80e329ec <+12>: add x29, sp, #0x20
0x0000007e80e329f0 <+16>: ldp x21, x22, [x0,#168]
0x0000007e80e329f4 <+20>: mov x19, x2
0x0000007e80e329f8 <+24>: mov w20, w1
0x0000007e80e329fc <+28>: cmp x21, x22
0x0000007e80e32a00 <+32>: 0x7e80e32a24 <art::RuntimeCallbacks::DdmPublishChunk(unsigned int, art::ArrayRef<unsigned char const> const&)+68>
0x0000007e80e32a04 <+36>: ldr x0, [x21],#8
0x0000007e80e32a08 <+40>: mov w1, w20
0x0000007e80e32a0c <+44>: mov x2, x19
0x0000007e80e32a10 <+48>: ldr x8, [x0]
0x0000007e80e32a14 <+52>: ldr x8, [x8,#16]
0x0000007e80e32a18 <+56>: blr x8
=> 0x0000007e80e32a1c <+60>: cmp x22, x21
0x0000007e80e32a20 <+64>: 0x7e80e32a04 <art::RuntimeCallbacks::DdmPublishChunk(unsigned int, art::ArrayRef<unsigned char const> const&)+36>
0x0000007e80e32a24 <+68>: ldp x29, x30, [sp,#32]
0x0000007e80e32a28 <+72>: ldp x20, x19, [sp,#16]
0x0000007e80e32a2c <+76>: ldp x22, x21, [sp],#48
0x0000007e80e32a30 <+80>: ret
End of assembler dump.
已gdb中一次打印
注意: ARM64开始取消32位的LDM, STM, PUSH, POP指令. 与之替代的是 ldr/ ldp, str/ stp
ARM64里面 对栈的操作都是16进制对齐的!!!
ARM64下, 参数都是保存在x0-x7 (w0-w7) 这8个寄存器中, 如果超过这8个参数就会入栈, 函数的返回值是放在 x0寄存器中的.
函数的局部变量都是保存在栈里面.
栈
栈就是指令执行时存放临时变量的内存空间,具有特殊的访问方式:后进先出, Last In Out Firt。
-
栈是从高地址到低地址存储数据的,栈底是高地址,栈顶是高地址。
-
FP指向栈底
-
SP指向栈顶
MOV
MOV X1,X0 ; 将寄存器X0的值传送到寄存器X1
STR
(store register)写入指令
将数据从寄存器中读出来, 写入到内存中
STR(条件) 源寄存器,<存储器地址>
STR R0, [R1] ,意思是R0-> [R1],它把源寄存器写在前面,跟MOV、LDR都相反。
ldr
(load register)读取指令
将数据从内存中读取出来, 存到寄存器中,LDR:通常都是作加载指令的,但是它也可以作伪指令
- LDR r0,[r1] //将R1中的值存到r0中
- LDR r1,[r2,#16] //将(r2+16)地址中的内容存到r1中
- LDR r1,[r2],#4 //将r2地址中的内容存到r1中,同时r2=r2+4
ldp/stp
是 ldr/str 的衍生, 可以同时读/写两个寄存器, ldr/str只能读写一个
sub sp, sp, #0x20 ; 拉伸栈空间32(20 = 2*16)个字节
stp x0 , x1, [sp, #0x10] ; sp往上加16(10 = 1 * 16)个字节,存放x0 和 x1
ldp x1 , x0, [sp, #0x10] ; 将sp偏移16个字节的值取出来,放入x1 和 x0
CMP
cmp是比较指令,cmp的功能相当于减法指令。它不保存结果,只是影响相应的标志位
cmp指令格式: cmp 操作对象1, 操作对象2
mov al, 05h
mov bl, 08h
cmp al, bl (al - bl = -3h)
bl: 跳转指令
ret: 返回指令
ret {Xm}:跳转到由Xm目标寄存器指定的地址处。