arm汇编常用指令(0)

内存读写指令:

  1. str(store register)(stp双指令)指令: 将数据从寄存器读出来,存到内存中
  2. ldr(load register)(ldp双指令)指令:将数据从内存读出来,存到寄存器中
  3. ldrp : 例子 ldrp w9,[x8]   意思是x8地址值给w9
  4. stur:和1一样,只是sp减地址用这个 +用str
  5. ldur:和2一样,只是sp减地址用这个 +用ldr
  6. register write x0 0xffffffff: 往寄存器x0赋值
  7. register read x0 0xffffffff:从寄存器xo读值
  8. bl:将下一条指令的地址放入lr(x30)寄存器,转到标号处执行指令
  9. ret: 跳转到(lr)x30指向的地方(ARM64平台特色指令,它面向硬件做了优化处理)
  10. pc寄存器 指向即将执行的代码地址
  11. sp指向栈
  12. cpsr状态寄存器:当前状态
  13. adrp:计算指定的数据地址到当前pc寄存器值相对偏移 (adrp x0,1      1. :将1的值左移12位(12位由CPU决定,其他CPU不一定)2.将PC寄存器低12位清0  3.将1和2结果相加给x0寄存器 ) 去除一个全局变量
  14. w0-w7/x0-x7:参数,多余的入栈
  15. x0/w0: 返回值
  16. x30/w30: 函数嵌套保存的内部函数返回值
  17. CMP: 比较,会影响标记寄存器(如:CMP w0,w1 :w0-w1)
  18. subs: 减 并改变标记寄存器 (sub:减  不会改变标记寄存器)
  19. B.LE:  满足小于等于,跳转
  20. B.GT 标号:比较结果是大于(greater than),执行标号,否则不跳转
  21. B.GE 标号:比较结果是大于等于(greater than or equal to),执行标号,否则不跳转
  22. B.EQ 标号:比较结果是等于,执行标号,否则不跳转
  23. B.HI 标号:比较结果是无符号大于,执行标号,
  24. ldrsw x10, [x8, x9, lsl #2]  :x10= (x8+(x9左移2位))地址, 不懂看下面例子 (为什么是4个字节?w一个字)

 

 


例子:

1. adrp

解析:0x1002e6894 > 0x1002e7894  (1偏移12位) > 0x1002e7000 (低12位清0)

2.adrp

解析:根据adrp特性,0x100529384

  1. 0x100529384低12位清0  > 0x100529000,
  2. 0x100529000然后低12位置+0(adrp x8,0,这是几加几)也就是不变   > 0x100529000
  3. 然后0x100529000+0x5cc =0x1005265cc     >  0x1005265cc

lldb: memory read  0x1005265cc     得到的机构要每4个字节从右向左取值(比如: 23 ff ff ff 77 ff ff ff 98 ff ff ff > 读成ffffff23,ffffff77, ffffff98)

lldb: p (char *)0x1005265cc

3.ldrsw x10, [x8, x9, lsl #2] 什么意思?

x8+ (以x8作为基地址,x9左移2位),由上面分析可知x9=1,

  1. x9(1)左移2位是 4
  2. x8+4也就是上面的79 22 32 34 00 42 33 32 40 30 3a 38 40 22 55 49….向右偏移4个字节,也就是从00…开始
  3. x10=00 42 33 32,也就是0x32334200
  4. register read x10 可以验证第3步地址对不对

4.一个字word几个字节?

8bit=1字节,一个字word占32位=4个字节

发表回复

电子邮件地址不会被公开。 必填项已用*标注

Protected with IP Blacklist CloudIP Blacklist Cloud