|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
~~~
" q1 r) D& P1 |7 K9 g8086 CPU 汇编指令速查手册+ u1 r: B: K8 z( Q4 o
一、数据传输指令( a4 [+ [. U6 u M0 I
它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.- n2 j/ i. u. f0 }
1. 通用数据传送指令.0 s9 A7 v- t' U- Q
MOV 传送字或字节.
5 d) ]; _, h$ S MOVSX 先符号扩展,再传送.
. g5 n9 C6 s" B$ B9 C. F7 ? MOVZX 先零扩展,再传送.
6 F5 R; Z' W g2 U. b PUSH 把字压入堆栈.6 h5 \+ G) x) w
POP 把字弹出堆栈.& T. R- v8 a- s1 v
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.! A9 Z! \) `; H( F/ G3 J. ?6 w, w
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
9 W" \1 F4 r$ ~0 N2 P PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
4 _% t( q' S- d POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
\9 D v, `2 [ k2 p BSWAP 交换32位寄存器里字节的顺序1 M" K- [( k) x; N" z" ~) R* @ w
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)4 \) e9 f# i- }/ s/ R' l
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )0 F* J+ M2 ^0 _! {$ L+ M g
XADD 先交换再累加.( 结果在第一个操作数里 )9 c: a3 A- c& {
XLAT 字节查表转换.# `9 B/ ~) A/ P7 ~5 \* o1 Q
── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即3 c1 c D9 W# L, _7 p$ I
0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
) X, C( f% B! G0 P6 b 2. 输入输出端口传送指令.
2 t0 x, J! _/ m- F) m IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )) v- x7 S$ [/ e! }2 { q; f" u
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
! }6 r/ t3 a O& o) ~9 c3 o 输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,
; k. p$ e8 D3 d0 N: O" { 其范围是 0-65535.
5 q' Q+ }1 p* ]3 L8 y1 m 3. 目的地址传送指令.
2 e( @. I* r; K% y& q* N4 F LEA 装入有效地址.
2 ]: [8 b. J# Q6 ~! N# s4 P; [ 例: LEA DX,string ;把偏移地址存到DX.
! P5 w: B4 M9 S9 |: d LDS 传送目标指针,把指针内容装入DS.1 M# R. ~3 ]$ e% V: R. ]3 E
例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
' o/ h9 y- u x/ e$ V LES 传送目标指针,把指针内容装入ES.3 a; D3 ^& l& K1 @9 m4 I) y
例: LES DI,string ;把段地址:偏移地址存到ESI.# p" u/ c* C9 C+ D! g& E. a4 M
LFS 传送目标指针,把指针内容装入FS.9 {* J) z/ `* v3 f7 c* \- j! q
例: LFS DI,string ;把段地址:偏移地址存到FSI.
: Z5 l! _* V A: G LGS 传送目标指针,把指针内容装入GS.
/ @- C" Y6 {& |1 P+ ~- \- Z* `& ^3 [ 例: LGS DI,string ;把段地址:偏移地址存到GSI.2 N5 W5 R7 M! N
LSS 传送目标指针,把指针内容装入SS.
2 m; _/ T+ @) U1 `6 s 例: LSS DI,string ;把段地址:偏移地址存到SSI.7 e" L% f3 ?0 I3 i4 K1 @
4. 标志传送指令.
* O" o' }" V, t: {3 W0 M LAHF 标志寄存器传送,把标志装入AH.
8 `+ ^9 N( ~0 b SAHF 标志寄存器传送,把AH内容装入标志寄存器.
0 f: h, e. C9 g$ R PUSHF 标志入栈.
2 a5 w+ w- K7 A% _ POPF 标志出栈.
5 u, M; d8 f% ~ PUSHD 32位标志入栈.' {- `+ q2 Z# ?$ ~# f
POPD 32位标志出栈.
% `6 Z8 j0 M; }9 o+ Q 二、算术运算指令& J. u/ f' X a# p' _7 d1 y
ADD 加法.
- k, s- B0 T, \# `- n$ `; y ADC 带进位加法.! V n/ p6 a. A+ G. A
INC 加 1.
' x: p. j: C. \9 t! \4 X" S* K* j AAA 加法的ASCII码调整.: f) s& t- w0 {. Q6 b
DAA 加法的十进制调整.2 i6 V5 [1 a# q$ v+ w
SUB 减法.- a; s% e8 }- `* O
SBB 带借位减法.' `7 J: t' ]+ l. f4 j
DEC 减 1.* x" r' k1 j7 @2 U$ [1 n. E7 u
NEC 求反(以 0 减之).
. w. V' b: k( F% Q1 ?6 C$ B+ _ CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
& k% b/ X9 ]# `7 B O4 |7 t AAS 减法的ASCII码调整.
4 V M+ G) A5 o DAS 减法的十进制调整.
5 i8 H7 b$ C; `( W MUL 无符号乘法.
: j& _7 v8 U( Y- c u IMUL 整数乘法.8 ?) _: V! O7 e" y) O% C% D) e( K
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),& v: H" A Y$ C1 `/ ]
AAM 乘法的ASCII码调整.& g( a( B0 q( P
DIV 无符号除法.
7 s. x3 F. J3 R$ F8 ]6 | IDIV 整数除法.
/ K6 c+ h- A! O. R 以上两条,结果回送:- h: z8 C8 O v
商回送AL,余数回送AH, (字节运算);
4 ^' E- U+ R @6 e* D8 ~ 或 商回送AX,余数回送DX, (字运算).% [& ]5 {! k% M" V" I2 S
AAD 除法的ASCII码调整.# D( |: Z, ^7 h; L. e
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
; W4 k# W; @% }0 J CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)7 r1 E; p: r1 _, S" R1 ]+ J
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
! h M; T8 u0 y. N! q. W CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
( |7 ]/ l# N8 \. w2 t8 y& T$ r6 L2 F 三、逻辑运算指令- x7 E: [: w/ b3 y7 }7 [: U. W
AND 与运算.) h* c) D0 Q! q7 H" W8 [: L" ~4 T
OR 或运算.8 c' C& c0 j% L0 h( A
XOR 异或运算.
! T e8 N, w6 a2 v4 W& V NOT 取反.$ i, M; _) ~) f. e
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
1 U V" _3 s I8 M4 y9 I& T# E5 ~ SHL 逻辑左移.* {9 I! r, f6 G; b
SAL 算术左移.(=SHL)
3 e ^4 R: Z2 S% l+ A# b SHR 逻辑右移.( J' Y3 z4 x' @& B- y
SAR 算术右移.(=SHR)
/ Z2 I9 C% _+ ^# f ROL 循环左移.
1 e) E" T, A! K$ S1 }* y$ C ROR 循环右移.
' N, k/ \8 s' z% l8 ~2 ]: m* Q: N RCL 通过进位的循环左移.: Q" J: x; w! h3 c
RCR 通过进位的循环右移.
$ B' ^0 u0 Z8 q3 o: x' d0 O 以上八种移位指令,其移位次数可达255次.
, n2 f, i+ h9 q, A 移位一次时, 可直接用操作码. 如 SHL AX,1.7 c( Y6 G- R( k- _
移位>1次时, 则由寄存器CL给出移位次数.& C1 x1 k/ |/ [- L, I; O! x
如 MOV CL,04( `+ _* `& D5 O6 T' S1 x
SHL AX,CL
7 |% O. _' h# K$ E; \. K" ~ 四、串指令
5 ?3 j, t0 j9 P- l9 D: [ T DS:SI 源串段寄存器 :源串变址.
0 i+ k8 l$ J% w7 r4 `6 S+ K8 M" y ES9 \0 S7 g" e4 o3 M% T0 o
I 目标串段寄存器:目标串变址.
% F% D# F# R Q0 L) b* S CX 重复次数计数器.
% _- V& T, U/ C1 `- n% j& a' O3 S AL/AX 扫描值.4 M& h; y5 I0 U, [4 Q( O5 [: j
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
% @3 X/ a0 R1 d Z标志 用来控制扫描或比较操作的结束.
: y- E: v2 o6 Y$ W- g MOVS 串传送.
* _, E7 v+ U1 ?1 J d ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )6 F/ W6 m, \$ t
CMPS 串比较./ r3 H$ ~& I) m) j/ {( \ f
( CMPSB 比较字符. CMPSW 比较字. )
f8 s9 k' H4 m9 u J) c SCAS 串扫描.
6 |' A1 U+ a1 T) M: c3 _ 把AL或AX的内容与目标串作比较,比较结果反映在标志位.2 i- g; y4 w& T' D4 a' t
LODS 装入串.- l0 I+ d+ ]+ o( g+ d6 J
把源串中的元素(字或字节)逐一装入AL或AX中.& z l3 x# D. x+ C. U
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
, L, [ M& `% ]1 `! z; M( S, `2 h7 Q STOS 保存串., e0 [7 L1 b' p* |1 @
是LODS的逆过程.* h+ y' D5 R6 y, w
REP 当CX/ECX<>0时重复.
1 H2 D: c, q5 j+ D f- g+ ?1 X REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.; Y1 V Z5 ]0 o
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
4 f0 C) y# M6 z5 d REPC 当CF=1且CX/ECX<>0时重复.& W: m! J# g0 q1 l9 f( {' g
REPNC 当CF=0且CX/ECX<>0时重复.
* T, B& G! F: Z; F 五、程序转移指令
+ Q) _5 N7 K' W' w8 E: a! {& ~ 1>无条件转移指令 (长转移)
* M a) k4 B' S- |2 f JMP 无条件转移指令' n. F6 \ ?2 B. s1 c9 _+ Y: K, {4 Z
CALL 过程调用
. d% T! ]$ z5 r8 I3 ^/ C RET/RETF过程返回.: N; P! C: O9 L5 W4 R7 `
2>条件转移指令 (短转移,-128到+127的距离内)
) A# S: K& G, j& W; X6 c ( 当且仅当(SF XOR OF)=1时,OP1' J: S+ I1 K/ m1 Q9 F M
JA/JNBE 不小于或不等于时转移." Q" J! l# J2 U4 D) W( H% A" w
JAE/JNB 大于或等于转移.
/ }! [8 [$ l9 b$ N& @/ m JB/JNAE 小于转移.8 ]; ~; h- a4 K" A3 ~5 N
JBE/JNA 小于或等于转移.* u. _: q# a% |& ?5 w4 l! d
以上四条,测试无符号整数运算的结果(标志C和Z).
( `) N d' l( D0 b: ?& F* p3 y JG/JNLE 大于转移.3 T8 m n7 z: W: i7 x
JGE/JNL 大于或等于转移.6 o# _2 ~/ \8 I5 `8 f( U5 ]
JL/JNGE 小于转移.
& w0 F3 G6 d6 j% z: O# i JLE/JNG 小于或等于转移./ I- {' T* v/ }- q2 e$ l
以上四条,测试带符号整数运算的结果(标志S,O和Z).
$ T3 G. w# l) u) J; c JE/JZ 等于转移.
( U- [$ h/ a0 U! x- P JNE/JNZ 不等于时转移.
1 g' {2 A1 q" @! X) n JC 有进位时转移.
/ R: Q8 M8 E0 w$ H4 e JNC 无进位时转移.
6 h% [3 B5 i8 `/ E6 Z JNO 不溢出时转移.! h8 n: w2 v H( ?* J: N
JNP/JPO 奇偶性为奇数时转移.
$ J+ a& v( _, M. g5 J2 _. P+ b JNS 符号位为 "0" 时转移.. B$ [ ?, p! @% K a
JO 溢出转移.
# h4 c" N, {* ]; l! l' b, O/ { JP/JPE 奇偶性为偶数时转移.7 J3 q0 Q; y/ ^- |- G$ Y5 l9 Z
JS 符号位为 "1" 时转移.
. ^9 x1 q0 B9 m' o/ M# x) e 3>循环控制指令(短转移); P4 P( J( w e q" K
LOOP CX不为零时循环.
9 _8 m. s" F2 W5 e LOOPE/LOOPZ CX不为零且标志Z=1时循环.
0 q- E0 ] j" P" f0 h LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.1 }2 e, L Q4 l1 _
JCXZ CX为零时转移.
( w- M! ]- M9 z; r: }% |8 x5 { JECXZ ECX为零时转移.+ j: S& j) I. {& l% P
4>中断指令
* Q W# `' o2 t3 A4 t- O5 L INT 中断指令 o6 z/ q, `/ y3 E$ o5 N: b& m) w/ U
INTO 溢出中断
& {0 x+ ^8 m9 u/ t. j0 D IRET 中断返回$ S2 V: o6 a! U y+ I; m
5>处理器控制指令7 p, K5 @ ^. }' G$ ]! o
HLT 处理器暂停, 直到出现中断或复位信号才继续.
- u" `' E/ s! m8 m9 M WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.* A9 r8 C/ x4 Y! h/ N b, A2 r
ESC 转换到外处理器.( x! i: L) Q4 k! r
LOCK 封锁总线.
/ ^+ l# Y* Q! L NOP 空操作.
: o8 l* ]( z9 l8 g$ b STC 置进位标志位.+ o$ Y P; V; k u3 N% H
CLC 清进位标志位.( U% n0 Y0 }, l4 _
CMC 进位标志取反.
" @+ c3 v4 |# B STD 置方向标志位.# U& N& Y% q4 S' h! \$ N+ f
CLD 清方向标志位.- Q& v j! }* _
STI 置中断允许位.
4 F; S3 } ~) E3 ]8 b0 X CLI 清中断允许位.
8 \& p- s& D3 |( v" t4 f% l0 [# h 六、伪指令
' J& p6 ^1 k7 X% O, D DW 定义字(2字节)." `1 v% ?, q4 y, p
PROC 定义过程.
* K# A" |# q+ W% C2 j; C& u ENDP 过程结束.5 a3 C3 J1 d+ K- T' n& `6 n
SEGMENT 定义段.
& ~3 T+ L# i* t) | ASSUME 建立段寄存器寻址.
( y5 g K# J* l* Q- i ENDS 段结束.
# B0 {$ v! ^* a" v END 程序结束. |
|