|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
~~~- f3 F( w' V" o Y2 d$ w3 s
8086 CPU 汇编指令速查手册: d" }( U% E) i1 g
一、数据传输指令! n% U/ t; J. W- w
它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.4 R0 {0 ~: x% c8 ~& t( a3 e
1. 通用数据传送指令.
$ G4 u: V% L+ {; e! @ MOV 传送字或字节.) T |& {& c1 N5 q$ M1 a, v
MOVSX 先符号扩展,再传送.
0 U5 T' b+ V0 N6 ` MOVZX 先零扩展,再传送.
& B! ] e+ S$ v$ \0 s PUSH 把字压入堆栈.
9 F" g5 A0 o; m, e) [3 g, i3 n POP 把字弹出堆栈.7 v; \3 r' b' z
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
5 |5 R8 ~5 }& ? POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.4 {0 _- a2 C a) \- ~
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
8 D7 q* M$ P- n% M$ T' k7 { POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.5 l( ^/ T. ?0 p5 g0 L, r
BSWAP 交换32位寄存器里字节的顺序
, j: C6 e0 u$ E2 b XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)2 n. H" p3 w; h" v! y: I8 k+ f
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )* y; m. L) H7 C) p. |
XADD 先交换再累加.( 结果在第一个操作数里 )9 ]8 K, T Y! E6 R# G# e
XLAT 字节查表转换.4 j5 }8 b K9 W- N, S! B# ^
── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即
$ _& o4 X: D0 V& i; U2 z4 ?6 I 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
3 ?) z* `1 q; ] 2. 输入输出端口传送指令.0 u* Z& @0 `; v+ a
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )0 x6 {1 O7 i# {7 |5 I1 l) L
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )3 l- c0 ^4 M" Z5 U& T- s4 o9 ]
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,2 @8 `0 l$ L7 Q
其范围是 0-65535.0 L* M5 e' H7 {* |) n) u7 X
3. 目的地址传送指令.# s% _3 o! m0 x# c E ~' y
LEA 装入有效地址.
# I8 l( }; l8 ~, K( ?7 ^9 ? 例: LEA DX,string ;把偏移地址存到DX.
# ]- w7 Q$ v: I, M/ v/ f/ V$ u LDS 传送目标指针,把指针内容装入DS.1 m" J: R8 _/ J# E$ g; _' I
例: LDS SI,string ;把段地址:偏移地址存到DS:SI. ~3 w# `5 @) q- I% O0 H
LES 传送目标指针,把指针内容装入ES.) Z! p8 h- x6 j$ j
例: LES DI,string ;把段地址:偏移地址存到ESI.5 A) F# N! H N+ W1 w/ ]% _: n$ m! B
LFS 传送目标指针,把指针内容装入FS.
8 A5 J5 B* ^0 D( c: @) U 例: LFS DI,string ;把段地址:偏移地址存到FSI.' @7 s( [, \# U9 @, N
LGS 传送目标指针,把指针内容装入GS.
0 l- H' s2 N# v3 R- s$ ]4 ^2 P 例: LGS DI,string ;把段地址:偏移地址存到GSI.
: P1 N; X2 |& o+ I- p9 Q LSS 传送目标指针,把指针内容装入SS.
( d+ M+ b$ S$ i; Q) W* { 例: LSS DI,string ;把段地址:偏移地址存到SSI.
: y) Z0 x& s( R, ?3 u |" s5 O& h* | 4. 标志传送指令.
% G9 n+ ~, } R& v; C- G0 `' d LAHF 标志寄存器传送,把标志装入AH.
! M5 a$ \1 F R) A$ x; ? SAHF 标志寄存器传送,把AH内容装入标志寄存器.* T( Z( |3 m P3 h
PUSHF 标志入栈.
- Q- D( H6 k' D1 |' J3 ~# B3 A POPF 标志出栈. N6 n7 A8 T7 d; k$ }
PUSHD 32位标志入栈.6 _8 Q; y$ ~9 P7 F
POPD 32位标志出栈.
4 |! f+ p) i: Z. | y3 s# X) z 二、算术运算指令4 ]; L9 R+ C' l& Q& n0 y1 k: I
ADD 加法.
6 s% V. N: E+ Q, Z1 v* @ ADC 带进位加法.# E k" B, k6 w2 l
INC 加 1.
7 t" h6 j/ X1 I7 G2 X AAA 加法的ASCII码调整.
$ t) w2 W j W; ^# `1 U$ ~$ p5 K DAA 加法的十进制调整.
# D1 y3 y1 g8 l' e! }4 F SUB 减法.
1 T3 t+ t) N" E. q# y% p' J SBB 带借位减法.4 i- c' L' P7 Y1 n; f+ _- p% \
DEC 减 1.& Z! L( L% D& c) q1 v
NEC 求反(以 0 减之).
1 E2 l* F# m3 B CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
/ z# j; }9 Y5 B8 m4 V AAS 减法的ASCII码调整.2 s; J0 ^: m& Z" o2 F& X3 P! H
DAS 减法的十进制调整.9 I: w7 ]$ V# X5 y- u+ b: i+ F
MUL 无符号乘法.) w1 z5 L5 T* B: r* G+ Y5 q/ x7 M
IMUL 整数乘法.
$ Q2 @9 K6 R- ] Q. r" D8 U 以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),# y# a7 C, l3 k; M
AAM 乘法的ASCII码调整.
, }" Y9 O4 N, i1 j0 x w; q DIV 无符号除法.! D- `" r* P5 U: x. _4 l
IDIV 整数除法.# s' c8 P0 o. o( a6 m9 Q2 D
以上两条,结果回送:5 X* m. ?4 p; y2 ?0 s7 ^
商回送AL,余数回送AH, (字节运算);
9 f; {$ l4 k7 R% z- R 或 商回送AX,余数回送DX, (字运算).
0 M3 a6 S( T8 k AAD 除法的ASCII码调整.# Q# O+ R0 N. i
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
" d0 u( J7 `! @% i, n9 U& p CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)" {( L; a7 i2 f& b9 c, H3 [
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)8 H+ E2 U# Q, ?3 P( W) V
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)# c! |+ p: o( R: }9 w8 i* n c
三、逻辑运算指令( H- x1 S3 E- O" C
AND 与运算.; o a) [2 C4 b" I6 [1 g
OR 或运算.
' H( h! N$ W& b8 ~8 \ XOR 异或运算.
; v7 a: `$ S7 V& e+ o' r1 t NOT 取反.
# ~+ E( d2 q% c8 h1 ` TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).' D$ i: z" L, }3 R% h, z7 v
SHL 逻辑左移.: d+ Z7 U( P: W' W, |! d6 n! Q
SAL 算术左移.(=SHL)4 Y- S, C6 i: c. |/ I4 a( Z
SHR 逻辑右移.9 n$ r& b9 e6 q2 U/ ]0 H3 D
SAR 算术右移.(=SHR)) Q3 E3 p6 a3 ^* Z$ s# b/ L
ROL 循环左移.7 D1 z3 M! u$ V8 K( @5 b
ROR 循环右移./ P- d2 c% \: Y$ f% p j& s6 G5 V
RCL 通过进位的循环左移." z) m6 @% G6 ^' {3 G
RCR 通过进位的循环右移.
/ j) L8 |: L* K" N/ ^2 W 以上八种移位指令,其移位次数可达255次.5 S! e- V: U& c' ?$ h
移位一次时, 可直接用操作码. 如 SHL AX,1.* T! I! P: M( E, C4 N8 U
移位>1次时, 则由寄存器CL给出移位次数.
3 G1 b1 q3 k$ \! C 如 MOV CL,04
; d8 ~" \$ g0 a6 k6 B R8 E/ u SHL AX,CL
; b: I4 a+ J5 {. ^ 四、串指令) T9 ]% K3 j" ?% E& ^
DS:SI 源串段寄存器 :源串变址.
5 Z1 w4 S# ?: o1 s* G: p ES
; W J7 t( ^6 i; ` I 目标串段寄存器:目标串变址./ m3 f( ?! p% H) g) n0 N
CX 重复次数计数器.
6 G7 p" n$ Q, l" u3 z AL/AX 扫描值.3 v& e6 i$ `0 z* t- {1 A, C
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.& U+ q" h( |0 `4 r
Z标志 用来控制扫描或比较操作的结束.! M* s6 @' V2 }; i) q; }
MOVS 串传送.( [; _$ c# v3 m/ s3 i8 \. ]
( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ), ]& D3 C4 t& I8 x
CMPS 串比较.; Q. {5 Z6 H/ K0 u9 h
( CMPSB 比较字符. CMPSW 比较字. )( B9 T0 }' R/ C
SCAS 串扫描.
/ w- ?' O& W* r& _8 y0 v" h 把AL或AX的内容与目标串作比较,比较结果反映在标志位." |- b6 W$ V! l% N* m
LODS 装入串.
. p0 ~4 i8 R0 V( \! i 把源串中的元素(字或字节)逐一装入AL或AX中.
9 K+ P4 x# H; N& d3 G% T, u: [; X ( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
& N; t4 i. s0 ?( N' y; ^4 q STOS 保存串.0 h% C \2 G- ]4 l
是LODS的逆过程. @: a; i. f9 |, t7 ]
REP 当CX/ECX<>0时重复.
1 ^; G" _: H( G3 d/ M4 n+ |8 X6 ~ REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.0 a. b1 I* h" B! l
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
, G. J/ l7 J5 I( S REPC 当CF=1且CX/ECX<>0时重复.. X8 a1 T$ N9 C7 m @
REPNC 当CF=0且CX/ECX<>0时重复.) p- [4 z2 v0 n/ @" n$ z5 J
五、程序转移指令5 [, o* D/ K* g2 F- V+ Q
1>无条件转移指令 (长转移)2 w) ^% r3 Q3 ]; r8 _. d
JMP 无条件转移指令# [2 ~7 N/ Y5 N8 k9 ]/ X
CALL 过程调用
' V6 Z( w$ t X/ W1 Q1 o7 I RET/RETF过程返回.$ h, C1 O4 s7 T7 v* r
2>条件转移指令 (短转移,-128到+127的距离内)
$ z3 f2 g# Y# A9 _, x+ ] ( 当且仅当(SF XOR OF)=1时,OP1% Z8 p+ o4 @* w. e
JA/JNBE 不小于或不等于时转移.2 z( n' t$ s6 L0 k. ^( x! m
JAE/JNB 大于或等于转移.
( S5 E! T5 |0 H; S3 m# z( X+ m JB/JNAE 小于转移.) x0 ~1 [9 `. e
JBE/JNA 小于或等于转移.: Z9 h' t: f* k0 O1 e7 d2 J
以上四条,测试无符号整数运算的结果(标志C和Z).' a& M; B5 m" h5 W
JG/JNLE 大于转移.
6 ^4 _! o H$ p) f ~6 n ? JGE/JNL 大于或等于转移.# Q6 b( A; G+ O$ s4 X% b+ V
JL/JNGE 小于转移.; h- {9 Y, W8 o/ E
JLE/JNG 小于或等于转移.# D6 f) ^! d2 a3 o0 `3 N
以上四条,测试带符号整数运算的结果(标志S,O和Z).' c) u: @( `3 {* T3 L# I: E7 }* H
JE/JZ 等于转移.
. C# Y1 A5 o1 n9 y JNE/JNZ 不等于时转移.
+ O/ n9 ^ z1 `9 l8 x r JC 有进位时转移.
! C6 R3 v+ j6 k2 X0 f JNC 无进位时转移.! V. P( o+ b2 V& Z
JNO 不溢出时转移.2 B9 }# P: p- p( p+ G2 ~2 ]# u, p( O
JNP/JPO 奇偶性为奇数时转移.# V3 a* ]1 O" r/ v
JNS 符号位为 "0" 时转移.
4 h' A- Q+ [6 \% [' v( q) h, F JO 溢出转移.- I7 Q: h" e |" ^
JP/JPE 奇偶性为偶数时转移.
5 j9 m* I! Y5 I; Z; u8 T* C JS 符号位为 "1" 时转移.
% I7 g p. t8 z. ]: O( | 3>循环控制指令(短转移)
T: W4 Q3 ~/ p ]6 m H$ y LOOP CX不为零时循环., k8 Q' \$ d- T1 J( D; z
LOOPE/LOOPZ CX不为零且标志Z=1时循环.
& _* P. N1 n+ E- T% G8 G7 { LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
7 K$ C& W T# }/ k9 M JCXZ CX为零时转移.
( S: f( \: i3 O# i! h& ~0 P' Z0 _1 ? JECXZ ECX为零时转移./ F0 L+ s5 M9 e; L( J; S
4>中断指令
3 y: \! [4 p I INT 中断指令
6 A, E. v1 `4 m$ c: i$ Q+ S INTO 溢出中断
1 \6 l- {' k; D& e# {7 G, f IRET 中断返回3 ^* h$ E% J0 a0 ?
5>处理器控制指令9 J1 W+ N& t' M1 m" h* @
HLT 处理器暂停, 直到出现中断或复位信号才继续.# ?1 g2 H* J. C5 Z0 v0 e
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.
+ s7 U3 F6 j; k; {: z; a ESC 转换到外处理器., R U1 p: N4 o
LOCK 封锁总线.
: R1 N! {' j+ e% x NOP 空操作.. G6 |* @2 |' b0 w* g6 d1 z9 p
STC 置进位标志位.
* j$ V. G2 P& [1 ]& R CLC 清进位标志位.
1 s8 {$ g0 J5 d; O8 ? CMC 进位标志取反.- W z/ P! l O: F0 i' Z( M: `+ B
STD 置方向标志位.
' w2 Q5 q3 T6 H' M CLD 清方向标志位.+ E6 i! M$ ^ t
STI 置中断允许位.
4 i' o0 M( a1 I: c1 f, a CLI 清中断允许位.
' \% h) f& ]% e 六、伪指令
% T( k" v( I$ `$ j: \1 M' m DW 定义字(2字节).
3 c6 u1 Q/ j7 j% D# G: [ PROC 定义过程.
2 o8 O2 ~6 [$ n- {0 E+ n5 d3 { ENDP 过程结束./ z. B6 S. k+ f. O# G! _# l
SEGMENT 定义段.
6 h- W( k* c4 C0 N5 A3 L ASSUME 建立段寄存器寻址.
' U& D j. J& [+ l% N: I8 f ENDS 段结束., O. B! `$ u: m* I9 S
END 程序结束. |
|