|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
~~~2 Q' \4 \7 I1 n3 ~
8086 CPU 汇编指令速查手册
( S) ~5 i! `9 h' b6 v* m 一、数据传输指令
# y+ l3 `* [! X 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
' i, @2 s3 I; i0 `" R$ ?# ] 1. 通用数据传送指令.3 e! z* S' Z6 c1 J" H. `. E
MOV 传送字或字节.5 f* C/ l. c' X6 |% \. V0 U# [4 a
MOVSX 先符号扩展,再传送.
* Z' \8 T/ d, K MOVZX 先零扩展,再传送.
3 X' a6 k( p* S6 v+ p& k0 T PUSH 把字压入堆栈.
+ V6 P( q8 T4 ?5 l/ X+ p POP 把字弹出堆栈.1 j" J# P6 k, {8 Z
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
9 h2 Y8 n4 X- R v, p POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
$ K+ ?* b; v/ h: ^0 |9 D PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
% ~5 q: j- Z- R1 H POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.) i4 j# }9 p. W. ~0 U, o
BSWAP 交换32位寄存器里字节的顺序" U" }1 h: ^ R, i& [& D
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)8 O1 d6 g" ~- m5 T
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )) o. V6 l8 z Z
XADD 先交换再累加.( 结果在第一个操作数里 )
% F/ [! `4 Q& `3 e XLAT 字节查表转换.- |" N6 X* }' h+ {
── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即9 E' j: J$ }7 O
0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
5 ]7 S. u( H E% U 2. 输入输出端口传送指令.
( w" s0 t/ r1 V4 M3 w6 Z IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
" }; I) l- }+ i0 ~! Y OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )" b; y& Z/ U0 d6 v9 H# M, I
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,
) g& n8 w/ s3 g9 X 其范围是 0-65535.
/ U9 z- o4 w6 P) O2 L- Y1 b! W5 a 3. 目的地址传送指令." R/ ~: g7 c' _5 z+ E1 `: h6 N! s
LEA 装入有效地址.) |" L! Z( Y" n$ ?2 K
例: LEA DX,string ;把偏移地址存到DX.: |8 O+ _# r, E L
LDS 传送目标指针,把指针内容装入DS.; J- p e7 I0 \7 j9 Y: t. T
例: LDS SI,string ;把段地址:偏移地址存到DS:SI.% N0 T. C4 r3 f& u c- p
LES 传送目标指针,把指针内容装入ES.
; d& j- ]9 v4 q' G1 X7 J 例: LES DI,string ;把段地址:偏移地址存到ESI.- @- g8 M8 _+ @+ f2 r* B) X2 S6 f/ d
LFS 传送目标指针,把指针内容装入FS.' n' o+ o! R) H* k8 v: f
例: LFS DI,string ;把段地址:偏移地址存到FSI.
/ }, Z7 m2 r) {7 f LGS 传送目标指针,把指针内容装入GS.6 Z1 \9 [& W* d7 s+ M+ C9 u8 N* T
例: LGS DI,string ;把段地址:偏移地址存到GSI.
6 i% @7 l- s% ]2 k" {2 \; S LSS 传送目标指针,把指针内容装入SS.
% N9 y! `. {3 D 例: LSS DI,string ;把段地址:偏移地址存到SSI.
- ]' A$ h* [; w# y0 w5 l 4. 标志传送指令.
, ]; s1 G' J- |/ o$ `5 B Q LAHF 标志寄存器传送,把标志装入AH.
1 c2 O i1 p. M: I SAHF 标志寄存器传送,把AH内容装入标志寄存器.' s' z9 X# b! z$ O+ d
PUSHF 标志入栈.
. \$ N! d) W2 n6 i" R POPF 标志出栈.9 p* g( e( L5 \6 `8 u
PUSHD 32位标志入栈.
. q! W' S( J3 K% o# a! d/ i3 A2 n POPD 32位标志出栈.
0 x" X& W; \$ _9 D; ` 二、算术运算指令6 [5 T& g2 R% ]5 t+ B
ADD 加法.: j8 }: u+ w, s3 R) x- k( k8 m
ADC 带进位加法.9 ^3 x4 H$ c0 S
INC 加 1.
' V7 g( w* ?- L9 u AAA 加法的ASCII码调整.
( W1 S' t6 V5 C: o% t4 k+ i/ u DAA 加法的十进制调整.
1 D" E+ `" J; g! F SUB 减法.- T( s k( @/ Z# n
SBB 带借位减法.( O$ d, t4 O5 p4 w, S2 I& S
DEC 减 1.2 W! ?+ }8 U: Y4 O* ^' ^2 O0 K
NEC 求反(以 0 减之). a( R7 f* b0 e7 ^. R9 n- \/ W, ^
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
: _. ^ X+ Q( A: y0 c6 ?' _( Q AAS 减法的ASCII码调整.
% Y4 `% F. g8 o6 ]0 p: l, Y DAS 减法的十进制调整.7 g/ Y% Y; F: K# e. b8 U5 ^; `/ c: j5 w
MUL 无符号乘法.# o1 {9 C% u/ @# J
IMUL 整数乘法.% ? L: d$ Q% `1 }) [& T1 K
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
1 c, z p5 [7 _% B, Q3 }7 B8 [ AAM 乘法的ASCII码调整.
# ^; J/ a. ^0 N6 ? DIV 无符号除法.* g5 {- R- e; A7 v
IDIV 整数除法.
& f- Y0 w2 x+ K) G, N6 y 以上两条,结果回送:; j+ a5 A2 D3 b$ A3 R2 c
商回送AL,余数回送AH, (字节运算);, J( I7 c' v+ t4 k P. |
或 商回送AX,余数回送DX, (字运算).# C' L. j( E8 o% j0 T
AAD 除法的ASCII码调整.
- M3 T2 n) F/ ?( d9 g8 i CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)8 B" P1 |4 X. T# _8 z6 M1 q6 \" r
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去); k1 k, M: P) i# N' Q' x
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)! M) Y# e& N) F$ P8 Q7 d# O
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
$ Z, b) _6 n/ a' {' f) Z0 f3 N" K 三、逻辑运算指令5 O) e9 Y0 `8 M- I+ i% L
AND 与运算.6 y9 T# y. H# g- a
OR 或运算.
. b7 }/ ~. F, u8 Q) e+ a8 I3 { XOR 异或运算.
, B+ }; b+ K6 o$ J: a7 S NOT 取反.: N7 t: T6 u) Q" J) E% j2 B/ W5 l
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
5 B/ z3 O$ C n) @ SHL 逻辑左移.
+ E3 D5 _) U4 s" T* W. i SAL 算术左移.(=SHL)
i- g' i) l* y! `. l; A SHR 逻辑右移.! q3 q& i5 V6 h, z" b; h1 H% p
SAR 算术右移.(=SHR)
4 B1 t) h M8 U ROL 循环左移.
. a' [/ f/ b E7 R ROR 循环右移.
1 Y6 F$ @5 d; l2 p: { RCL 通过进位的循环左移.7 L+ k1 C7 I1 U2 S: K1 M1 M
RCR 通过进位的循环右移.
$ U7 O+ t& Q M5 q2 b2 W5 U. H" _ 以上八种移位指令,其移位次数可达255次.
& C& L+ \* x; u: u 移位一次时, 可直接用操作码. 如 SHL AX,1.* U+ I. J4 ]9 B- p9 |; [
移位>1次时, 则由寄存器CL给出移位次数.
8 W- C7 Y# s/ b 如 MOV CL,043 r* H& j! W& v) E& t
SHL AX,CL
' T9 s( t5 p% f; B0 b) x 四、串指令7 x1 y* Q0 [' s* ^6 R0 M
DS:SI 源串段寄存器 :源串变址.
2 J0 f( t$ h* M4 Z( y& M ES1 \; E t5 ?; B& L X
I 目标串段寄存器:目标串变址.
w8 L7 u+ _5 F0 p1 C6 b' u CX 重复次数计数器.$ d* S$ i L; c+ L
AL/AX 扫描值.
, F' V( Y& u* R9 h4 U/ r D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.' `7 V0 {" `: T9 y6 L: @# G3 n+ x" @/ p
Z标志 用来控制扫描或比较操作的结束.
9 @: j% O! |0 ] I2 H: t MOVS 串传送.
: [0 z9 X2 P9 P! } ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )' I3 m% @8 r3 H$ X2 F* L
CMPS 串比较.
: z( B& q: _% o" B2 @) y ( CMPSB 比较字符. CMPSW 比较字. )
$ k7 r: ~7 e d1 b4 ~! B6 F0 o8 u SCAS 串扫描.5 [9 z9 ]0 F% \
把AL或AX的内容与目标串作比较,比较结果反映在标志位.
( k- N+ i& T7 d" d/ s LODS 装入串.
/ |# R; e o* e4 j+ }6 m) H 把源串中的元素(字或字节)逐一装入AL或AX中.
" m2 U! t# u: n/ q/ |5 } ( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )$ {, G0 @, a0 x6 k5 K6 C8 R
STOS 保存串.8 u& D0 j2 C8 M# Z) y, N
是LODS的逆过程.* z6 u& j$ v6 p) _
REP 当CX/ECX<>0时重复.
4 |& g: O9 J4 _$ b# O( l: i- X! ] REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.
& y( A7 [0 W& F5 Y/ l' d REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.* g+ d/ J) X) x$ T- L) F8 `
REPC 当CF=1且CX/ECX<>0时重复.5 I9 n7 Y" {0 M0 q6 N
REPNC 当CF=0且CX/ECX<>0时重复.
2 b# F% K; R6 D1 M 五、程序转移指令
8 a2 s! h6 z, N9 I% H 1>无条件转移指令 (长转移)0 G' f8 ^- B3 U
JMP 无条件转移指令
! h3 u) N% K+ a CALL 过程调用
( r9 j# B% F$ P. b* @% t O RET/RETF过程返回.; R2 M. Q! X5 {
2>条件转移指令 (短转移,-128到+127的距离内)
: X2 D& v3 X' f. X* p/ j) j M7 a ( 当且仅当(SF XOR OF)=1时,OP1
0 B3 P& ?; I* o. g A0 G JA/JNBE 不小于或不等于时转移.+ X9 _- B# V E5 [$ P5 O
JAE/JNB 大于或等于转移.3 }' g- n f0 L* ~ H
JB/JNAE 小于转移.
, I7 ]6 R* y5 B3 J JBE/JNA 小于或等于转移.
( @7 z, [- a7 [8 q7 c 以上四条,测试无符号整数运算的结果(标志C和Z).
5 k( C0 ~% t: N# F0 n( ]% S) ~2 X JG/JNLE 大于转移. V+ w1 P3 }9 b, f. B1 K3 B
JGE/JNL 大于或等于转移.
6 W5 f4 a: Z/ t JL/JNGE 小于转移.
8 x r% J3 N9 k1 I* x6 U1 d JLE/JNG 小于或等于转移.
5 B5 s. [+ M, D, D2 c: ~ 以上四条,测试带符号整数运算的结果(标志S,O和Z).
! v0 A f# _( U( ~; {" [( ^) s JE/JZ 等于转移.
5 J- I' r5 ?" S: q# c JNE/JNZ 不等于时转移.
8 `: a6 R8 T* V- J( u& ] JC 有进位时转移.' n7 T/ t( w- V$ j2 k
JNC 无进位时转移.
, ]( b& S- }' C) Q8 d; x" Z JNO 不溢出时转移., p m ^" u3 z/ S' `% o4 E; r
JNP/JPO 奇偶性为奇数时转移.
3 F$ F# U5 i5 e; m$ I7 z6 r0 y' w JNS 符号位为 "0" 时转移.
5 k3 u `5 a$ _- U) U3 |9 v JO 溢出转移.
; X+ z) r4 x: \ JP/JPE 奇偶性为偶数时转移.1 K) T _/ B4 p* V S* A( n% R5 [
JS 符号位为 "1" 时转移.4 p+ z+ g) @3 A0 y* o& @7 v. P0 i9 x
3>循环控制指令(短转移)
: ?% e& A8 u" ^, |, D LOOP CX不为零时循环.. t- d' b# {- A1 T9 c) y
LOOPE/LOOPZ CX不为零且标志Z=1时循环." H% c$ }; b2 P% u
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.; V2 N0 [: I! Q! Q" |
JCXZ CX为零时转移.
/ ^9 G8 v3 S: F* ]# a JECXZ ECX为零时转移.
6 H& I0 j. `$ L/ v 4>中断指令
! \! s# i2 ?' K5 @8 E INT 中断指令 _$ l0 i" c3 N0 g
INTO 溢出中断, X! d8 M W4 ?/ h2 G6 k
IRET 中断返回
9 P& @5 z0 z) c8 x 5>处理器控制指令3 N+ w1 [9 f$ p2 |. D9 C* z
HLT 处理器暂停, 直到出现中断或复位信号才继续.2 ]( Z( k1 o' H
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.+ Z0 J8 H+ Y) M% u* \6 O
ESC 转换到外处理器.0 f0 H4 S/ w' k. B% g
LOCK 封锁总线.& I l4 D( f/ _( k& h; N% M
NOP 空操作./ d* G7 ~/ f( J! i$ E# H% r1 ~ w
STC 置进位标志位.
Q C; i; @. e5 H0 B CLC 清进位标志位.
* J4 ?6 t% T, O6 c0 ^" c( n5 w/ n CMC 进位标志取反., J. u0 g' N6 N
STD 置方向标志位.4 K/ ~ i3 e6 K& W- G& f0 N6 b
CLD 清方向标志位.# h* _" D( z2 t* U3 i- u
STI 置中断允许位.
6 v% y ? b/ k, c. \, H" o CLI 清中断允许位.
0 O) h( z8 ~# P p- Y# P 六、伪指令3 b0 ]! |. Q; J& z, B0 U
DW 定义字(2字节).% F* I) H' D% G5 \6 ^; }0 P( Q
PROC 定义过程.
4 b( n5 |( y6 l6 O; P9 x ENDP 过程结束.
4 t2 x2 ^+ [: P0 Z+ e$ T& K SEGMENT 定义段.
, e" y, s5 i5 U x/ z" b$ I ASSUME 建立段寄存器寻址.
: ^7 P* E+ E4 p% N4 |: z5 _% L ENDS 段结束.$ y! t- t9 K3 I! j4 o% I
END 程序结束. |
|