汇编语言的种类:
- 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) |
寄存器
- 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)
,一般是堆空间