美文网首页
简单汇编

简单汇编

作者: 纳兰沫 | 来源:发表于2019-08-12 17:56 被阅读0次

    程序的本质

    软件\程序的执行过程

    软件\程序的执行过程.png

    寄存器和内存

    通常 CPU会先将内存中的数据存储到寄存器中 然后再对寄存器内的数据进行运算
    
    例子.png

    编程语言的发展

    1.机器语言
     - 由0和1组成
    2.汇编语言
     - 用符号代替了0和1 比机器语言便于阅读和记忆
    3.高级语言
     - C/C++/Java/JavaScript
    
    
    5C3FC3F4-147C-492C-B0CC-D2136B2A9736.png
    1.汇编语言和机器语言一一对应 每一条机器指令都有与之对应的汇编指令
    2.汇编语言可以通过编译得到机器语言 机器语言可以通过反汇编得到汇编语言
    3.高级语言可以通过编译得到汇编语言/机器语言 但是汇编语言/机器语言几乎不可能还原成高级语言
    

    汇编语言的种类

    - 8086汇编(16bit)
    - x86汇编(32bit)
    - x64汇编(64bit)
    - ARM汇编(嵌入式 移动设备)
    
    x86 x64汇编根据编译器的不同 有2种书写格式
    1.Intel Windows派系
    2.AT&T Unix派系
    

    ios 最主要的汇编语言 AT&T汇编 ios模拟器
    ARM汇编 ios真机

    汇编指令.png

    lea 地址赋值 mov 值赋值
    mov 是把地址里面的值取出来再复制 lea是把地址值直接赋值
    jmp 是跳转到相应的地址 然后继续往下执行 永远不回头
    call 函数调用 后面跟的函数地址 跳到这个地址 然后执行 跟retq配合使用 函数执行完 会跳回到call执行代码的下一行语句

    寄存器

    有16个常用寄存器
    1.%rax   %rbx     %rcx     %rdx    %rsi     %rdi     %rbp    %rsp
    2.%r8    %r9      %r10     %r11    %r12     %r13     %r14    %r15
    
    寄存器的具体用途
    1.%rax 常用作函数返回值使用
    2.%rcx   %rdx    %rsi    %rdi    %r8    %r9等寄存器常用于存放函数参数
    3.%rsp   %rbp用于栈操作
    4 rip 作为指令指针
       - 存储着CPU下一条要执行的指令的地址
       - 一旦CPU读取一条指令 rip会自动指向下一条指令(存储下一条指令的地址)
    

    r开头 64bit 8字节
    e开头 32bit 4字节
    ax bx cx 16bit 2字节
    ah al 8bit 1字节

    lldb常用指令

    读取寄存器的值
    register read rax 读取rax寄存器的值
    
    修改寄存器的值
    register write  寄存器名称  数值
    register write  rax 0
    
    读取内存中的值
    x/数量-格式-字节大小  内存地址
    x/3xw 0x0000010
    3 - 3组数据
    x - 16进制
    w - 字节大小 4个字节为一组
    
    字节大小
    - b  ---- byte  1字节
    - h  ---- half word  2字节
    - w  ---- word   4字节
    - g  ---- giant word  8字节
    
    格式
    -  x 16进制
    -  f 浮点
    -  d 是十进制
    
    修改内存中的值
    memory write  内存地址 数值
    memory write  0x0000010 10
    
    表达式
    - 可以简写  expr表达式
    - expression $rax
    - expression $rax = 1
    
    po 表达式
    print 表达式
    po/x $rax
    po (int)$rax

    thread step-over、 next、 n

    单步运行 把子函数当做整体一步执行(源码级别)
    

    thread step-in、 step、 s

    单步运行 遇到子函数会进行子函数(源码级别)
    

    thread step-over、 nexti、 ni

    单步运行 把子函数当做一个整体一步执行(汇编级别)
    

    thread step-insert 、stepi 、si

    单步运行 遇到子函数会进入子函数(汇编级别)
    

    thread step-out、 finish

    直接执行完当前函数的所有代码 返回到上一个函数(遇到断点会卡主)
    

    rip 存储的是指令的地址
    CPU要执行的下一条指令地址就存储在rip中

    相关文章

      网友评论

          本文标题:简单汇编

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