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) , 一般是堆空间.
网友评论