目录
跟x86汇编差不多,但是通用寄存器不一样
格式: 指令码 指令格式条件码 目标寄存器 ,源操作数1,源操作数2
立即数寻址 add R0,R0,#10.
把R0+10 赋值给R0
下面截图xcode中的反汇编
上面例子,xcode里面反汇编了main函数里面,add x29,sp,#0x20,是把 sp里的值 + 0x20 = 10进制的 32 ,然后复制给 x29,用
打印sp的值 p $sp
(unsigned long) $0 = 6171915024
6171915024 + 32 = 6171915056 ,然后把6171915056 赋值给x29
下面打印寄存器证明,计算结果正确,如下图:
寄存器寻址 add R0,R1,R2
把 R1+ R2赋值给R0
寄存器间接寻址:ldr R0,[R1]
[]中括号是取出存在地址里面的值, [R1]就是取出R1地址里面的值,然后放进R0.举例如下:
如下例子:
ldr x0, [x0]
打印 x0 = 4294983680
[x0]是取出里面的地址:
先转换成16进制 4294983680 =0x100004000
然后查看 0x100004000 地址里面的内容
查看地址内容命令,x/2w ,2是长度. x/2w 0x100004000
得到结果是 0x09743d78 0x00000002
然后我们运行运行一行,执行完以后查看x0的结果, 看看里面存储的是什么,p $x0
(lldb) p $x0
(unsigned long) $2 = 8748547448 ,转换成16进制是 0x209743D78 ,正好等于上面的 0x09743d78 0x00000002 ,02是进位以后的,放在高地址
xcode下运行截图如下:
基址变址寻址:
前索引 ldr r0,[r1,#10]
把r1 + 10 的地址,取出来值,放到 r0 ,[r1 ,#10]就是r1+ 10再,取地址里的值
自动索引 ldr r0,[r1,#4]!
在前索引基础上,新地址再写入r1,所有过程是: r1 + 4的地址,取出来值,写入r0,然后r1 = r1 + 4
后索引 ldr r0,[r1],#4
把 r1里面地址的内容赋值给r0 ,然后 r1 = r1 + 4