-
汇编语言的种类
8086汇编(16bit)
x86汇编(32bit)
x64汇编(64bit)
ARM汇编(嵌入式,移动设备) -
x86、x64汇编根据编译器的不同,有2种书写格式
Intel:windows派系
AT&T:Unix派系
作为iOS开发工程师,主要的汇编是
AT&T汇编 -> ios模拟器
ARM汇编 —> ios真机设备 -
有16个常用寄存器
%rax %rbx %rcx %rdx %rsi %rdi %rbp %rsp
%r8 %r9 %r10 %r11 %r12 %13 %14 %15 -
寄存器的具体用途
%rax常作为函数返回值使用
%rdi %rsi %rdx %rcx %r8 %r9等寄存器常用于存放函数参数
%rsp %rbp用与栈操作 -
自查用途
1.可将寄存器内的数据执行算术及逻辑运算;
2.存于寄存器内的地址可用来指向内存的某个位置,即寻址;
3.可以用来读写数据到电脑的周边设备。 -
ax 累加器,得名原因是最初使用ADD AX,n这样的指令
cx 计数器,得名原因是最常使用CX的值作为重复操作的次数
bx 常用作地址寄存器,如MOV AX,[BX],把BX所指地址中的数取到AX中去
dx 通用寄存器 -
常见汇编指令:
操作 | AT&T | Intel | 说明 |
---|---|---|---|
寄存器命名 | %rax | rax | |
操作数顺序 | movq %rax,%rdx | mov rdx,rax | |
常数/立即数 | movq $3,%rax | mov rax,3 | 将3赋值给rax |
movq $x10,%rax | mov rax,0x10 | 将0x10赋值给rax | |
内存赋值 | movq $0xa,0x1ff7(%rip) | mov qword ptr [rip+0x1ff7],0xa | 将0xa赋值给地址为rip+0x1ff7的内存空间(数值赋值) |
内存地址fu | leaq -0x18(%rbp),%rax | lea rax,[rbp-0x18] | 将rbp-0x18这个地址值赋值给rax(地址值赋值)[-0x18(%rbp) : (%rbp)地址值减去0x18] |
jmp指令 | jmp *%rdx | jmp rdx | *代表间接调用,函数地址存储在后面的寄存器中 |
jmp 0x4001002 | jmp 0x4001002 | callq和jmp写法类似,jmp是跳转,callq是进入函数地址执行代码,retq配合callq使用进行返回 | |
jmp *(%rax) | jmp [rax] | ||
操作数长度 | movl %eax,%edx | mov edx,eax | b=byte(8-bit) |
movb $0x10,%al | mov al,0x10 | s=short(16-bit integer or 32-bit floating point) | |
leaw 0x10(%dx),%ax | lea ax,[dx+0x10] | 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) |
-
-lldb指令
-读取寄存器的值
register read/格式
register read/x -
-修改寄存器的值
register write 寄存器名称 数值
register write rax 0 -
-读取内存中的值
x/数量-格式-字节大小 内存地址
x/3xw 0x0000010 -
-修改内存中的值
memory write 内存地址 数值
memory write 0x0000010 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 -
-lldb常用指令
-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),一般是堆空间 -
rip是下一条汇编代码前面的那个地址,写死的
rbp是外层函数的地址值,变的 -
栈空间分配,从高到低