1、数据传送指令
1.1、传送指令
指令的语法 |
举例 |
周期数 |
MOV reg,reg |
mov bp,sp |
1 |
MOV mem,reg |
mov array[di],bx |
1 |
MOV reg,mem |
mov bx,pointer |
1 |
MOV mem,immed |
mov [bx],15 |
1 |
MOV reg,immed |
mov cx,256 |
1 |
MOV mem,accum |
mov total,ax |
1 |
MOV accum,mem |
mov al,string |
1 |
MOV segreg,reg16 |
mov ds,ax |
2, 3 |
MOV segreg,mem16 |
mov es,psp |
2, 3 |
MOV reg16,segreg |
mov ax,ds |
1 |
MOV mem16,segreg |
mov stack_save,ss |
1 |
MOV reg32,controlreg |
mov eax,cr0 |
22 |
mov eax,cr2 |
12 |
|
mov eax,cr3 |
21, 46 |
|
mov eax,cr4 |
14 |
|
MOV controlreg,reg32 |
mov cr0,eax |
4 |
MOV reg32,debugreg |
mov edx,dr0 |
DR0-DR3, DR6,DR7=11 |
DR4,DR5=12 |
||
MOV debugreg,reg32 |
mov dr0,ecx |
DR0-DR3, |
DR4,DR5=12 DR6,DR7=11 |
1.2、传送-填充指令
MOVSX reg,reg |
movsx bx,al |
3 |
MOVSX reg,mem |
movsx eax,bsign |
3 |
MOVZX reg,reg |
movzx bx,al |
3 |
MOVZX reg,mem |
movzx eax,bunsign |
3 |
1.3、交换指令
XCHG reg,reg |
xchg cx,dx |
3 |
XCHG reg,mem |
xchg bx,pointer |
3 |
XCHG mem,reg |
xchg [bx],ax |
3 |
XCHG accum,reg |
xchg ax,cx |
2 |
XCHG reg,accum |
xchg cx,ax |
2 |
1.4、取段地址和有效地址指令
LDS reg,mem |
lds si,fpointer |
4 |
LES reg,mem |
les di,fpointer |
4 |
LFS reg,mem |
lfs edi,fpointer |
4 |
LGS reg,mem |
lgs bx,fpointer |
4 |
LSS reg,mem |
lss bp, fpointer |
4, pm=8 |
LEA reg,mem |
lea bx,npointer |
1 |
1.5、进栈指令
PUSH reg |
push dx |
1 |
PUSH mem |
push [di] |
2 |
PUSH segreg |
push es |
1 |
PUSH immed |
push 15000 |
1 |
PUSHA |
pusha |
5 |
PUSHAD |
pushad |
5 |
PUSHF |
pushf |
4, pm=3 |
PUSHFD |
pushfd |
4, pm=3 |
1.6、出栈指令
POP reg |
pop cx |
1 |
POP mem |
pop param |
3 |
POP segreg |
pop es |
3 |
POPA |
popa |
5 |
POPAD |
popad |
5 |
POPF |
popf |
6, pm=4 |
POPFD |
popfd |
6, pm=4 |
1.7、转换指令
XLAT [[segreg:]mem] |
xlat |
4 |
XLATB [[segreg:]mem] |
xlatb es:table |
4 |
1.8、输入指令
IN accum,immed |
in ax,60h |
7, pm=4,21*(注), vm=19 |
IN accum,DX |
in ax,dx |
7, pm=4,21*, vm=19 |
INS [ES:]dest, DX |
ins es:instr,dx |
9, pm=6,24*, vm=22 |
INSB |
Insb |
9, pm=6,24*, vm=22 |
INSW |
Insw |
9, pm=6,24*, vm=22 |
INSD |
Insd |
9, pm=6,24*, vm=22 |
注:当CPL≤IOPL时,执行时间是第一个时钟周期,否则是第二个时钟周期。
1.9、输出指令
OUT immed8,accum |
out 60h,al |
12, pm=9,26, VM=24 |
OUT DX,accum |
out dx,ax |
12, pm=9,25 VM=24 |
OUTS DX,[segreg:]src |
outs dx,buffer |
13, pm=10,27, VM=24 |
OUTSB [DX,[segreg:]src] |
outsb |
13, pm=10,27, VM=24 |
OUTSW [DX,[segreg:]src] |
outsw |
13, pm=10,27, VM=24 |
OUTSD [DX,[segreg:]src] |
outsd |
13, pm=10,27, VM=24 |
2、标志位操作指令
2.1、标志位操作指令
指令的语法 |
举例 |
周期数 |
CLC |
clc |
2 |
CMC |
cmc |
2 |
STC |
stc |
2 |
CLD |
cld |
2 |
STD |
std |
2 |
CLI |
cli |
7 |
STI |
sti |
7 |
2.2、标志位存取操作指令
SAHF |
Sahf |
2 |
LAHF |
lahf |
2 |
2.3、标志位堆栈操作指令
PUSHF |
pushf |
4, pm=3 |
PUSHFD |
pushfd |
4, pm=3 |
POPF |
popf |
6, pm=4 |
POPFD |
popfd |
6, pm=4 |
3、算术运算指令
3.1、加法指令
指令的语法 |
举例 |
周期数 |
ADC reg,reg |
adc dx,cx |
1 |
ADC mem,reg |
adc word ptr m16[2],dx |
3 |
ADC reg,mem |
adc dx,dword ptr m32[2] |
2 |
ADD reg,reg |
add ax,bx |
1 |
ADD mem,reg |
add total, cx |
3 |
ADD reg,mem |
add cx,incr |
2 |
ADD reg,immed |
add bx,6 |
1 |
ADD mem,immed |
add pointers[bx][si],6 |
3 |
ADD accum,immed |
add ax,10 |
1 |
INC reg |
inc bx |
1 |
INC mem |
inc vpage |
3 |
XADD reg,reg |
xadd dl,al |
3 |
XADD mem,reg |
xadd string,bl |
4 |
3.2、减法指令
SUB reg,reg |
sub ax,bx |
1 |
SUB mem,reg |
sub array[di],bi |
3 |
SUB reg,mem |
sub al,[bx] |
2 |
SUB reg,immed |
sub bl,7 |
1 |
SUB mem,immed |
sub total,4000 |
3 |
SUB accum,immed |
sub ax,32000 |
1 |
SBB accum,immed |
sbb ax,320 |
1 |
SBB reg,immed |
sbb dx,45 |
1 |
SBB mem,immed |
sbb word ptr m32[2],40 |
3 |
SBB reg,reg |
sbb dx,cx |
1 |
SBB mem,reg |
sbb word ptr m32[2],dx |
3 |
SBB reg,mem |
sbb dx,word ptr m32[2] |
2 |
DEC reg |
dec ax |
1 |
DEC mem |
dec counter |
3 |
NEG reg |
neg ax |
1 |
NEG mem |
neg balance |
3 |
3.3、乘法指令
MUL reg |
mul bx |
|
MUL memX |
mul word ptr [bx] |
8,16-bit=11 |
32-bit=10 |
||
IMUL reg |
imul dx |
11 |
IMUL mem |
imul factor |
11 |
IMUL reg,immed |
imul cx,25 |
10 |
IMUL reg,reg,immed |
imul dx,ax,18 |
10 |
IMUL reg,mem,immed |
imul bx,[si],60 |
10 |
IMUL reg,reg |
imul cx,ax |
10 |
IMUL reg,mem |
imul dx,[si] |
10 |
3.4、除法指令
DIV reg |
div cx |
byte=17 word=25 |
DIV mem |
div [bx] |
dword=41 |
IDIV reg |
idiv dl |
8-bit=22;16-bit=30 |
IDIV mem |
idiv itemp |
32-bit=46 |
3.5、类型转换指令
CBW |
cbw |
3 |
CWD |
cwd |
2 |
CWDE |
cwde |
3 |
CDQ |
cdq |
2 |
4、逻辑运算指令
4.1、逻辑与操作指令
指令的语法 |
举例 |
周期数 |
AND reg,reg |
and dx,bx |
1 |
AND mem,reg |
and bitmask,bx |
3 |
AND reg,mem |
and bx,masker |
2 |
AND reg,immed |
and dx,0F7h |
1 |
AND mem,immed |
and masker,100lb |
3 |
AND accum,immed |
and ax,0B6h |
1 |
4.2、逻辑与操作指令
OR reg,reg |
or ax,dx |
1 |
OR mem,reg |
or bits,dx |
3 |
OR reg,mem |
or dx,color[di] |
2 |
OR reg,immed |
or dx,110110b |
1 |
OR mem,immed |
or flag_rec,8 |
3 |
OR accum,immed |
or ax,40h |
1 |
4.3、逻辑与操作指令
NOT reg |
not ax |
1 |
NOT mem |
not masker |
3 |
4.4、逻辑异或操作指令
XOR reg,reg |
xor cx,bx |
1 |
XOR reg,mem |
xor cx,flags |
2 |
XOR mem,reg |
xor [bp+10],cx |
3 |
XOR reg,immed |
xor bl,1 |
1 |
XOR mem,immed |
xor switches[bx],101b |
3 |
XOR accum,immed |
xor ax,01010101b |
1 |
、移位操作指令
5.1、算术左移指令
指令的语法 |
举例 |
周期数 |
SAL reg,1 |
sal bx,1 |
1 |
SAL mem,1 |
sal word ptr m32[0],1 |
3 |
SAL reg,CL |
sal ah,cl |
4 |
SAL mem,CL |
sal BYTE PTR [di],cl |
4 |
SAL reg,immed |
sal cx,6 |
1 |
SAL mem,immed |
sal array[bx+di],14 |
3 |
5.2、算术右移指令
SAR reg,1 |
sar di,1 |
1 |
SAR mem,1 |
sar count,1 |
3 |
SAR reg,CL |
sar bx,cl |
4 |
SAR mem,CL |
sar sign,cl |
4 |
SAR reg,immed |
sar bx,5 |
1 |
SAR mem,immed |
sar sign_count,3 |
3 |
5.3、逻辑左移指令
SHL reg,1 |
shl si,1 |
1 |
SHL mem,1 |
shl index,1 |
3 |
SHL reg,CL |
shl di,cl |
4 |
SHL mem,CL |
shl index,cl |
4 |
SHL reg,immed |
shl di,2 |
1 |
SHL mem,immed |
shl unsign,4 |
3 |
5.4、逻辑右移指令
SHR reg,1 |
shr dh,1 |
1 |
SHR mem,1 |
shr unsign[di],1 |
3 |
SHR reg,CL |
shr dx,cl |
4 |
SHR mem,CL |
shr word ptr m32[2],cl |
4 |
SHR reg,immed |
shr bx,8 |
1 |
SHR mem,immed |
shr mem16,11 |
3 |
5.5、双精度左移指令
SHLD reg16,reg16,immed8 |
shld ax,dx,10 |
4 |
SHLD reg32,reg32,immed8 |
||
SHLD mem16,reg16,immed8 |
shld bits,cx,5 |
4 |
SHLD mem32,reg32,immed8 |
||
SHLD reg16,reg16,CL |
shld ax,dx,cl |
4 |
SHLD reg32,reg32,CL |
||
SHLD mem16,reg16,CL |
shld masker,ax,cl |
5 |
SHLD mem32,reg32,CL |
5.6、双精度右移指令
SHRD reg16,reg16,immed8 |
shrd cx,si,3 |
4 |
SHRD reg32,reg32,immed8 |
||
SHRD mem16,reg16,immed8 |
shrd [di],dx,5 |
4 |
SHRD mem32,reg32,immed8 |
||
SHRD reg16,reg16,CL |
shrd ax,dx,cl |
4 |
SHRD reg32,reg32,CL |
||
SHRD mem16,reg16,CL |
shrd [bx],ax,cl |
5 |
SHRD mem32,reg32,CL |
5.7、循环左移指令
指令的语法 |
举例 |
周期数 |
ROL reg,1 |
rol ax,1 |
1 |
ROL mem,1 |
rol bits,1 |
3 |
ROL reg,CL |
rol ax,cl |
4 |
ROL mem,CL |
rol color,cl |
4 |
ROL reg,immed8 |
rol ax,13 |
1 |
ROL mem,immed8 |
rol byte ptr [bx],10 |
3 |
5.8、循环右移指令
ROR reg,1 |
ror ax,1 |
1 |
ROR mem,1 |
ror word ptr [bx],1 |
3 |
ROR reg,CL |
ror dx,cl |
4 |
ROR mem,CL |
ror color,cl |
5 |
ROR reg,immed8 |
ror bl,3 |
1 |
ROR mem,immed8 |
ror bits,6 |
3 |
5.9、带进位的循环左移指令
RCL reg,1 |
rcl dx,1 |
1 |
RCL mem,1 |
rcl WORD PTR [si],1 |
3 |
RCL reg,CL |
rcl dx,cl |
7-24 |
RCL mem,CL |
rcl masker,cl |
9-26 |
RCL reg,immed8 |
rcl bx,5 |
8-25 |
RCL mem,immed8 |
rcl word ptr [bp+8],3 |
10-27 |
5.10、带进位的循环右移指令
RCR reg,1 |
rcr bl,1 |
1 |
RCR mem,1 |
rcr word ptr m32[0],1 |
3 |
RCR reg,CL |
rcr bl,cl |
7-24 |
RCR mem,CL |
rcl word ptr [bx=di],cl |
9-26 |
RCR reg,immed8 |
rcr si,9 |
8-25 |
RCR mem,immed8 |
rcr masker,3 |
10-27 |
6、位操作指令
6.1、正向位扫描指令
指令的语法 |
举例 |
周期数 |
BSF reg16,reg16 |
bsf cx,bx |
6-34 |
BSF reg32,reg32 |
bsf cx,bx |
6-42 |
BSF reg16,mem16 |
bsf ecx,bitmask |
6-35 |
BSF reg32,mem32 |
bsf ecx,bitmask |
6-43 |
6.2、正向位扫描指令
BSR reg16,reg16 |
bsr cx,dx |
7-39 |
BSR reg32,reg32 |
bsr ecx, edx |
7-71 |
BSR reg16,mem16 |
bsr ax,bitmask |
7-40 |
BSR reg32,mem32 |
bsr eax,bitmask |
7-72 |
6.3、正向位扫描指令
BT reg16,immed8*(注) |
bt ax,4 |
4 |
BT mem16,immed8 |
bt [bx],4 |
4 |
BT reg16,reg16 |
bt ax,bx |
4 |
BT mem16,reg16 |
bt [bx],dx |
9 |
(注) 操作数也可以是32位数。
6.4、正向位扫描指令
BTC reg16,immed8* |
btc edi,4 |
7 |
BTC mem16,immed8* |
btc color[di],4 |
8 |
BTC reg16,reg16* |
btc eax,ebx |
7 |
BTC mem16,reg16* |
btc [bp+8],si |
13 |
6.5、正向位扫描指令
BTR reg16,immed8* |
btr bx,17 |
7 |
BTR mem16,immed8* |
btr [bx],27 |
8 |
BTR reg16,reg16* |
btr cx,di |
7 |
BTR mem16,reg16* |
btr rotate,cx |
13 |
6.6、正向位扫描指令
BTS reg16,immed8* |
bts ax,4 |
7 |
BTS mem16,immed8* |
bts maskit,4 |
8 |
BTS reg16,reg16* |
bts bx,ax |
7 |
BTS mem16,reg16* |
bts flags[bx],cx |
13 |
6.7、正向位扫描指令
TEST reg,reg |
test dx,bx |
1 |
TEST mem,reg |
test flags,dx |
2 |
TEST reg,immed |
test cx,30h |
1 |
TEST mem,immed |
test masker,1 |
2 |
TEST accum,immed |
test ax,90h |
1 |
7、比较运算指令
7.1、比较指令
指令的语法 |
举例 |
周期数 |
CMP reg,reg |
cmp dl,cl |
1 |
CMP mem,reg |
cmp array[si],bl |
2 |
CMP reg,mem |
cmp bh,array[si] |
2 |
CMP reg,immed |
cmp bx,24 |
1 |
CMP mem,immed |
cmp tester,4000 |
2 |
CMP accum,immed |
cmp ax,1000 |
1 |
7.2、比较交换指令
CMPXCHG mem,reg |
cmpxchg string,bl |
6 |
CMPXCHG reg,reg |
cmpxchg bx,cx |
6 |
CMPXCHG8B reg,mem64 |
cmpxchg8b ax,[bx] |
10 |
8、循环指令
8.1、循环指令
LOOP label |
loop wend |
5, 6 |
LOOPE label |
loope again |
7, 8 |
LOOPZ label |
loopz again |
7, 8 |
LOOPNE label |
loopne for_next |
7, 8 |
LOOPNZ label |
loopnz for_next |
7, 8 |
8.2、循环指令
JCXZ label |
jcxz notfound |
6,5 |
JECXZ label |
jecxz notfound |
6,5 |
9、转移指令
9.1、无条件转移指令
指令的语法 |
举例 |
周期数 |
JMP label |
jmp NEAR PTR distant |
1 |
jmp distant |
3 |
|
JMP reg16 |
jmp ax |
2 |
JMP mem16 |
jmp table[di] |
2 |
JMP reg32 |
jmp eax |
3 |
JMP mem32 |
jmp fpointer[si] |
2 |
JMP mem48 |
jmp FWORD PTR [di] |
4 |
9.2、条件转移指令
Jcondition label |
je next |
1 |
9.3、子程序调用指令
CALL label |
call upcase |
1 |
call distant |
4 |
|
CALL reg |
call ax |
2 |
CALL mem32 |
call [bx] |
2 |
CALL mem32 |
call dword ptr [bx] |
5 |
9.4、子程序返回指令
RETN |
retn |
2 |
RETN immed16 |
retn 8 |
3 |
RETF |
retf |
4, 23 |
RETF immed16 |
retf 32 |
4, 23 |
9.5、中断指令
INT immed8 |
int 25h |
16, pm=31, 48*(注) |
INT 3 |
int 3 |
13, pm=27, 44* |
INTO |
Into |
13, pm=27, 44* |
注:第一时间是同等优先级的中断时间,第二时间为高优先级的中断时间。
9.6、中断返回指令
IRET |
Iret |
8*(注),10, pm=27 |
IRETD |
Iretd |
10, pm=27 |
IRETF |
Iretf |
|
IRETDF |
Iretdf |
注:实方式或虚拟8086方式。
10、条件设置字节指令
SETcondition reg8 |
setc dh |
1 |
SETcondition mem8 |
setle flag |
2 |
11、字符串操作指令
11.1、取字符串数据指令
指令的语法 |
举例 |
周期数 |
LODS [segreg:]src |
lods es:source |
2 |
LODSB [[segreg:]src] |
Lodsb |
2 |
LODSW [[segreg:]src] |
Lodsw |
2 |
LODSD [[segreg:]src] |
Lodsd |
2 |
11.2、置字符串数据指令
STOS [ES:]dest |
stor es:dstring |
3 |
STOSB [[ES:]dest] |
stosb |
3 |
STOSW [[ES:]dest] |
stosw |
3 |
STOSD [[ES:]dest] |
stosd |
3 |
11.3、字符串传送指令
MOVS [es:]dest, [segreg:]src |
movs dest,es:source |
4 |
MOVSB [[es:]dest, [segreg:]src] |
movsb |
4 |
MOVSW [[es:]dest, [segreg:]src] |
movsw |
4 |
MOVSD [[es:]dest, [segreg:]src] |
movsd |
4 |
11.4、输入字符串指令
INS [ES:]dest, DX |
ins es:instr,dx |
9, pm=6,24*, vm=22 |
INSB |
Insb |
9, pm=6,24*, vm=22 |
INSW |
Insw |
9, pm=6,24*, vm=22 |
INSD |
Insd |
9, pm=6,24*, vm=22 |
11.5、输出字符串指令
OUTS DX,[segreg:]src |
outs dx,buffer |
13, pm=10,27, VM=24 |
OUTSB [DX,[segreg:]src] |
outsb |
13, pm=10,27, VM=24 |
OUTSW [DX,[segreg:]src] |
outsw |
13, pm=10,27, VM=24 |
OUTSD [DX,[segreg:]src] |
outsd |
13, pm=10,27, VM=24 |
11.6、字符串比较指令
CMPS [segreg:] src, [ES:]dest |
cmps source,es:dest |
5 |
CMPSB [[segreg:[src,] ES:] dest] |
cmpsb |
5 |
CMPSW [[segreg:[src,] ES:]dest] |
cmpsw |
5 |
CMPSD [[segreg:[src,] ES:] dest] |
cmpsd |
5 |
11.7、字符串扫描指令
SCAS [ES]:dest |
scas es:destin |
4 |
SCASB |
Scasb |
4 |
SCASW |
Scasw |
4 |
SCASD |
Scasd |
4 |
11.8、重复前缀指令
REP INS dest,DX |
rep ins dest,dx |
11+3n, pm=(8,25)+3n* |
REP MOVS dest,src |
rep movs dest,source |
6, 13n |
REP OUTS DX,src |
rep outs dx,source |
13+4n, pm=(10,27)+4n* |
REP LODS dest |
rep lods dest |
7, 7+3n |
REP STOS dest |
rep stos dest |
6, 9+3n |
注:当CPL≤IOPL时,执行时间是第一个时钟周期,否则是第二个时钟周期。
11.9、相等重复前缀指令
REPE CMPS src,dest |
repe cmps src,dest |
7, 9+4n |
REPE SCAS dest |
repe scas dest |
7, 9+4n |
11.10、不相等重复前缀指令
REPNE CMPS src,dest |
repne cmps src,dest |
7, 8+4n |
REPNE SCAS dest |
repne scas dest |
7, 9+4n |
12、ASCII-BCD码运算调整指令
指令的语法 |
举例 |
周期数 |
AAA |
aaa |
3 |
AAD |
aad |
10 |
AAM |
aam |
18 |
AAS |
aas |
3 |
DAA |
daa |
3 |
DAS |
das |
3 |
13、处理器指令
HLT |
Hlt |
12 |
NOP |
nop |
1 |
WAIT |
wait |
1 |
LOCK |
lock |
1 |
14、协处理器指令
指令的语法 |
举例 |
周期数 |
FBLD membcd |
fbld packbck |
48-58 |
FBSTP membcd |
fbstp bcds[bx] |
148-154 |
FLD reg |
fld st(3) |
1 |
FLD mem32real |
fld longreal |
1 |
FLD mem64real |
1 |
|
FLD mem80real |
3 |
|
FST reg |
fst st |
1 |
FST memreal |
fst longs[bx] |
2 |
FSTP reg |
fstp st(3) |
1 |
FSTP mem32real |
fstp longreal |
2 |
FSTP mem64real |
2 |
|
FSTP mem80real |
3 |
|
FXCH [reg] |
fxchg st(3) |
1 |
FILD memint |
fild quads[si] |
3, 1 |
FIST memint |
fist doubles[8] |
6 |
FISTP memint |
fistp longint |
6 |