定长指令:
50-57 PUSH EAX--PUSH EDI
58-5F POP EAX -- POP EDI
40-47 INC EAX -- INC EDI
48-4F DEC EAX -- DEC EDI
B0 XX--B3 XX MOV AL,XX ---MOV BL,XX
B4 XX--B7 XX MOV AH,XX---MOV BH,XX
B8 XXXXXXXX--BF XXXXXXXX MOV EAX,XX---MOV EDI,XX
91-97 XCHG EAX,ECX ---- XCHG EAX,EDI
90 NOP
70-7F 条件跳转 共两个字节 后跟一个字节立即数的偏移Ib(有符号)
如果条件成立 跳转到 当前指令地址+当前指令长度+Ib
最大值:向前跳7F 向后跳80
0F 80--0F 8F 条件跳转 共五个字节 后跟一个四个字节立即数的偏移Id(有符号)
如果条件成立 跳转到 当前指令地址+当前指令长度+Id
最大值:向前跳7FFFFFFF 向后跳80000000
0xE0 LOOPNE/LOOPNZ Ib(Jb)
0xE1 LOOPE/LOOPZ Ib(Jb)
0xE2 LOOP Ib(Jb) 只看ECX
0xE3 JrCXZ Ib(Jb)
0xE8 CALL Id(Jd)
0xE9 JMP Id(Jd)
8个段寄存器: ES CS SS DS FS GS LDTR TR (顺序固定)
(段寄存器实际是个结构体,共96位,其中仅16位是汇编指令可以访问到的)
16位汇编中为了寻址 32位 为了权限控制
0xEA JMP Ap (Ap:六字节长度的直接地址) 共7字节
JMP CS:Id 将Ap中的高2位赋值给CS,低4位直接赋值给EIP, 即跳转
004183D7 > EA 12345678 1B00 JMP FAR 001B:78563412
0xEB JMP Ib (Jb)
跳转到 当前指令地址 + 当前指令长度 + Ib
0xC3 RET 共1字节
EIP出栈 POP EIP
0xC2 RET Iw 共3字节
EIP出栈后,ESP = ESP + Iw
0XCB RETF (return far) 共1字节
出栈8个字节,低4个字节赋值给EIP,高4个字节中低2位赋值给CS
0xCA RETF Iw 共3字节
出栈8个字节,低4个字节赋值给EIP,高4个字节中低2位赋值给CS后,ESP = ESP + Iw
ret -> pop eip
retf -> pop eip, pop cs
变长指令:
88 MOV Eb,Gb G:通用寄存器
89 MOV Ev,Gv E:寄存器、内存
8A MOV Gb,Eb b:字节
8B MOV Gv,Ev v:word ,dword qword
内存操作对象,后面跟一个字节的ModR/M 8位
TABLE 2-2
67 Mod 11位寄存器 00 01 10 是内存
345 Reg/Opcode 决定G
12 R/M 100(无意义) 101(立即数(四字节)) 特殊
88 01 00 000 001 MOV byte ptr ds:[ECX], AL
89 01 00 000 001 MOV dwprd ptr ds:[ECX],EAX
88 82 (立即数)32位偏移 10 000 010 MOV byte ptr ds:[edx+(立即数)32位偏移],AL
R/M = 100 后面跟一个字节SIB
TABLE 2-3
88 84(4或C结尾含有SIB) (48)SIB (立即数)32位偏移 10 000 100 MOV byte ptr ds:[EAX+ECX*2 +(立即数)32位偏移], AL
01 001 000
67位代表Scale: 2的多少次方 1 2 4 8
345位代表 Index 代表8个通用寄存器
12位代表 Base 代表8个通用寄存器
none 代表不需要添加
80 65 08 FF
查表步骤:
1第一个字节为80 查 Table A-2 表,得到对应结构Eb,Ib
2.第二个字节为ModR/M,所以拆分 65
01 100 101
Mod 与R/M 字段 查Table2-2 得到对应的结构:[EBP+DIS8]
3. 100 字段 查找TableA-6 得到对应的操作码:AND
4.最终指令:
AND [ebp+dis8],Ib
AND byte ptr SS:[EBP+08],0xFF
说明 TAble A-2 i64 64位下无效 o64 64仅在64位下有效 d64 在64位下 以64位的长度运行
主表 TAble A-2
0F 80 2个字节的opcode
指令前缀:
1.段前缀
默认前缀 DS:[]
EBP ESP 前缀SS
EDI默认前缀ES
EIP 前缀 CS
2e-CS
36 -SS
3e-DS
26- ES
64-FS
65-GS
2.操作指令前缀,修改地址默认长度
50 PUSH EAX
66:50 PUSH AX
3.操作指令前缀,修改默认寻址方式
8801 MOV BYTE PTR DS:[ECX],AL
67:8801 MOV BYTE PTR DS:[BX+DI],AL