前言
汇编语言是面向机器的程序设计语言,可以将其看成是各种 CPU 的机器指令的助记符集合。程序员可以使用汇编代码直接控制硬件系统工作,而且用汇编语言编写的程序具备执行速度快和占用内存少等优点。
在 Apple 平台上主流的汇编语言有 x86 汇编 和 ARM 汇编,
- 在移动设备上使用的是 ARM 汇编
这主要是因为 ARM 采用的是 RISC 架构,具备功耗低的优势
- 桌面平台使用的则是 x86 汇编。
iOS 模拟器的程序实际就是以 iOS 模拟器作为容器,运行在该容器中的 Mac OS 程序,所以它使用的汇编也是 x86 汇编。
我经常使用的 Hopper Disassemble V4 主要用来查看OC的伪代码,那Hopper是属于AT&T 还是 Intel分支?
AT&T 和 Intel
答案是:反汇编工具 Hopper Disassemble 和 IDA Pro 使用的是 Intel 汇编语法。
x86 汇编语言演变出两个语法分支: Intel和 AT&T,其中 Intel 语法在 MS-DOS 和 Windows 家族中占主导地位,而 AT&T 语法则常见于 UNIX 家族中。
值得注意的是在 Xcode 中的汇编语法使用的是 AT&T
AT&T 和 Intel的差异,主要体现在变量、常量、寄存器访问、间接寻址和偏移量
- 操作数前缀:AT&T 汇编语法中的寄存器名称都以 % 作为前缀,立即操作数则以 $ 作为前缀,而 Intel汇编语法的寄存器和立即数均无前缀修饰
- 操作数方向:在 AT&T 汇编语法中,第一个操作数为源操作数,第二个操作数为目的操作数,Intel 汇编语法的操作数顺序正好相反
- 寻址方式
段式寻址,其中 segreg 是段寄存器
地址计算的公式
address = disp + base + index * scale
其中 base 为基址,disp 为偏移地址,index * scale 决定了第几个元素,scale 为元素长度,只能为 2 的幂,index 默认为 0,scale 默认为 1。
disp/base/index/scale 全部都是可选的,
最终 AT&T 汇编指令的格式是 %segreg: disp(base,index,scale)
,
Intel 汇编指令的格式是 segreg: [base+index*scale+disp]。
寄存器
内存(Memory)为 CPU 存放指令和数据,内存本质上就是一个字节数组
处理器在执行指令的过程中,所有数据在寄存器里面都只是临时存放的,然后又会被送往别处,这也是“寄存器”得名的原因。
x86-64
中将通用寄存器从 8 个扩展到了 16 个,正因为如此,所以可以借助寄存器来保存程序状态,而不是像原先那样通过栈来保存程序状态,这极大地减少了访问内存的次数。
x86-64 有 16 个 64 位通用寄存器和 16 个浮点数寄存器,此外 CPU 还有一个 64 位的指令指针寄存器 rip,它存放了将要执行的下一条指令的地址。
- 16 个通用寄存器组
除了从 IA32 的扩展而来的 64 位寄存器:rax、rcx、rdx、rbx、rsi、rdi、rsp 和 rbp,还有新增加的 8 个寄存器 r8 - r15。16 个浮点数寄存器组则为 xmm0 - xmm15。
- 显示所有寄存器的值
register read -a 或 register read --all
(lldb) register read -a
General Purpose Registers:
rax = 0x00007ffee58c87a8
rbx = 0x00000000000000c1
rcx = 0x000000011c0b2000
rdx = 0x00007ffee58c81a0
rdi = 0x0000000000000000
rsi = 0x00000000000000c1
rbp = 0x00007ffee58c87c0
rsp = 0x00007ffee58c8190
r8 = 0x00007ffee58ca048
r9 = 0x0000000000000000
r10 = 0x00007ffee58c8800
r11 = 0x0000000000000001
r12 = 0x0000000000000000
r13 = 0x00000000000000c1
r14 = 0x00007ffee58c8e30
r15 = 0x0000b958139a179c
rip = 0x000000010e533fcf dyld`_dyld_debugger_notification + 1
rflags = 0x0000000000000246
cs = 0x000000000000002b
fs = 0x0000000000000000
gs = 0x0000000000000000
eax = 0xe58c87a8
ebx = 0x000000c1
ecx = 0x1c0b2000
edx = 0xe58c81a0
edi = 0x00000000
esi = 0x000000c1
ebp = 0xe58c87c0
esp = 0xe58c8190
r8d = 0xe58ca048
r9d = 0x00000000
r10d = 0xe58c8800
r11d = 0x00000001
r12d = 0x00000000
r13d = 0x000000c1
r14d = 0xe58c8e30
r15d = 0x139a179c
ax = 0x87a8
bx = 0x00c1
cx = 0x2000
dx = 0x81a0
di = 0x0000
si = 0x00c1
bp = 0x87c0
sp = 0x8190
r8w = 0xa048
r9w = 0x0000
r10w = 0x8800
r11w = 0x0001
r12w = 0x0000
r13w = 0x00c1
r14w = 0x8e30
r15w = 0x179c
ah = 0x87
bh = 0x00
ch = 0x20
dh = 0x81
al = 0xa8
bl = 0xc1
cl = 0x00
dl = 0xa0
dil = 0x00
sil = 0xc1
bpl = 0xc0
spl = 0x90
r8l = 0x48
r9l = 0x00
r10l = 0x00
r11l = 0x01
r12l = 0x00
r13l = 0xc1
r14l = 0x30
r15l = 0x9c
Floating Point Registers:
fctrl = 0x037f
fstat = 0x0000
ftag = 0x00
fop = 0x0000
fioff = 0x00000000
fiseg = 0x0000
fooff = 0x00000000
foseg = 0x0000
mxcsr = 0x00001f80
mxcsrmask = 0x0000ffff
stmm0 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xff 0xff}
stmm1 = {0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0xff 0xff}
stmm2 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
stmm3 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
stmm4 = {0x00 0x00 0x00 0x00 0x00 0x00 0xbc 0x87 0x0b 0xc0}
stmm5 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
stmm6 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0x07 0x40}
stmm7 = {0x00 0x00 0x00 0x00 0x00 0x00 0x60 0xc0 0x0a 0x40}
ymm0 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xff 0xff 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm1 = {0x74 0x72 0x6f 0x73 0x70 0x65 0x63 0x74 0x69 0x6f 0x6e 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm2 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm3 = {0x70 0x7a 0x76 0x74 0x2f 0x42 0x75 0x69 0x6c 0x64 0x2f 0x50 0x72 0x6f 0x64 0x75 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm4 = {0x63 0x74 0x73 0x2f 0x44 0x65 0x62 0x75 0x67 0x2d 0x69 0x70 0x68 0x6f 0x6e 0x65 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm5 = {0x73 0x69 0x6d 0x75 0x44 0x65 0x62 0x75 0x67 0x2d 0x69 0x70 0x68 0x6f 0x6e 0x65 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm6 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm7 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm8 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm9 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm10 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm11 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm12 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm13 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm14 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
ymm15 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
xmm0 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xff 0xff}
xmm1 = {0x74 0x72 0x6f 0x73 0x70 0x65 0x63 0x74 0x69 0x6f 0x6e 0x00 0x00 0x00 0x00 0x00}
xmm2 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
xmm3 = {0x70 0x7a 0x76 0x74 0x2f 0x42 0x75 0x69 0x6c 0x64 0x2f 0x50 0x72 0x6f 0x64 0x75}
xmm4 = {0x63 0x74 0x73 0x2f 0x44 0x65 0x62 0x75 0x67 0x2d 0x69 0x70 0x68 0x6f 0x6e 0x65}
xmm5 = {0x73 0x69 0x6d 0x75 0x44 0x65 0x62 0x75 0x67 0x2d 0x69 0x70 0x68 0x6f 0x6e 0x65}
xmm6 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
xmm7 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
xmm8 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
xmm9 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
xmm10 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
xmm11 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
xmm12 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
xmm13 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
xmm14 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
xmm15 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
Exception State Registers:
trapno = 0x00000001
err = 0x00000000
faultvaddr = 0x00007ffee58c8190
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。