美文网首页
iOS 汇编

iOS 汇编

作者: Dosun | 来源:发表于2018-09-05 06:34 被阅读99次

一直在想 iOS 汇编是怎么样的,变量是怎么保存的?如何调函数的?如何判断条件的?昨天看了一天的汇编,也不是很懂,特别是adrp 指令有点难懂,碰到自己不会的东西,我自己是多去分析已知的汇编,将自己的汇编多看呗,看多自然就懂了。

阿里大牛知兵的知乎专栏
ARM64 汇编——寄存器和指令
iOS开发同学的arm64汇编入门
10分钟入门arm64汇编
ARM64 汇编——寄存器和指令
一般局部变量会存放在栈中,

OC 代码
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    int a = 10;
    int b = 20;
    int c = a + b;
    
    NSLog(@"%d",c);
}
其中int a = 10; int b = 20; int c = a + b;对应汇编如下。局部变量存放在栈,然后再取,最后加法操作
    0x10236e740 <+68>:  mov    w11, #0x14;将14存放在w11位
    0x10236e744 <+72>:  mov    w12, #0xa;将10存放在w12位
->  0x10236e748 <+76>:  str    w12, [sp, #0x1c];将w12存放在sp +28位,w只占用4位
    0x10236e74c <+80>:  str    w11, [sp, #0x18];将w11存放在sp +24位
    0x10236e750 <+84>:  ldr    w11, [sp, #0x1c];加载sp +28给w11
    0x10236e754 <+88>:  ldr    w12, [sp, #0x18];加载sp +24位给w12
    0x10236e758 <+92>:  add    w11, w11, w12;将w11 + w12 赋值给w11
转成汇编语言
-[ViewController viewDidLoad]:
    0x10236e6fc <+0>:   sub    sp, sp, #0x50 ; =0x50 将 sp 向下移动 16 x 5 = 80个字节,
    0x10236e700 <+4>:   stp    x29, x30, [sp, #0x40]; 将x29 = fp,x30 =lr ,lr 是下条返回地址,放在sp 向上移动64个的位置,x29 和 x30 各占用了8个字节
    0x10236e704 <+8>:   add    x29, sp, #0x40 ; fp 指向其赋值的位置
    0x10236e708 <+12>:  add    x8, sp, #0x20; 将sp+16数据存放在x8中
    0x10236e70c <+16>:  adrp   x9, 2 ;将 pc 的地址取到,pc = 0x00000001029d2798, x9 = 0x00000001029d4000
    0x10236e710 <+20>:  add    x9, x9, #0xca8; =0xca8 取方法的地址
    0x10236e714 <+24>:  adrp   x10, 2 ;
    0x10236e718 <+28>:  add    x10, x10, #0xcc8 ; =0xcc8 取方法地址
    0x10236e71c <+32>:  stur   x0, [x29, #-0x8];将x0 的数据放在fp - 8的位置
    0x10236e720 <+36>:  stur   x1, [x29, #-0x10];将x1 的数据放在fp - 16的位置
    0x10236e724 <+40>:  ldur   x0, [x29, #-0x8];将fp - 8的数赋值给x0
    0x10236e728 <+44>:  str    x0, [sp, #0x20];将x0 存放在 sp + 32地址中
    0x10236e72c <+48>:  ldr    x10, [x10];将x10 存放地址所指向的数据赋值给 x10
    0x10236e730 <+52>:  str    x10, [sp, #0x28];将x10数据存放在sp + 24
    0x10236e734 <+56>:  ldr    x1, [x9];将x1 的数据赋值给x9存方地址所指的空间。
    0x10236e738 <+60>:  mov    x0, x8;将x8 赋值给 x0
    0x10236e73c <+64>:  bl     0x10236eb84  ; symbol stub for: objc_msgSendSuper2; 调用父类方法
    0x10236e740 <+68>:  mov    w11, #0x14;将14存放在w11位
    0x10236e744 <+72>:  mov    w12, #0xa;将10存放在w12位
->  0x10236e748 <+76>:  str    w12, [sp, #0x1c];将w12存放在sp +28位,w只占用4位
    0x10236e74c <+80>:  str    w11, [sp, #0x18];将w11存放在sp +24位
    0x10236e750 <+84>:  ldr    w11, [sp, #0x1c];加载sp +28给w11
    0x10236e754 <+88>:  ldr    w12, [sp, #0x18];加载sp +24位给w12
    0x10236e758 <+92>:  add    w11, w11, w12;将w11 + w12 赋值给w11
    0x10236e75c <+96>:  str    w11, [sp, #0x14];将w11值给sp+20
    0x10236e760 <+100>: ldr    w11, [sp, #0x14];加载sp+20给w11
    0x10236e764 <+104>: mov    x0, x11;将x11的值给x0
    0x10236e768 <+108>: mov    x8, sp
    0x10236e76c <+112>: str    x0, [x8]
    0x10236e770 <+116>: adrp   x0, 2
    0x10236e774 <+120>: add    x0, x0, #0x60             ; =0x60 ;
    0x10236e778 <+124>: bl     0x10236eb3c               ; symbol stub for: NSLog
    0x10236e77c <+128>: ldp    x29, x30, [sp, #0x40];将sp + 64 位置将赋值给x29,x 30
    0x10236e780 <+132>: add    sp, sp, #0x50             ; =0x50 ;恢复sp平衡
    0x10236e784 <+136>: ret    

adrp, 用来定位数据段中的数据用, 因为aslr会导致代码及数据的地址随机化, 用adrp来根据pc做辅助定位(本人对adrp理解不够深入,里面不太懂);

sp 和 bp 之间空间是存放函数的变量。
x/s 打印寄存中的内容
po $x0

po (char*)$x0

(lldb) x/s $x1
0x18da1bbb3: "viewDidLoad"
(lldb) x/s $x0
0x113e0bd00: "\xffffffddL\xffffffa2"
(lldb) x/s $x2

相关文章

网友评论

      本文标题:iOS 汇编

      本文链接:https://www.haomeiwen.com/subject/jirbwftx.html