Swift-汇编基础

  • 汇编语言的种类
    8086汇编(16bit)
    x86汇编(32bit)
    x64汇编(64bit)
    ARM汇编(嵌入式,移动设备)

  • x86、x64汇编根据编译器的不同,有2种书写格式
    Intel:windows派系
    AT&T:Unix派系
    作为iOS开发工程师,主要的汇编是
    AT&T汇编 -> ios模拟器
    ARM汇编 —> ios真机设备

  • 有16个常用寄存器
    %rax %rbx %rcx %rdx %rsi %rdi %rbp %rsp
    %r8 %r9 %r10 %r11 %r12 %13 %14 %15

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

  • 自查用途
    1.可将寄存器内的数据执行算术及逻辑运算;
    2.存于寄存器内的地址可用来指向内存的某个位置,即寻址;
    3.可以用来读写数据到电脑的周边设备。

  • ax 累加器,得名原因是最初使用ADD AX,n这样的指令
    cx 计数器,得名原因是最常使用CX的值作为重复操作的次数
    bx 常用作地址寄存器,如MOV AX,[BX],把BX所指地址中的数取到AX中去
    dx 通用寄存器

  • 常见汇编指令:

操作AT&TIntel说明
寄存器命名%raxrax
操作数顺序movq %rax,%rdxmov rdx,rax
常数/立即数movq $3,%raxmov rax,3将3赋值给rax
movq $x10,%raxmov rax,0x10将0x10赋值给rax
内存赋值movq $0xa,0x1ff7(%rip)mov qword ptr [rip+0x1ff7],0xa将0xa赋值给地址为rip+0x1ff7的内存空间(数值赋值)
内存地址fuleaq -0x18(%rbp),%raxlea rax,[rbp-0x18]将rbp-0x18这个地址值赋值给rax(地址值赋值)[-0x18(%rbp) : (%rbp)地址值减去0x18]
jmp指令jmp *%rdxjmp rdx*代表间接调用,函数地址存储在后面的寄存器中
jmp 0x4001002jmp 0x4001002callq和jmp写法类似,jmp是跳转,callq是进入函数地址执行代码,retq配合callq使用进行返回
jmp *(%rax)jmp [rax]
操作数长度movl %eax,%edxmov edx,eaxb=byte(8-bit)
movb $0x10,%almov al,0x10s=short(16-bit integer or 32-bit floating point)
leaw 0x10(%dx),%axlea ax,[dx+0x10]w=word(16-bit)
l=long(32-bit integer or 64-bit floating point)
q=quad(64-bit)
t=ten bytes (80-bit floating point)
  • -lldb指令
    -读取寄存器的值
    register read/格式
    register read/x

  • -修改寄存器的值
    register write 寄存器名称 数值
    register write rax 0

  • -读取内存中的值
    x/数量-格式-字节大小 内存地址
    x/3xw 0x0000010

  • -修改内存中的值
    memory write 内存地址 数值
    memory write 0x0000010 10

  • -格式
    x是16进制,f是浮点,d是十进制

  • -字节大小
    b - byte 1字节
    h - half word 2字节
    w - word 4字节
    g - giant word 8字节

  • -expression 表达式
    可以简写:expr 表达式
    expression $rax
    expression $rax = 1

  • -po表达式
    -print 表达式
    -po/x $rax

  • -lldb常用指令
    -thread step-over/next/n
    单步运行,把子函数当做整体异步执行(源码级别)

  • -thread step-in/step/s
    单步运行,遇到子函数会进入子函数(源码级别)

  • -thread step-inst-over/nexti/ni
    单步运行,把子函数当做整体一步执行(汇编级别)

  • -thread step-inst/stepi/si
    单步运行,遇到子函数会进入子函数(汇编级别)

  • -thread step-out/finish
    直接执行完当前函数的所有代码,返回到上一个函数(遇到断点会卡住)

  • 汇编规律

  • 内存地址格式为:0x4bdc(%rip),一般是全局变量
    内存地址格式为:-0x78(%rbp),一般为局部变量
    内存地址格式为:0x10(%rax),一般是堆空间

  • rip是下一条汇编代码前面的那个地址,写死的
    rbp是外层函数的地址值,变的

  • 栈空间分配,从高到低

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值