汇编语言的一些基本指令

(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>:	b.eq	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>:	b.ne	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目标寄存器指定的地址处。

e : equal

ne : not equal

b: below

nb : not below

a : above

na : not above

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值