一、汇编语言的种类
- 1、8086汇编(16bit)
- 2、x86汇编(32bit)
- 3、x64汇编(64bit)
- 4、ARM汇编(嵌入式,移动设备)
x86和x64根据编译器的不同,有两种书写格式
* Intel: Windows派系
* AT&T: UNIX派系
作为iOS开发常用的汇编语言是
AT&T:iOS模拟器
ARM:iOS真机设备
二、常用汇编指令
项目 | AT&T | Intel | ARM | 说明 |
---|---|---|---|---|
寄存器命名 | %rax |
rax |
||
操作数顺序 | movq %rax,%rdx |
mov rdx,rax |
将rax的值赋值给rdx |
|
常数\立即数 | movq $0x10,%rax |
mov rax,0x10 |
将0x10赋值给rax |
|
内存赋值 | movq $0xa,0x1ff7(%rip) |
mov qword ptr[rip+0x1ff7],0xa |
将0xa赋值给地址为rip+0x1ff7的内存空间 |
|
jmp指令 |
Jmp *%rdx jmp 0x4001002 jmp *(%rax)
|
jmp rdx jmp 0x4001002 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 point)
q = quad(64 bit)
t = ten bytes(80-bit floating point)
1. 常用寄存器
- 有16个常用寄存器
rax、rbx、rcx、rdx、rax、rsi、rdi、rbp、rsp、rip
r8、r9、r10、r11、r12、r13、r14、r5、
-
寄存器的具体用途
rax、rdx 常作为函数返回值使用
rcx、rdx、rsi、rdi、r8、r9 常用于存放函数参数
rbp、rsp 常用于栈操作
rip 作为指令指针
rip 存储着CPU下一条要执行的指令的地址
一旦CPU读取一条指令,rip会自动指向下一条指令(存储下一条指令的地址)
三、lldb常用指令
- 寄存器
- 读取寄存器的值
register read/格式
register read/x
- 修改寄存器的值
register write 寄存器名称 数值
register write rax 0
- 内存
- 读取内存中的值
x/数量-格式-字节大小 内存地址
x/3xw ox00000010
- 修改内存中的值
memory write 内存地址 数值
memory write 0x00000010 10
- 打印
- po 表达式
po/x $rax
po (int)$rax
- print 表达式
- 数据和格式
- 格式
x是16进制,f是浮点,d是十进制
- 字节大小
b - byte 1字节
h - half word 2字节
w - word 4字节
g - giant word 8字节
- 调试指令
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),一般是堆空间
- 存储在硬盘中的一段程序
- 程序被加载到内存中
- cpu 对加载在内存中的程序进行读,运算以及写操作
网友评论