最近迷上cpu指令了,特别是arm指令 哥在手机和ipad上拖出个游戏程序 用ida逆了下再用gdb调试 真过隐啊^_^!!!
Tiny Machine 指令格式明显参考了ARM:
ADD r,s,t //reg[r] = reg[s] + reg[t],ARM 中,Add Rd,Rn,operand2 表示 Rd <-- Rn + operand2
AMD x86-64 与ARM 寄存器对照:
EFLAGS --当前程序状态寄存器(CPSR) R16
EIP --程序计数器(PC) R15
EBP --程序链接寄存器(SLR) R14
ESP --堆栈指针 R13
新增的R8--R15 --分组寄存器 R8--R14
EAX,EBX,ECX,EDX,ESI,EDI --未分组寄存器 R0-R7
Intel 64 的指令开始具备RISC特征:三地址指令,定长指令。
指令格式:
前缀|操作码|MOD_REG_R/M | SIB | 地址偏移 | 立即数 |
0-4个 | 1-2B必须 | 1B | 1B | 1-4B | 1,2,4B |
例子: objdump -d a.exe
" mov 0x10(%ebx),%eax " 的操作码为 " 8b 43 10 "
8b 的末尾两位为 11 -- Direction=1 Width = 1
43h = 01 000 011 -- 使用8位地址偏移 eax ebx
10h --- 0x10
MOD = {
00 -- 不使用地址偏移
01 -- 使用8位地址偏移
10 -- 使用16/32位地址偏移
11 -- 仅仅使用通用寄存器
}
REG = {
000 eax ss0 mm0
001 ecx ss1 mm1
010 edx ss2 mm2
011 ebx ... ....
100 esp/使用SIB
101 ebp
110 esi
111 edi
}
R/M ={
表示寄存器或内存,与REG同
}
SIB = |Scale 7-6 | Index 5-3 | Base 2-0 |
“所表示的地址 = Base + Index * 2 ^Scale, 其中 Base,Index 与 REG 同”
这不是三地址指令么,只是有些别扭而已。
参考文献:
http://www.intel.com/Assets/PDF/manual/253666.pdf