|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
~~~
; d0 f _/ o: D, t/ n8086 CPU 汇编指令速查手册* D0 _# a, I1 @# a2 n) ~- w4 B
一、数据传输指令
8 k9 K& Q6 E [! j: D# U! P 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.$ E# q# m, d% x
1. 通用数据传送指令.
* Y# c+ t( m6 n3 M- k% _ MOV 传送字或字节.
2 j* `. I s' K' d8 ~% t MOVSX 先符号扩展,再传送.
+ p" b# p3 T0 \2 ?6 \ MOVZX 先零扩展,再传送.
% S0 M: E3 u, r& u PUSH 把字压入堆栈.
0 |( y1 ^" q+ B" ]* M# u! b& S POP 把字弹出堆栈.# ^4 [" p- [, Z! Q" J9 G9 {
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
/ x2 H0 w1 I6 u POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
/ M$ E7 W9 b% m7 f) `4 Y PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
: K4 i. M* C# Y1 f POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
9 e$ B& k# }# x: d" m- | f BSWAP 交换32位寄存器里字节的顺序
8 ~+ v; ?3 [+ s' {. I XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
3 T; q# B. D; e3 j7 l, d' {2 E# _7 M CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )' I8 _6 |3 e, `' v0 Z G
XADD 先交换再累加.( 结果在第一个操作数里 ) |" q) }# ]- M
XLAT 字节查表转换.
0 G2 K3 ?$ i" h' ~0 A5 }1 Z ── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即5 Y3 E" K6 p H5 J
0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
3 H0 K6 E6 B" X0 x" g* o. F) K/ X 2. 输入输出端口传送指令.5 ^2 _( N) i+ Y' P
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
$ I% |$ q1 B& p+ h0 `3 B# W OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )7 f8 H. f! ]5 a, Z/ B
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,/ g! H- y) U( B# @; b. X* g
其范围是 0-65535.
1 P, U) u( U: z: S 3. 目的地址传送指令.; N: H( E ] {$ a8 H! @
LEA 装入有效地址.
# t w0 d- U% ], g 例: LEA DX,string ;把偏移地址存到DX.
" z$ C3 N" }$ v LDS 传送目标指针,把指针内容装入DS.: E# @7 m- e2 \" A
例: LDS SI,string ;把段地址:偏移地址存到DS:SI./ G$ F& S Y2 A# B' J
LES 传送目标指针,把指针内容装入ES.8 f9 R7 e: e0 O5 r
例: LES DI,string ;把段地址:偏移地址存到ESI.+ O' f. F2 B8 O/ I T# v
LFS 传送目标指针,把指针内容装入FS.
- K* ]2 r8 R/ a2 L# P6 w 例: LFS DI,string ;把段地址:偏移地址存到FSI.
! \8 s+ v1 |7 e- I9 V LGS 传送目标指针,把指针内容装入GS.2 e7 ]( c) w9 ]4 [5 r( p
例: LGS DI,string ;把段地址:偏移地址存到GSI." Z [: r/ d+ F9 h# f% s7 V
LSS 传送目标指针,把指针内容装入SS.
9 ^6 T# Z7 B" w% a0 d7 I! i 例: LSS DI,string ;把段地址:偏移地址存到SSI.
5 e3 a0 [$ v1 F* k4 N9 x% p7 a 4. 标志传送指令.
9 H) h* o V$ p+ R LAHF 标志寄存器传送,把标志装入AH.1 o* W/ b" B+ E4 @
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
- o$ j* `9 a) s# ^ PUSHF 标志入栈.
' q* F3 q* k, w- Y& W POPF 标志出栈.2 t) M* D2 ]0 {4 x# B T# z
PUSHD 32位标志入栈.
( z7 m! u6 Y Y: v+ y0 ~ POPD 32位标志出栈./ b( o" [" z0 a* N1 N1 ?
二、算术运算指令
" V6 U6 e6 z& z, ?9 v; K1 w ADD 加法.& ^: I: n4 _; L5 o1 D
ADC 带进位加法.
( C$ b; w y- e INC 加 1.
e$ ?% D8 }; n, r( L' H1 B AAA 加法的ASCII码调整." p* W- T$ x3 `* z$ W/ g9 J& a
DAA 加法的十进制调整.
* N7 C5 v, C: W" z: P/ Q I SUB 减法.. O, L r# q6 n9 l# i9 }
SBB 带借位减法.
" A+ i7 [, D2 V! G" Q DEC 减 1.
, e3 U4 R$ A8 o, M" I( N ?% N Y NEC 求反(以 0 减之).
1 r+ @. H3 c) Y* _. L* }8 | CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
, j# _( ~& G; N2 g( g w AAS 减法的ASCII码调整.9 m# o0 \) q# Z! ^5 `4 p' f
DAS 减法的十进制调整.
( o2 [2 I# I0 O7 Y5 V* m6 P MUL 无符号乘法.! m7 u. x L6 f b6 {' X( u5 w( P# a5 b
IMUL 整数乘法.* ?: q) _ B9 \2 _) [
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
8 ~6 j+ W8 n0 T- M, K4 m, p AAM 乘法的ASCII码调整.7 v7 X3 |8 D2 W* u0 y
DIV 无符号除法.
* d' o' k5 e- h+ {' V1 p IDIV 整数除法.% S$ r1 o7 o+ D; i! u6 O- i5 v2 w
以上两条,结果回送:( x1 B o% \+ h, b9 C. N* ]. G3 R
商回送AL,余数回送AH, (字节运算);
: r+ r9 j( Q+ g* y) @- ], u; e 或 商回送AX,余数回送DX, (字运算).
5 {& Z$ f6 X* R& ~8 ?, i K AAD 除法的ASCII码调整.
; K( r- e. p" d5 D$ f CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
+ F/ v3 y; Z z( G9 u CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)7 l+ X- S' A5 q! d
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)0 C) T }0 r+ a( ]/ a0 k8 G
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
4 K! g: d$ P# o- W$ t 三、逻辑运算指令0 r- }" x [1 ]
AND 与运算.' ~: B! _/ ^6 X5 f% P
OR 或运算. S. ?1 `+ z' E$ h F8 O W, f' i
XOR 异或运算.2 c5 m" ?+ f, b/ E
NOT 取反.% m8 L- R. _- ?" X0 o0 B7 v
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
9 |( d& h6 [3 Y0 Z Z% ? SHL 逻辑左移.8 @( v8 r! ?$ w, `, X$ ~: t' D
SAL 算术左移.(=SHL); J% d7 n' F: j: s, u* z' ^
SHR 逻辑右移.
9 y7 D# e$ U) S SAR 算术右移.(=SHR) |7 ?. u" J9 Z5 H
ROL 循环左移.
* y! ]( o6 m8 x ROR 循环右移.) E+ x3 ^( @, Z; @. {9 w0 s' |
RCL 通过进位的循环左移.! } h! `, W3 F/ d' h, I* r; w) B5 ~
RCR 通过进位的循环右移.
0 W3 L3 q% ]* M' g1 u 以上八种移位指令,其移位次数可达255次.4 {; w- l& I3 ?" Q. t/ `
移位一次时, 可直接用操作码. 如 SHL AX,1.
7 v+ [. a! n) }+ V' E 移位>1次时, 则由寄存器CL给出移位次数.
) I/ F' e" s! K# N- v 如 MOV CL,04
( A N% p6 A" j E! {1 } SHL AX,CL' h7 \) n- N, N' s# L
四、串指令- J8 l1 J( w: H
DS:SI 源串段寄存器 :源串变址.0 a/ g* t: q# j/ X5 o/ X9 o6 b
ES7 B$ s6 F" o/ E- B6 r2 ]
I 目标串段寄存器:目标串变址.
5 l; s( s) |- @ s9 z/ T |' G CX 重复次数计数器.: |8 [$ |! |, n# B' ~
AL/AX 扫描值. I- L7 U6 E0 s/ h+ a/ {9 {
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量., G$ [3 x0 O, c! n
Z标志 用来控制扫描或比较操作的结束.% e6 p8 u) b) V: ?( H
MOVS 串传送.
/ B! T0 l9 X0 _. M: v# I- c ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )
1 ~% g9 k# B j5 o, |& h CMPS 串比较.9 U5 M* n. X4 p* i' b, H4 ]
( CMPSB 比较字符. CMPSW 比较字. )
; f" S1 H4 ~6 v; l& W* K H& _' K SCAS 串扫描.
: s- Z6 D2 `& F7 h* } 把AL或AX的内容与目标串作比较,比较结果反映在标志位.' K6 `6 v3 H# [4 l
LODS 装入串.
3 V& B9 ] S8 E& r 把源串中的元素(字或字节)逐一装入AL或AX中.
! h3 p1 |6 N- l H: b ( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
/ x% L2 M- o# @, q STOS 保存串.
* q. W5 R. V% H- }! ? 是LODS的逆过程. n! W/ D0 b( f0 @/ Z
REP 当CX/ECX<>0时重复.
3 }% \3 F# R. }/ j, S# D REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.
( m: M7 Q: T* s' j9 [: O5 r" ? REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
9 V( C: P0 l D REPC 当CF=1且CX/ECX<>0时重复.
; ]# ~9 {. x! A/ J a REPNC 当CF=0且CX/ECX<>0时重复.
/ g7 I' f. |7 y6 y 五、程序转移指令, C& L. x1 c$ D+ l1 M5 J# S# I# J3 ]2 _
1>无条件转移指令 (长转移)) l O+ C, K4 @$ h, ~$ E5 e
JMP 无条件转移指令
+ `$ @8 t2 u7 R' A3 {: F8 g6 [ CALL 过程调用& A! E1 G' [( Z
RET/RETF过程返回.
7 X7 }) ]8 X$ u3 b 2>条件转移指令 (短转移,-128到+127的距离内)$ H5 g& R6 m3 h1 O7 N9 T
( 当且仅当(SF XOR OF)=1时,OP1, Q; a8 k+ S' V) j* M
JA/JNBE 不小于或不等于时转移.; F/ M9 t; M+ g# w! }
JAE/JNB 大于或等于转移.* s( y9 ?4 ~2 o1 @0 ~
JB/JNAE 小于转移.
8 s e( O4 f& E3 e( s. @% @: @ JBE/JNA 小于或等于转移.$ t, \* c3 f9 \* d, Y$ ~
以上四条,测试无符号整数运算的结果(标志C和Z).1 M; a9 ` ^# o
JG/JNLE 大于转移.
; S$ U. u2 i& A5 m( `9 [4 t JGE/JNL 大于或等于转移.) [. q9 Z" ]3 S
JL/JNGE 小于转移.* O: a" n8 i4 [* ^; P: L
JLE/JNG 小于或等于转移.0 L/ y: ]0 r6 v1 J8 j9 I. W
以上四条,测试带符号整数运算的结果(标志S,O和Z).
' e/ a- v* `6 Z; i- s6 N JE/JZ 等于转移.
8 i6 E4 S7 C' D" O JNE/JNZ 不等于时转移.
+ r1 e- D, A! f. Q JC 有进位时转移.: r! o) a I' A; d$ a3 A5 |7 L
JNC 无进位时转移.6 ^ V# M; |: V7 d. _4 {* j
JNO 不溢出时转移.
* V, z% Q! ]" L* u/ C& U: S: b JNP/JPO 奇偶性为奇数时转移./ _$ x, x, M# t" \/ n/ T
JNS 符号位为 "0" 时转移.
0 N! _" H( x4 K JO 溢出转移.9 d" R0 s( I6 H4 M* J+ t
JP/JPE 奇偶性为偶数时转移.$ H- S+ P* d, C( s2 g3 f/ E7 [
JS 符号位为 "1" 时转移.
- l1 ]- [8 Q' i8 U1 K9 X$ W& r- G4 j 3>循环控制指令(短转移)
7 T2 d9 v5 Z6 R9 B) ]8 G2 } LOOP CX不为零时循环.
q* c6 `1 y" ^/ Q% I1 a0 q LOOPE/LOOPZ CX不为零且标志Z=1时循环.+ O, G4 t0 f2 U/ f
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
2 c9 l" t$ C% z9 J# g$ n2 X! j JCXZ CX为零时转移.
4 G& ]4 k$ U8 ~3 c JECXZ ECX为零时转移.5 g/ ~" |* N W/ l! d* t" r
4>中断指令
' |# c, R% B* g( ~7 N4 v1 p INT 中断指令# @7 o* q% K. e" s
INTO 溢出中断
' G2 p9 m/ Q$ c% l IRET 中断返回' D! s) E' E r% g% Z
5>处理器控制指令
+ o4 ~/ }( w* J3 k HLT 处理器暂停, 直到出现中断或复位信号才继续.7 E5 J: u$ J/ j7 {9 ~6 \
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.& U: E w# Y7 u; }
ESC 转换到外处理器.
0 ~1 i0 A( Y" {7 B! M7 B LOCK 封锁总线.
6 T4 _) q, ]' n$ B NOP 空操作.
" K8 B# P, \" M. b8 u STC 置进位标志位.
. i1 J. `: J' h! ` CLC 清进位标志位.
! ?- @, P4 F2 O( M# a% z5 r CMC 进位标志取反.# D6 ~9 [$ ^( p2 v- w
STD 置方向标志位.
8 C5 M, c/ o7 K0 J% G+ S4 l) H CLD 清方向标志位.
2 C, V# E/ r& @( E3 U% M STI 置中断允许位.
. z% e% u3 F+ o8 a/ ~ CLI 清中断允许位. e3 Z+ f2 L2 s/ T. _
六、伪指令5 D; k& h" v# l6 o
DW 定义字(2字节).. D) [3 V V1 D# k$ ]) a! p, |' ?( K
PROC 定义过程.
d# o3 n4 a$ U; v& Q, P+ I8 \ ENDP 过程结束.
* y( q( y. x& q) i- o4 l SEGMENT 定义段.# X& D! ]/ a i2 K k6 d: N% a" ?, b
ASSUME 建立段寄存器寻址.0 I+ ]3 A( m8 |- g* o( E
ENDS 段结束.3 q; g D6 a3 w4 Q' P% U+ `
END 程序结束. |
|