常见的汇编指令、寄存器、lldb指令

汇编语言的种类:

  • 1.8086汇编(16bit)
    2.x86汇编 (32bit)
    3.x64汇编 (64bit)
    4.ARM汇编 (嵌入式 移动设备)

常见的汇编指令

项目 AT&T- Intel 说明
寄存器命名 %rax rax
操作数顺序 movq %rax,%rdx mov rdx,rax 将 rax的值赋值给 rdx
常数/立即数 movq \$3,%rax
movq $0x10,%rax
mov rax,3
mov rax,0x10
将3赋值给rax
将10赋值给rax
内存赋值 movq 0xa,0x1ff7(%rip) mov qword ptr[rip+0x1ff7],0xa 将 0xa赋值给地址为 rip+0x1ff7 的内存
取内存地址 movq -0x18(%rbp),%rax lea rax,[rbp - 0x18] 将 rep - 0x18 这个地址值赋值给 rax
jmp指令 jmp *%rdx
jmp 0x40001002
jmp *(%rax)
jmp rdx
jmp 0x40001002
jmp [rax]
call和jmp写法类似
操作数长度 movl %eax,%edx
movb $0x10,%al
leaw 0x10(%dx),%ax
mov edx,eax
mov 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 64-bit floating pint)
q = quad(64-bit)
t = ten bytes(80-bit floating pint)

寄存器

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

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

lldb常用指令

  • 读取寄存器的值
    register read/格式
    register read/x

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

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

  • 修改内存中的值
    memory write 内存地址 数值
    memory write 0x00000010 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
    po (int)$rax

  • 单步运行,把子函数当作整体一步执行(源码级别
    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),一般是 堆空间

你可能感兴趣的:(常见的汇编指令、寄存器、lldb指令)