机器码
二进制代码表示的计算机能直接识别和执行的一种机器指令集。能被CPU直接解读。
一条指令需包含:
1.操作码
2.操作数的地址
3.操作结果的存储地址
4.下条指令的地址
一条指令实际上包括操作码和地址码。操作码用来表示该指令所要完成的操作;地址码用来描述该指令的操作对象(直接给出操作数/指出操作数的存储器地址/寄存器名)
操作码
一般占用1个字节(8位)或2个字节(16位)。最低位(W)一般表示目标操作数的位宽:W=0表示8字节长操作数,W=1表示双字节长操作数。eg:
00000000B表示:ADD 8位寄存器,8位寄存器
00000001B表示:ADD 16位寄存器,16位寄存器
地址码
一般占用1个字节,8位分为三组,形式一般为“aa(mod)bbb(reg)ccc(r/m)”
aa——指令寄存器寻址方式
1)00:如果mmm=110,则指令后跟一个地址偏移量;否则未使用地址偏移量。(寄存器间接寻址)
2)01:指令后跟一个8位无符号地址偏移量。(寄存器相对寻址偏移)
3)10:指令后跟一个16位无符号地址偏移量。(寄存器相对寻址偏移)
4)11:mmm表示为一个寄存器而非地址。(寄存器寻址)
bbb——通用寄存器或opcode的编码
bbb | W=0 | W=1 | 32位 |
---|---|---|---|
000 | AL | AX | EAX |
001 | CL | CX | ECX |
010 | DL | DX | EDX |
011 | BL | BX | EBX |
100 | AH | SP | ESP |
101 | CH | BP | EBP |
110 | DH | SI | ESI |
111 | BH | DI | EDI |
ccc——第一个寄存器的编码
1)000:DS:[BX+SI]
2)001:DS:[BX+DI]
3)010:SS:[BP+SI]
4)011:SS:[BP+DI]
5)100:DS:[SI]
6)101:DS:[DI]
7)110:SS:[BP]
8)111:DS:[BX]
sss——段寄存器
1)000:ES
2)001:CS
3)010:SS
4)011:DS
5)100:FS(386+)
6)101:GS(386+)
实例
mov ax, [BP+0]:8B 46 00
8B(01001011):
W=1→mov 双字长操作数
46(01 000 110):
aa=01→指令后跟8位无符号地址偏移量
bbb=000→AX(W=1)
ccc=110→SS:[BP]
00:
aa=01带的8位无符号地址偏移量
机器码,汇编指令以及ASCII码对照
十进制 | 机器码 | 汇编指令 | ASCII字符 | 字符含义 |
---|---|---|---|---|
0 | 0x00 | ADD reg8/mem8,reg8 | NUL(null) | 空字符 |
1 | 0x01 | ADD reg16/mem16,reg16 | SOH(start of headline) | 标题开始 |
2 | 0x02 | ADD reg8,reg8/mem8 | STX (start of text) | 正文开始 |
3 | 0x03 | ADD reg16,reg16/mem16 | ETX (end of text) | 正文结束 |
4 | 0x04 | ADD AL,immed8 | EOT (end of transmission) | 传输结束 |
5 | 0x05 | ADD AX,immed16 | ENQ (enquiry) | 请求 |
6 | 0x06 | PUSH es | ACK (acknowledge) | 收到通知 |
7 | 0x07 | POP es | BEL (bell) | 响铃 |
8 | 0x08 | OR reg8/mem8,reg8 | BS (backspace) | 退格 |
9 | 0x09 | OR reg16/mem16,reg16 | HT (horizontal tab) | 水平制表符 |
10 | 0x0A | OR reg8,reg8/mem8 | LF (NL line feed, new line) | 换行键 |
11 | 0x0B | OR reg16,reg16/mem16 | VT (vertical tab) | 垂直制表符 |
12 | 0x0C | OR al,immed8 | FF (NP form feed, new page) | 换页键 |
13 | 0x0D | OR ax,immed16 | CR (carriage return) | 回车键 |
14 | 0x0E | PUSH cs | SO (shift out) | 不用切换 |
15 | 0x0F | Not used | SI (shift in) | 启用切换 |
16 | 0x10 | ADC reg8/mem8,reg8 | DLE (data link escape) | 数据链路转义 |
17 | 0x11 | ADC reg16/mem16,reg16 | DC1 (device control 1) | 设备控制1 |
18 | 0x12 | ADC reg8,reg8/mem8 | DC2 (device control 2) | 设备控制2 |
19 | 0x13 | ADC reg16,reg16/mem16 | DC3 (device control 3) | 设备控制3 |
20 | 0x14 | ADC al,immed8 | DC4 (device control 4) | 设备控制4 |
21 | 0x15 | ADC ax,immed16 | NAK (negative acknowledge) | 拒绝接收 |
22 | 0x16 | PUSH ss | SYN (synchronous idle) | 同步空闲 |
23 | 0x17 | POP ss | ETB (end of trans. block) | 结束传输块 |
24 | 0x18 | SBB reg8/mem8,reg8 | CAN (cancel) | 取消 |
25 | 0x19 | SBB reg16/mem16,reg16 | EM (end of medium) | 媒介结束 |
26 | 0x1A | SBB reg8,reg8/mem8 | SUB (substitute) | 代替 |
27 | 0x1B | SBB reg16,reg16/mem16 | ESC (escape) | 换码(溢出) |
28 | 0x1C | SBB al,immed8 | FS (file separator) | 文件分隔符 |
29 | 0x1D | SBB ax,immed16 | GS (group separator) | 分组符 |
30 | 0x1E | PUSH ds | RS (record separator) | 记录分隔符 |
31 | 0x1F | POP ds | US (unit separator) | 单元分隔符 |
32 | 0x20 | AND reg8/mem8,reg8 | (space) | 空格 |
33 | 0x21 | AND reg16/mem16,reg16 | ! | 叹号 |
34 | 0x22 | AND reg8,reg8/mem8 | “ | 双引号 |
35 | 0x23 | AND reg16,reg16/mem16 | # | 井号 |
36 | 0x24 | AND al,immed8 | $ | 美元符 |
37 | 0x25 | AND ax,immed16 | % | 百分号 |
38 | 0x26 | Segment override | & | 和号 |
39 | 0x27 | DAA | ‘ | 闭单引号 |
40 | 0x28 | SUB reg8/mem8,reg8 | ( | 开括号 |
41 | 0x29 | SUB reg16/mem16,reg16 | ) | 闭括号 |
42 | 0x2A | SUB reg8,reg8/mem8 | * | 星号 |
43 | 0x2B | SUB reg16,reg16/mem16 | + | 加号 |
44 | 0x2C | SUB al,immed8 | , | 逗号 |
45 | 0x2D | SUB ax,immed16 | - | 减号/破折号 |
46 | 0x2E | Segment override | . | 句号 |
47 | 0x2F | DAS | / | 斜杠 |
48 | 0x30 | XOR reg8/mem8,reg8 | 0 | 字符0 |
49 | 0x31 | XOR reg16/mem16,reg16 | 1 | 字符1 |
50 | 0x32 | XOR reg8,reg8/mem8 | 2 | 字符2 |
51 | 0x33 | XOR reg16,reg16/mem16 | 3 | 字符3 |
52 | 0x34 | XOR al,immed8 | 4 | 字符4 |
53 | 0x35 | XOR ax,immed16 | 5 | 字符5 |
54 | 0x36 | Segment override | 6 | 字符6 |
55 | 0x37 | AAA | 7 | 字符7 |
56 | 0x38 | CMP reg8/mem8,reg8 | 8 | 字符8 |
57 | 0x39 | CMP reg16/mem16,reg16 | 9 | 字符9 |
58 | 0x3A | CMP reg8,reg8/mem8 | : | 冒号 |
59 | 0x3B | CMP reg16,reg16/mem16 | ; | 分号 |
60 | 0x3C | CMP al,immed8 | < | 小于 |
61 | 0x3D | CMP ax,immed16 | = | 等号 |
62 | 0x3E | Segment override | > | 大于 |
63 | 0x3F | AAS | ? | 问号 |
64 | 0x40 | INC ax | @ | 电子邮件符号 |
65 | 0x41 | INC cx | A | 大写字母A |
66 | 0x42 | INC dx | B | 大写字母B |
67 | 0x43 | INC bx | C | 大写字母C |
68 | 0x44 | INC sp | D | 大写字母D |
69 | 0x45 | INC bp | E | 大写字母E |
70 | 0x46 | INC si | F | 大写字母F |
71 | 0x47 | INC di | G | 大写字母G |
72 | 0x48 | DEC ax | H | 大写字母H |
73 | 0x49 | DEC cx | I | 大写字母I |
74 | 0x4A | DEC dx | J | 大写字母J |
75 | 0x4B | DEC bx | K | 大写字母K |
76 | 0x4C | DEC sp | L | 大写字母L |
77 | 0x4D | DEC bp | M | 大写字母M |
78 | 0x4E | DEC si | N | 大写字母N |
79 | 0x4F | DEC di | O | 大写字母O |
80 | 0x50 | PUSH ax | P | 大写字母P |
81 | 0x51 | PUSH cx | Q | 大写字母Q |
82 | 0x52 | PUSH dx | R | 大写字母R |
83 | 0x53 | PUSH bx | S | 大写字母S |
84 | 0x54 | PUSH sp | T | 大写字母T |
85 | 0x55 | PUSH bp | U | 大写字母U |
86 | 0x56 | PUSH si | V | 大写字母V |
87 | 0x57 | PUSH di | W | 大写字母W |
88 | 0x58 | POP ax | X | 大写字母X |
89 | 0x59 | POP cx | Y | 大写字母Y |
90 | 0x5A | POP dx | Z | 大写字母Z |
91 | 0x5B | POP bx | [ | 开方括号 |
92 | 0x5C | POP sp | \ | 反斜杠 |
93 | 0x5D | POP bp | ] | 闭方括号 |
94 | 0x5E | POP si | ^ | 脱字符 |
95 | 0x5F | POP di | _ | 下划线 |
96 | 0x60 | PUSHA | ` | 开单引号 |
97 | 0x61 | POPA | a | 小写字母a |
98 | 0x62 | BOUND reg16/mem16,reg16 | b | 小写字母b |
99 | 0x63 | Not used | c | 小写字母c |
100 | 0x64 | Not used | d | 小写字母d |
101 | 0x65 | Not used | e | 小写字母e |
102 | 0x66 | Not used | f | 小写字母f |
103 | 0x67 | Not used | g | 小写字母g |
104 | 0x68 | PUSH immed16 | h | 小写字母h |
105 | 0x69 | IMUL reg16/mem16,immed16 | i | 小写字母i |
106 | 0x6A | PUSH immed8 | j | 小写字母j |
107 | 0x6B | IMUL reg8/mem8,immed8 | k | 小写字母k |
108 | 0x6C | INSB | l | 小写字母l |
109 | 0x6D | INSW | m | 小写字母m |
110 | 0x6E | OUTSB | n | 小写字母n |
111 | 0x6F | OUTSW | o | 小写字母o |
112 | 0x70 | JO immed8 | p | 小写字母p |
113 | 0x71 | JNO immed8 | q | 小写字母q |
114 | 0x72 | JB immed8 | r | 小写字母r |
115 | 0x73 | JNB immed8 | s | 小写字母s |
116 | 0x74 | JZ immed8 | t | 小写字母t |
117 | 0x75 | JNZ immed8 | u | 小写字母u |
118 | 0x76 | JBE immed8 | v | 小写字母v |
119 | 0x77 | JA immed8 | w | 小写字母w |
120 | 0x78 | JS immed8 | x | 小写字母x |
121 | 0x79 | JNS immed8 | y | 小写字母y |
122 | 0x7A | JP immed8 | z | 小写字母z |
123 | 0x7B | JNP immed8 | { | 开花括号 |
124 | 0x7C | JL immed8 | | | |
125 | 0x7D | JNL immed8 | } | 闭花括号 |
126 | 0x7E | JLE immed8 | ~ | 波浪号 |
127 | 0x7F | JG immed8 | DEL (delete) | 删除 |
128 | 0x80 | Table2 reg8 | ||
129 | 0x81 | Table2 reg16 | ||
130 | 0x82 | Table2 reg8 | ||
131 | 0x83 | Table2 reg8, reg16 | ||
132 | 0x84 | TEST reg8/mem8,reg8 | ||
133 | 0x85 | TEST reg16/mem16,reg16 | ||
134 | 0x86 | XCHG reg8,reg8 | ||
135 | 0x87 | XCHG reg16,reg16 | ||
136 | 0x88 | MOV reg8/mem8,reg8 | ||
137 | 0x89 | MOV reg16/mem16,reg16 | ||
138 | 0x8A | MOV reg8,reg8/mem8 | ||
139 | 0x8B | MOV reg16,reg16/mem16 | ||
140 | 0x8C | MOV reg16/mem16,segReg | ||
141 | 0x8D | LEA reg16,reg16/mem16 | ||
142 | 0x8E | MOV segReg,reg16/mem16 | ||
143 | 0x8F | POP reg16/mem16 | ||
144 | 0x90 | NOP | ||
145 | 0x91 | XCHG ax,cx | ||
146 | 0x92 | XCHG ax,dx | ||
147 | 0x93 | XCHG ax,bx | ||
148 | 0x94 | XCHG ax,sp | ||
149 | 0x95 | XCHG ax,bp | ||
150 | 0x96 | XCHG ax,si | ||
151 | 0x97 | XCHG ax,di | ||
152 | 0x98 | CBW 99CWD | ||
154 | 0x9A | CALL immed32 | ||
155 | 0x9B | WAIT | ||
156 | 0x9C | PUSHF | ||
157 | 0x9D | POPF | ||
158 | 0x9E | SAHF | ||
159 | 0x9F | LAHF | ||
160 | 0xA0 | MOV al,[mem8] | ||
161 | 0xA1 | MOV ax,[mem16] | ||
162 | 0xA2 | MOV [mem8],al | ||
163 | 0xA3 | MOV [mem16],ax | ||
164 | 0xA4 | MOVSB | ||
165 | 0xA5 | MOVSW | ||
166 | 0xA6 | CMPSB | ||
167 | 0xA7 | CMPSW | ||
168 | 0xA8 | TEST al,[mem8] | ||
169 | 0xA9 | TEST ax,[mem16] | ||
170 | 0xAA | STOSB | ||
171 | 0xAB | STOSW | ||
172 | 0xAC | LODSB | ||
173 | 0xAD | LODSW | ||
174 | 0xAE | SCASB | ||
175 | 0xAF | SCASW | ||
176 | 0xB0 | MOV al,immed8 | ||
177 | 0xB1 | MOV cl,immed8 | ||
178 | 0xB2 | MOV dl,immed8 | ||
179 | 0xB3 | MOV bl,immed8 | ||
180 | 0xB4 | MOV ah,immed8 | ||
181 | 0xB5 | MOV ch,immed8 | ||
182 | 0xB6 | MOV dh,immed8 | ||
183 | 0xB7 | MOV bh,immed8 | ||
184 | 0xB8 | MOV ax,immed16 | ||
185 | 0xB9 | MOV cx,immed16 | ||
186 | 0xBA | MOV dx,immed16 | ||
187 | 0xBB | MOV bx,immed16 | ||
188 | 0xBC | MOV sp,immed16 | ||
189 | 0xBD | MOV bp,immed16 | ||
190 | 0xBE | MOV si,immed16 | ||
191 | 0xBF | MOV di,immed16 | ||
192 | 0xC0 | Table1 reg8 | ||
193 | 0xC1 | Table1 reg8, reg16 | ||
194 | 0xC2 | RET immed16 | ||
195 | 0xC3 | RET | ||
196 | 0xC4 | LES reg16/mem16,mem16 | ||
197 | 0xC5 | LDS reg16/mem16,mem16 | ||
198 | 0xC6 | MOV reg8/mem8,immed8 | ||
199 | 0xC7 | MOV reg16/mem16,immed16 | ||
200 | 0xC8 | ENTER immed16, immed8 | ||
201 | 0xC9 | LEAVE | ||
202 | 0xCA | RET immed16 | ||
203 | 0xCB | RET | ||
204 | 0xCC | INT 3 | ||
205 | 0xCD | INT immed8 | ||
206 | 0xCE | INTO | ||
207 | 0xCF | IRET | ||
208 | 0xD0 | Table1 reg8 | ||
209 | 0xD1 | Table1 reg16 | ||
210 | 0xD2 | Table1 reg8 | ||
211 | 0xD3 | Table1 reg16 | ||
212 | 0xD4 | AAM | ||
213 | 0xD5 | AAD | ||
214 | 0xD6 | Not used | ||
215 | 0xD7 | XLAT [bx] | ||
216 | 0xD8 | ESC immed8 | ||
217 | 0xD9 | ESC immed8 | ||
218 | 0xDA | ESC immed8 | ||
219 | 0xDB | ESC immed8 | ||
220 | 0xDC | ESC immed8 | ||
221 | 0xDD | ESC immed8 | ||
222 | 0xDE | ESC immed8 | ||
223 | 0xDF | ESC immed8 | ||
224 | 0xE0 | LOOPNE immed8 | ||
225 | 0xE1 | LOOPE immed8 | ||
226 | 0xE2 | LOOP immed8 | ||
227 | 0xE3 | JCXZ immed8 | ||
228 | 0xE4 | IN al,immed8 | ||
229 | 0xE5 | IN ax,immed16 | ||
230 | 0xE6 | OUT al,immed8 | ||
231 | 0xE7 | OUT ax,immed16 | ||
232 | 0xE8 | CALL immed16 | ||
233 | 0xE9 | JMP immed16 | ||
234 | 0xEA | JMP immed32 | ||
235 | 0xEB | JMP immed8 | ||
236 | 0xEC | IN al,dx | ||
237 | 0xED | IN ax,dx | ||
238 | 0xEE | OUT al,dx | ||
239 | 0xEF | OUT ax,dx | ||
240 | 0xF0 | LOCK | ||
241 | 0xF1 | Not used | ||
242 | 0xF2 | REPNE | ||
243 | 0xF3 | REP | ||
244 | 0xF4 | HLT | ||
245 | 0xF5 | CMC | ||
246 | 0xF6 | Table3 reg8 | ||
247 | 0xF7 | Table3 reg16 | ||
248 | 0xF8 | CLC | ||
249 | 0xF9 | STC | ||
250 | 0xFA | CLI | ||
251 | 0xFB | STI | ||
252 | 0xFC | CLD | ||
253 | 0xFD | STD | ||
254 | 0xFE | Table4 reg8 | ||
255 | 0xFF | Table4 reg16 |
寻址方式
寻址方式 | 寻址代码 |
---|---|
立即数寻址 | mov eax,1 |
寄存器寻址 | mov eax,ebx |
直接寻址 | mov eax,[2000h] |
寄存器间接寻址 | mov eax,[ebx] |
寄存器相对寻址 | mov eax[ebx + 0x100] |
基址变址寻址 | mov eax,[ebx + esi] |
相对基址变址寻址 | mov eax,[ebx + esi *n] |
x86
寄存器
eax ebx ecx edx esi edi esp ebp
指令 | 编号 |
---|---|
eax | 000 |
ecx | 001 |
edx | 010 |
ebx | 011 |
esp | 100 |
ebp | 101 |
esi | 110 |
edi | 111 |
指令格式
SIB
对modR/M的补充
名称 | 大小 | 说明 |
---|---|---|
scale | 2 bit | 表示倍率 如上面edi *4 4就是倍率,只能是1 2 4 8 ,00代表倍率为1,01=2 10 = 4 11 = 8 |
index | 3 bit | 表示倍率前边的寄存器 如edx * 4,那么edi的编号就放在这里 |
base | 3 bit |
eg:
mov eax,[ebx + edi * 4 + 1000h]
根据汇编指令我们可以得出: 偏移 = 1000h 倍率 = 4 基址 = ebx
得到
scale | index | base |
---|---|---|
4 | edi | ebx |
Displacement
是偏移
mov eax,[ebx + edi * 4 + 1000h]
1000h就是偏移,会放在这个字段当中.
可以是1个字节,可以是2个字节,或者4个字节.
immediate
立即数
immediate 是立即数 如:
mov eax,1
在32位中占 1 2 4个字节.
x64
寄存器
rax rbx rcx rdx rsi rdi rsp rbp
r8 r9 r10 r11 r12 r13 r14 r15
指令格式
在x64下,只对 x86加了一个 REX (re Extend 在扩展)
REX是一个字节.但是高4位必须为0100 REX取值范围在40-4F之间.
低四位有不同的含义
W (width) 如果为0 代表这个指令是32位的 如果为1 则代表指令是64位的.
R位
R主要是对32位下 MOdR/M中的 Reg/Opcode做了扩充. 以前是3位,现在是4位来表示了. 因为为了兼容32位.所以32位的表不能动.所以只能在这继续进行扩充.
X(index} 这个主要是扩充 SIB 中的index位的.
32位下 Index代表 倍率的寄存器.如 edi * 4 4是倍率. edi则是 倍率寄存器.在32位下这个是3位.只能表示一个寄存器 64下需要对它进行扩种.就是x index.
B(base)
这个主要是扩充 32位下 Modr/M 中的 R/M位. 或者 SIB中 Base基址位.
例子
mov eax,2
Opcode = b8 10 0 00 00
那么扩展为64位的就是 48 b8 10 00 00 00 00 00 00 00
48的意思就是 0100 1000 就是说 在w 位设置为1,代表的是64位汇编指令.
48→x64
89→mov+16位寄存器
02(00 000 010)→(00)寄存器间接寻址+(000)rax+(010)[rdx]
↓
mov [rdx], rax
48→x64
89→cmp+16位寄存器
D3(11 010 011)→(11)寄存器寻址+(010)rdx+(011)rbx
↓
cmp rbx, rdx