美文网首页
Swift - 汇编-1

Swift - 汇编-1

作者: 开了那么 | 来源:发表于2020-10-10 11:11 被阅读0次

1、常用寄存器

有16个常用寄存器
%rax. %rbx. %rcx. %rdx. %rsi. %rdi. %rbp. %rsp
%r8, %r9. %r10, %r11, %r12, %r13, %r14. %r15

  • 寄存器的具体用途
    • %rax常作为函数返回值使用
    • %rdi、%rsi、 %rdx. %rcx、 %r8、 %r9等寄存器常用于存放函数参数
    • %rsp、%rbp用于栈操作

X64位寄存器都是 R 开头,8个字节 ----- X32位寄存器都是 E 开头 4个字节

2、命令解析

movq -0X18(%rbp), %rax 将 -0X18(%rbp) 计算出来的地址内的数据存储到 %rax中

leaq -0X18(%rbp), %rax 将 -0X18(%rbp) 计算出来的地址存储到 %rax中

jmp 0x40010002 跳转到 0x40010002,继续往下执行

call 0x40010002 调用函数,跳转到 0x40010002,执行完成后会跳回到原来call 命令下一行的命令

mov(*) 移动指令 最后(*) 代表需要占用额内存长度,

XOR(*) 异或指令


image.png

3、rip 地址计算

var e = TestEnum. test1(10, 20, 30)

0x10000158f movq $0xa, 0x4be6(%rip) // rip + 0x4be6 -> 0x10000159a + 0x4be6 =

0x10000159a leaq 0x4bdf(%rip),%rax // rax =

0x1000015a1 movq $0x14, 0x4bdc(%rip) //

0x1000015ac movq $0x1e, 0x4bd9(%rip)

0x1000015b7 movb $0x0, 0x4bda(%rip)

rip存储的是指令的地址
CPU要执行的下条指令地址就存储在 rip中
q 8个字节
b 1个字节

4、lldb常用指令

  • 读取寄存器的值

    • register read/tIt
    • register read/x .
  • 修改内存中的值

    • memory write内存地址数值
    • memory write 0x0000010 10
  • expression 表达式

    • 可以简写: expr表达式
    • expression $rax
    • expression $rax = 1
  • 修改寄存器的值

    • register write寄存器名称数值
    • register write rax 0
  • 读取内存中的值

    • x/数量-格式-字节大小内存地址
    • x/3xw 0x0000010
字节大小
   b- byte 1字节
   h- half word 2字节
   W- word 4字节
   g - giant word 8字节
  • thread step-over、next、 n
    单步运行,把子函数当做整体-步执行(源码级别)
  • thread step-in、step、 s
    单步运行,遇到子函数会进入子函数(源码级别)S
  • tred step inst over. nexti ni
    单步运行,把子函数当做整体一步执行(汇编级别)
  • thread step-inst、stepi、 si
    单步运行,遇到子函数会进入子函数(汇编级别)
  • thread step-out、finish
    直接执行完当前函数的所有代码,返回到上一个函数(遇到断点会卡住)
内存地址格式为: 0x4bdc(%rip) , -般是全局变量,全局区(数据段)
内存地址格式为: -0x78(%rbp), - 般是局部变量,栈空间
内存地址格式为: 0x10(%rax) , 一般是堆空间.

相关文章

网友评论

      本文标题:Swift - 汇编-1

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