|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
~~~
0 \6 P4 c0 B$ s1 y! ]2 D3 U8086 CPU 汇编指令速查手册' l+ o4 T4 o* p0 H8 W. F
一、数据传输指令
- ]* J" p: a* r5 X2 \/ p 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
( g; M% P% [3 g: E h& I 1. 通用数据传送指令.5 i4 A$ v/ k( o. A' Q% B& p1 j
MOV 传送字或字节.% K% z6 X9 g, G- O+ ^4 P, ~
MOVSX 先符号扩展,再传送.& G' c- R' p' m# T* s
MOVZX 先零扩展,再传送. f& B; s: X( D& q
PUSH 把字压入堆栈.
4 F, H$ l3 \) u& C+ h! H$ D# s POP 把字弹出堆栈.9 }* Q4 }; D1 V1 E0 `' _" P5 U
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
# i) W9 L+ D8 t POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
; J+ N, |! ?! E PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
H: w- [ T8 L) ~$ I/ C POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
' n, j- ^4 n: M9 m BSWAP 交换32位寄存器里字节的顺序
* e. q. w' T0 j. F& Q/ R, R XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)1 d2 u" A7 E4 B( Z
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ). }2 U# L) |# b, y% a
XADD 先交换再累加.( 结果在第一个操作数里 )( J) L8 v$ ~& |& d7 l6 N# n
XLAT 字节查表转换.3 g' J+ G7 U1 ~+ V
── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即8 d k: h2 G, n
0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )4 j7 U! m! ^2 _4 e8 ^1 L/ e
2. 输入输出端口传送指令.6 {/ g7 z. X8 q( s# i- F/ U1 f
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
9 t. f$ S3 j, }8 y' q( o OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
. z5 N8 R1 W5 N* `6 K+ Y) T/ Y3 y, W 输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,6 U! U k* I) l9 t
其范围是 0-65535.8 A# r8 p* J9 X; h
3. 目的地址传送指令.
8 W! R& @- b$ _ P+ p$ } LEA 装入有效地址./ {5 A, {3 i5 B6 i9 o
例: LEA DX,string ;把偏移地址存到DX.3 C2 V+ Q; ^( Y5 [3 C9 \
LDS 传送目标指针,把指针内容装入DS.
8 j x0 Y; [! \2 k0 x1 r 例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
+ w1 R; E9 x+ a+ t LES 传送目标指针,把指针内容装入ES.
8 ^; J6 B! q5 l0 u1 o$ w 例: LES DI,string ;把段地址:偏移地址存到ESI.2 A' d. D9 b' w5 l7 g( v& g4 g: K; F
LFS 传送目标指针,把指针内容装入FS.* o; u( X- K& L" ]. Z6 @
例: LFS DI,string ;把段地址:偏移地址存到FSI.
4 s( P' Z/ J& S9 ? U+ ] LGS 传送目标指针,把指针内容装入GS.
( ?8 k" Y h$ _+ |' n# H" b 例: LGS DI,string ;把段地址:偏移地址存到GSI.4 F5 Z- j& x$ e ~* E
LSS 传送目标指针,把指针内容装入SS.
5 M4 ]7 t, f0 P2 \) T7 ^! D 例: LSS DI,string ;把段地址:偏移地址存到SSI.
7 `: f% A1 {) {; C: Z1 }4 d1 q Y% d- \ 4. 标志传送指令.' Q5 `5 z1 p6 |1 f! q4 @
LAHF 标志寄存器传送,把标志装入AH.7 P- c1 K$ v w0 s$ j6 l+ |
SAHF 标志寄存器传送,把AH内容装入标志寄存器.0 v$ H! a3 Z( \; X8 J6 V) ^& T& A& k
PUSHF 标志入栈., w7 w, Q7 t6 N0 n
POPF 标志出栈.
! R$ k: N4 L: r/ r PUSHD 32位标志入栈.
0 t& s1 j6 ?* Z, p POPD 32位标志出栈.5 l, Z% V: g; P$ |& w; P2 Z" \* v
二、算术运算指令: M- L( i2 q& D f, }$ j! ?' u0 @
ADD 加法.% h9 @/ o$ E6 a L5 v9 q# ~- r
ADC 带进位加法.- B2 f8 m4 _6 C3 V7 \! `& ^ V- A: [
INC 加 1.
! k# V- q$ u* S6 _7 s AAA 加法的ASCII码调整.
! p) M; ]0 W" M; Q- d5 F+ k DAA 加法的十进制调整./ R+ e W& Z2 Y1 h$ l$ T# ~, ?
SUB 减法.3 A' r; W' A; W- W1 j! g% d
SBB 带借位减法.
" z3 [; b' q, }, o, b DEC 减 1.
' ^" @# ^9 M: | NEC 求反(以 0 减之).: o% e) E- e( G: j$ V# |" Q2 i( G2 Q
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
% l; S1 N; ]1 H, d AAS 减法的ASCII码调整. ^# m* d9 c: b# a
DAS 减法的十进制调整.# ~' }1 \$ A* z2 [0 Q; N
MUL 无符号乘法., x* [3 F) r3 }+ y7 I$ o2 G
IMUL 整数乘法.! \- i, P) [9 {
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算)," e$ o+ O: ]# _* n- O8 S8 g8 k
AAM 乘法的ASCII码调整." i6 n+ [) k3 P, q6 c! y
DIV 无符号除法.
9 N4 G% {" Y3 G, M* I( E IDIV 整数除法.2 R/ L Z6 v+ n' A2 b
以上两条,结果回送:
f7 ]; m1 v L& _ 商回送AL,余数回送AH, (字节运算);6 R7 |4 O; c9 Y" L7 h
或 商回送AX,余数回送DX, (字运算).
# r2 @- A- @. r" t- D4 a AAD 除法的ASCII码调整.% A1 w8 u+ j) R5 C# h
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)6 f% B( ?9 r) \5 v" X4 |0 b0 y
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
5 n$ K3 O# I5 e: ` CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
+ n7 B, n3 H1 [' _" L& C CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去). Z" [* o& V) u) `4 F" G# Y
三、逻辑运算指令
; N: J! e; d" @0 r$ w" n+ ] ~# H AND 与运算.
+ w' S/ X* ?5 ~' u1 \/ m OR 或运算.& [' z1 d d$ T! O0 G
XOR 异或运算.0 B2 u$ t; T0 I* I; V0 n, |) g" o5 E" Y
NOT 取反.9 M( ~& a* ]9 P5 b, |# j3 P
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
- }/ i# W: @4 o2 V6 \0 ^. e# y SHL 逻辑左移.
/ g3 C. G5 h& O p SAL 算术左移.(=SHL)
$ J( s. f! ]; v' F/ w) c5 G9 [" y SHR 逻辑右移.
/ d3 b6 O0 o+ Q; O9 H+ y, k- } SAR 算术右移.(=SHR), \/ A0 v: t! |' ^1 t p+ j# h+ J
ROL 循环左移.% A: f- z% f1 d N
ROR 循环右移.' P( u* e3 |# g
RCL 通过进位的循环左移.. H4 \- ~+ O, y: J N5 B
RCR 通过进位的循环右移.
! k+ e7 W7 j, X# c5 f 以上八种移位指令,其移位次数可达255次.0 a3 g/ r5 \7 @& b, |, S
移位一次时, 可直接用操作码. 如 SHL AX,1.
1 {* D9 c! x! g7 q0 ^ v 移位>1次时, 则由寄存器CL给出移位次数. t9 M7 h( t Y; z
如 MOV CL,04
5 Q4 w9 [- z' r- T6 Y5 {8 s SHL AX,CL
0 Y2 T9 j% l% a" ^$ m0 A! p4 d 四、串指令
$ ^+ D m+ [/ W7 ^2 t DS:SI 源串段寄存器 :源串变址.9 o. }1 g A1 {: g
ES
. i) E5 v* p& A I 目标串段寄存器:目标串变址.
9 d& _9 m- Q6 p2 F1 l/ v, d CX 重复次数计数器. _" ^3 C( t4 ^: n4 c* m
AL/AX 扫描值.% [0 W7 S& M% T' k6 t0 `3 x9 S" |3 ?
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.+ b1 B1 O d% L X
Z标志 用来控制扫描或比较操作的结束.* V3 P2 T$ K6 k) R3 ]
MOVS 串传送.
3 p; `# O4 o2 s& ?3 C" ~4 J ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )
( C. }- y4 `% ? CMPS 串比较.: Z) y# v+ B" m4 R
( CMPSB 比较字符. CMPSW 比较字. )
+ p- s3 K0 G2 }* } G SCAS 串扫描.
4 W9 D1 y4 e) I5 u 把AL或AX的内容与目标串作比较,比较结果反映在标志位.
; @) \9 H# w& `" D0 s% i: ~5 f% J" M4 o LODS 装入串.
" N; B+ |0 V8 a7 h- ` 把源串中的元素(字或字节)逐一装入AL或AX中.6 B" F! ]. P5 G) T
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
) `, u6 c9 E) r/ s7 { STOS 保存串. F4 r2 D* M' z8 ?
是LODS的逆过程.) s3 N- N3 P+ D2 }2 l
REP 当CX/ECX<>0时重复.
* p: B9 a' F9 b" e) l& p REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.$ o6 H6 l8 O( ]! A
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
/ z, r! i* _9 T! m6 g REPC 当CF=1且CX/ECX<>0时重复.
' {6 p- @ B4 z: W1 W REPNC 当CF=0且CX/ECX<>0时重复.' `6 Z5 u# B O$ {
五、程序转移指令/ f. h1 }' i9 V3 N
1>无条件转移指令 (长转移)% G( u( Q! W' A
JMP 无条件转移指令
% t" _: x. f! \/ b* Q8 k CALL 过程调用
0 g/ X8 W+ n- f$ C1 f x* I RET/RETF过程返回.- }! ~9 X* T; c" s, b) O
2>条件转移指令 (短转移,-128到+127的距离内)# d5 l4 ~) d$ i4 w% e
( 当且仅当(SF XOR OF)=1时,OP12 O+ m# J, |/ C8 ^
JA/JNBE 不小于或不等于时转移.
. m. U" c c K0 ` JAE/JNB 大于或等于转移.3 J |; w( F3 V# C
JB/JNAE 小于转移.
: N, h2 u3 \' X1 I7 G JBE/JNA 小于或等于转移.
- ~- L) H, O0 a$ f 以上四条,测试无符号整数运算的结果(标志C和Z).( S4 ? w' t2 {1 C
JG/JNLE 大于转移.
4 _# m& W# q5 J JGE/JNL 大于或等于转移.
4 E, F4 \/ K1 F. v1 E JL/JNGE 小于转移.2 O e. N( C" J. ] ^* V9 J1 z
JLE/JNG 小于或等于转移.
( t* p- O1 T: }' T. p0 [2 X 以上四条,测试带符号整数运算的结果(标志S,O和Z).
, Y7 W& d9 t& X3 m; H* S* O8 s JE/JZ 等于转移.
: i- S' q! _& B3 r% E JNE/JNZ 不等于时转移.
2 L8 `7 ^& z ^3 t+ ^3 f. p' v JC 有进位时转移.+ A! v4 o& w& Z9 s
JNC 无进位时转移.
3 |7 _& D8 _7 H) O& F n) L4 c JNO 不溢出时转移.
( _! ~4 K0 t: Q6 u! f( ?6 g. ] JNP/JPO 奇偶性为奇数时转移.0 @, P% o2 d( |1 R' ?
JNS 符号位为 "0" 时转移.
& Z, E8 ^0 L# P) [8 ?+ n2 q, R JO 溢出转移.( f$ C2 w2 g" q. V. N
JP/JPE 奇偶性为偶数时转移.4 G7 k4 S" f6 r' c
JS 符号位为 "1" 时转移.% F Z3 O' [! a& `4 J
3>循环控制指令(短转移)2 T, [" U1 w+ a
LOOP CX不为零时循环." h; ^/ E" F/ N+ p: x5 S' M0 ?
LOOPE/LOOPZ CX不为零且标志Z=1时循环./ i; x( {" A9 R3 a5 B. r% Y) b6 j
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
; U3 z' F* S( n( i8 _3 N* b JCXZ CX为零时转移.- s |. l! k1 ~2 y( {9 i" |8 ~
JECXZ ECX为零时转移.
) w z. W; p# d- t' y 4>中断指令
/ y) F, L. L6 Q! k* ~4 { INT 中断指令1 o; K. | y- ?- y/ U! r/ H
INTO 溢出中断
8 [: b0 ^/ K- k IRET 中断返回" g* k" g# d5 K7 d' i D
5>处理器控制指令
( E0 R. y4 ]0 c: V/ } HLT 处理器暂停, 直到出现中断或复位信号才继续.+ l, d1 Y6 t9 i& b& }; U4 [
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.
D# { J( D. Y4 @' [5 Q ESC 转换到外处理器.7 f- s- k9 T& D# h* c) m
LOCK 封锁总线.
$ f, O3 b( c4 Q NOP 空操作.7 Z6 x! A. w$ x( J& m0 C
STC 置进位标志位.5 y3 f' o* R: [/ Q
CLC 清进位标志位.
! u) E6 v& s' ]4 ?) u6 A$ l9 n: R- o2 X CMC 进位标志取反.
; B6 ^: s8 `+ d& F STD 置方向标志位.
, o& n! i1 ~* ^; p( G9 e6 H+ W CLD 清方向标志位.6 o( |3 {8 h# Z
STI 置中断允许位.. m0 z! d' _$ z& c; D! x P Y t
CLI 清中断允许位.
7 `1 g* y# K6 Z; K, J+ G( [' {) v A 六、伪指令
3 o H2 Z4 ?& B! g6 K DW 定义字(2字节).
8 s, b2 y) _) T- \+ P1 B PROC 定义过程.
' ?' H. p: S) l" B; z ENDP 过程结束.0 \/ E; r5 x3 V
SEGMENT 定义段.
$ g4 u& F# F# T2 U: H5 p9 X ASSUME 建立段寄存器寻址.4 _) _6 V+ m- a/ X- K% G8 }6 _
ENDS 段结束.$ }7 F9 l4 q0 i. I
END 程序结束. |
|