Swift3.0Swift5.0Swift

Swift语法 Swift5 【00 - 汇编】

2020-05-08  本文已影响0人  Liwx

iOS Swift 语法 底层原理内存管理分析 专题:【iOS Swift5语法】

00 - 汇编
01 - 基础语法
02 - 流程控制
03 - 函数
04 - 枚举
05 - 可选项
06 - 结构体和类
07 - 闭包
08 - 属性
09 - 方法
10 - 下标
11 - 继承
12 - 初始化器init
13 - 可选项


目录


01-程序的本质

Xcode调试中显示汇编代码Debug -> Debug Workflow -> Always Show Disassembly


01-软件/程序执行过程


02-寄存器和内存


03-编程语言的发展


04-编程语言的发展


05-汇编语言的种类


06-常用汇编指令

注意: 小括号()通常表示存放内存地址。

在AT&T指令中 $立即数的前称。

项目 AT&T Intel 说明
寄存器名称 %rax rax
操作数顺序 movq %rax, %rdx mov rdx, rax 将rax的值赋值给rdx
常数/立即数 movq $0x3, %rax mov rax, 0x3 将3赋值给rax
内存赋值 movq $0xa, 0x1ff7(%rip) mov qword ptr [rip+0x1ff7], 0xa 将0xa赋值给地址为rip+0x1ff7的内存空间
取内存地址 leaq -0x18(%rbp), %rax lea rax, [rbp-0x18] 将rbp-0x18这个地址值赋值给rax
jmp跳转指令 jmp *%rdx 或 jmp 0x4001002 或 jmp *(%rax) jmp rdx 或 jmp 0x4001002 或 je=mp [rax] call和jmp写法类似
操作数长度 movl %eax, %edx 或 movb $0x10, %al 或 leaw 0x10(%dx), %ax mov edx, eax 或 mob al, 0x10 或 lea ax, [dx+0x10] 参考操作数长度说明
  • b = byte(8-bit)
  • s = short(16-bit integer or 32-bit floating point)
  • w = word(16-bit)
  • l = long(32-bit integer or 63-bit floating point
  • q = quad(64-bit))
  • t = ten bytes(80-bit floating point)

07-寄存器


08-寄存器兼容

为兼容不同位数, 取64位rax寄存器低32位作为eax寄存器使用,低16位作为ax寄存器使用,ah作为高8位使用,al作为低8位使用

  • r开头: 64-bit
  • e开头: 32-bit
  • a, b, c, d开头:16-bit
  • ah, al, bh, bl ... l和h结尾8-bit,h: 高八位,l: 低八位
image.png

09-lldb常用指令

// 读取rax寄存器的值
(lldb) register read rax
    rax = 0x0000000100709e40
// 读取rax寄存器的值   
(lldb) register read/x rax
    rax = 0x0000000100709e40  
// 读取所有寄存器的值 
 (lldb) register read
General Purpose Registers:
      rax = 0x0000000100709e40
      rbx = 0x0000000000000000
      rcx = 0x00007fff81c908f8  libswiftCore.dylib`type metadata for Swift.Int
      rdx = 0x0000000100709e60
      rdi = 0x0000000100709e48
      rsi = 0x00007fff81c96588  libswiftCore.dylib`type metadata for Any + 8
      rbp = 0x00007ffeefbff4d0
      rsp = 0x00007ffeefbff4b0
       r8 = 0x00000000000005dd
       r9 = 0x00000000000005e2
      r10 = 0x00000000fffffffc
      r11 = 0x0000000000000000
      r12 = 0x0000000000000000
      r13 = 0x0000000000000000
      r14 = 0x0000000000000000
      r15 = 0x0000000000000000
      rip = 0x0000000100000bd2  00-汇编`_0_汇编.test() -> () + 50 at main.swift:13:14
   rflags = 0x0000000000000206
       cs = 0x000000000000002b
       fs = 0x0000000000000000
       gs = 0x0000000000000000  
(lldb) x/3xg 0x00007fff81c908f8
0x7fff81c908f8: 0x0000000000000200 0x00007fff683e58ec
0x7fff81c90908: 0x0000000000000000
lldb) memory write 0x00007fff81c908f8 0x10
(lldb) x/xg 0x00007fff81c908f8
0x7fff81c908f8: 0x0000000000000210
(lldb) memory write 0x00007fff81c908f8 0x20
(lldb) x/xg 0x00007fff81c908f8
0x7fff81c908f8: 0x0000000000000220

10-lldb常用指令(断点调试)


11-规律


iOS Swift 语法 底层原理内存管理分析 专题:【iOS Swift5语法】

下一篇: 01 - 基础语法


上一篇下一篇

猜你喜欢

热点阅读