汇编指令是汇编语言中使用的一些操作符(如mov,inc,loop)和助记符,还包括一些伪指令(如assume,end)。用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。
: E. ^- ]3 \7 `" k% z一、数据传输指令! s5 T+ }- a( d4 L8 r
它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据。 / M; m4 J# r- T5 b5 [
1. 通用数据传送指令
3 P) m- B5 T' @; w* y" S5 c8 zMOV 传送字或字节. ! T5 ~ t/ s7 |( t9 ~
MOVSX 先符号扩展,再传送.
! s& h& A. @0 @6 z" yMOVZX 先零扩展,再传送. $ `0 U( U g7 v. X Z& N/ C( ~8 P
PUSH 把字压入堆栈. ! ]9 N, F* [/ z9 p- L. i
POP 把字弹出堆栈. f. t, J" N0 e$ {) L6 o
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. : Q$ R9 T! `2 w, B$ C
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
( G$ J' [: l4 X: i9 yPUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. 7 \ N/ _' `: W+ H c' W: K
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. : w; j3 ^; q6 d, D, Z% F
BSWAP 交换32位寄存器里字节的顺序
$ k1 |% j0 Q' I6 pXCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) 6 _% e/ F! X4 A' T! v( y
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
, R) Z+ B) P3 l# qXADD 先交换再累加.( 结果在第一个操作数里 ) # d. z5 ^! `- W/ r4 ^
XLAT 字节查表转换. ( O* G J4 B1 j3 Y s
── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
! b0 S8 `0 t+ t8 E; _, ~2 i- r/ ~+ H: w
2. 输入输出端口传送指令.
4 f. E' u2 W3 T+ q7 W+ }; ^IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) # O5 P& o. k1 W+ U$ X7 ]
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) % T+ _) [$ H9 Y7 D4 A
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, 其范围是 0-65535. , o# v. U; ^4 }/ ?: b; v7 T
9 {/ @& u$ k# X _9 Q
3. 目的地址传送指令. 0 j2 H4 b( P' ^9 B9 Y
LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. ! M2 t$ A4 G8 k6 C" p, Y
LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
1 Z( G5 i% o" T" S; gLES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ESI.
" f$ y# |# @! l- t# m8 YLFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FSI.
0 @8 F7 w4 Z9 uLGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GSI. / W( C) n* j1 w8 D# R9 o: a( i
LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SSI.
0 ~0 i y2 _' ~0 T5 L7 ~8 y5 p( c6 P- t* E# f6 ~
4. 标志传送指令.
6 V; p! u6 f9 [LAHF 标志寄存器传送,把标志装入AH.
2 v" K0 u% a6 a, X- e" ISAHF 标志寄存器传送,把AH内容装入标志寄存器.
$ x' \2 ]" b* f; B u5 u% X7 U7 J* XPUSHF 标志入栈. / A" e E) {% k5 w. u5 V. j
POPF 标志出栈. ; M; [7 m8 h* [ r
PUSHD 32位标志入栈. / D5 j% M. h) c6 l
POPD 32位标志出栈.
4 J, S% t2 S' |* P- b" ]+ ~二、算术运算指令* V1 D0 o+ L @2 [ \* i
* N" |. A, z, s& E, t; O
ADD 加法.# A, \2 m- O; }4 E9 d7 Z* `
ADC 带进位加法.
' P5 o- S: p) X! G; L INC 加 1.8 b, v/ F5 n- C& w
AAA 加法的ASCII码调整.% V( H5 Y2 g; k+ i" @/ K( _. _
DAA 加法的十进制调整.6 p6 h _( l/ S' _: D. I0 E2 H0 n8 M
SUB 减法.
* o# P# x# M' |* w8 W4 q. P6 f SBB 带借位减法.
; i0 d: M5 N0 t0 L# A: B7 j) B DEC 减 1.
% d! V8 b; d- W5 l1 B7 z# T1 D NEC 求反(以 0 减之).
% H/ a3 [% U! i CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).4 W3 c! b& A4 Q6 n
AAS 减法的ASCII码调整.( o, ~# D5 Q4 a; v: ?3 p w
DAS 减法的十进制调整.
9 @, b5 N1 m5 P: R: F! z3 i% i MUL 无符号乘法.
3 O6 q0 R! _" |* v$ C! L y IMUL 整数乘法.# Q; [8 ]0 M) a) W1 B0 H( R
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), k+ r% f: J1 e& `; v. x% I
AAM 乘法的ASCII码调整." I' }! w( y8 \1 n* @/ k( T2 b
DIV 无符号除法.
* ^1 M! Y* `* Z. n3 d8 t IDIV 整数除法.% A% \1 ]7 y {. G% B! b0 o
以上两条,结果回送:
9 H h) H8 `& w. A% i2 B" M4 X4 L 商回送AL,余数回送AH, (字节运算);* U# Y/ |+ H; p1 }- I2 s8 N
或 商回送AX,余数回送DX, (字运算).8 }. W+ q9 V0 t, d* y! m+ f9 U
AAD 除法的ASCII码调整.
8 \9 ~! |3 d4 _$ q2 G CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)2 I7 n. z0 C7 e5 |% b
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)+ x* ?. Z* \$ ~' ]2 O( X2 M. m
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去). h7 R& @4 ^# h
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去) ; Q; K$ V0 A& i, ^2 i9 K
三、逻辑运算指令
! g: `+ `& V5 p$ Z2 |0 T, ?# ^$ p/ _, x$ G# Z* ]) W+ T
AND 与运算.
! Y+ Q: u) G0 e+ L or 或运算.; w* t, u1 h! N. K1 N) Q2 [5 M
XOR 异或运算.
0 V9 L. e0 ~6 R- Z8 q NOT 取反.
8 N4 R. l( q4 _3 H& I: W TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).% g$ |( @/ m* ^$ N3 t
SHL 逻辑左移.
) [& G0 ~" B, Q. l SAL 算术左移.(=SHL)
7 p% n0 R* [- A& m% H! m SHR 逻辑右移.
) c1 l- _- d2 w9 u SAR 算术右移.(=SHR)
Q/ p* B. n6 [/ {& C, y r ROL 循环左移.
0 q T. p' j& Q5 r# A' f7 W ROR 循环右移.
# ]; B6 {& |9 j5 P: I' w RCL 通过进位的循环左移.
! R2 e% f M& t' v, g8 S' @ RCR 通过进位的循环右移.
" N) {7 C. Z1 | 以上八种移位指令,其移位次数可达255次.& F& p6 f/ d1 ^# C( r3 ]# D, V
移位一次时, 可直接用操作码. 如 SHL AX,1.; b! S6 H, Y& G
移位>1次时, 则由寄存器CL给出移位次数.
5 F$ B) v# Y3 ]6 j/ e* J 如 MOV CL,04
9 S7 h; A) H+ r, K SHL AX,CL * I! V0 g9 |; M9 a* Q
四、串指令
# E2 l9 E( D4 E4 s2 Q
6 g# g# _ ?0 D5 n T) `0 ^# X DS:SI 源串段寄存器 :源串变址.
9 v9 }9 t4 N. V: J y ESI 目标串段寄存器:目标串变址.
$ p% X' A1 m( P4 m% T' @1 Y CX 重复次数计数器.) Y5 ^) ?* D, |
AL/AX 扫描值.$ t b E! \, z0 b) T* ]# B+ e
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.2 y5 }0 @5 c i! \" e
Z标志 用来控制扫描或比较操作的结束.
1 V6 l( I- E3 Y: a* _5 t MOVS 串传送.
. ?$ {, `7 H" a! x% b. l7 n ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ): E& }" b: b; M6 a
CMPS 串比较.
# f7 }. d" ~: y" L9 f5 a! B4 ~ ( CMPSB 比较字符. CMPSW 比较字. )3 p/ L. G4 l& F
SCAS 串扫描.7 g1 L2 z$ [. } q$ |5 p! x
把AL或AX的内容与目标串作比较,比较结果反映在标志位.$ ?7 r1 h3 ?9 B; a* X
LODS 装入串.
- n) }. w* y% ]+ o. p 把源串中的元素(字或字节)逐一装入AL或AX中.: y7 r3 Z; }) X; t+ `0 Q8 k9 e
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
0 Y4 ?2 `8 D3 g# S* J: l STOS 保存串.
: h% c0 O( K4 u9 H) R- d, a 是LODS的逆过程.# K! v4 p3 E$ F
REP 当CX/ECX<>0时重复.
* l# w" G: z. w' X @9 W) \ REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.
) G' D. d w: K5 J REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.- ^" r& J1 }3 y ^" o2 b7 W
REPC 当CF=1且CX/ECX<>0时重复.0 D* N" \' _* h. L M
REPNC 当CF=0且CX/ECX<>0时重复. 9 c8 c6 m. D8 N* g8 V# i, T
五、程序转移指令
7 m; U( p9 G4 h! m& N9 K9 B0 p+ I% f7 G
1>无条件转移指令 (长转移)
/ Y! K! M, i/ [ JMP 无条件转移指令
3 x E% @. {4 k2 S. A CALL 过程调用
/ v" N& R8 j* ^. o8 P RET/RETF过程返回.! T L; e9 d( G3 |/ U0 Y
2>条件转移指令 (短转移,-128到+127的距离内)
4 m& C- T& y) d( x9 {: Q$ Q ( 当且仅当(SF XOR OF)=1时,OP1<OP2 )
" {3 n1 D6 x; @1 F JA/JNBE 不小于或不等于时转移.
7 l& w2 ]+ E" r/ P6 ^! _ JAE/JNB 大于或等于转移.
/ G9 y0 z. {2 ]$ N c+ j) {* P JB/JNAE 小于转移.' i# T. t, n. k+ j
JBE/JNA 小于或等于转移.: p/ n6 Q$ r+ ^% H: c% i' ?8 a
以上四条,测试无符号整数运算的结果(标志C和Z).1 K1 U3 G/ x- g! T# v- I
JG/JNLE 大于转移.1 c1 h, `' I6 u: c8 h5 r2 A
JGE/JNL 大于或等于转移.
9 e" i6 p/ r- m1 r! r6 e JL/JNGE 小于转移.
B3 o1 P% s5 ] JLE/JNG 小于或等于转移." H s0 e2 S7 T. m. S
以上四条,测试带符号整数运算的结果(标志S,O和Z).
$ U9 I" k. [) R6 S. f7 ~% S0 ] JE/JZ 等于转移., {3 l, |& {" v4 u1 n
JNE/JNZ 不等于时转移.
6 T* ~% E6 R" B& ^+ F g JC 有进位时转移.1 p K, e3 q0 f
JNC 无进位时转移.
0 w( p& ?* P6 Y3 H4 r5 l2 @ JNO 不溢出时转移.
0 g; i7 T+ z0 r r8 D9 m4 _! Y JNP/JPO 奇偶性为奇数时转移.! k1 e2 ~. v1 `1 K2 \
JNS 符号位为 "0" 时转移.8 ~4 u& M3 G( U! C, D: d3 O
JO 溢出转移.1 u4 p T, v5 s% Q/ X# L; ?) [
JP/JPE 奇偶性为偶数时转移.
+ a. x. H( S. {0 S- q) z* d$ A JS 符号位为 "1" 时转移.
6 D0 p" o$ W& }1 O$ ]; k 3>循环控制指令(短转移)
2 r/ s1 K8 B* v( k LOOP CX不为零时循环.
( H/ f; U% m/ P# [. ?( }7 s LOOPE/LOOPZ CX不为零且标志Z=1时循环.3 M6 N) l- {# R a0 b* Q' E
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
- c0 t+ T& A4 x. [% s) I JCXZ CX为零时转移.1 j/ N7 J% ?2 ^: G% Q2 N
JECXZ ECX为零时转移.' t/ A& x) U l
4>中断指令+ k8 @& n/ \5 f3 u+ K( i
INT 中断指令1 T& w8 a9 R( B5 H' q
INTO 溢出中断' g$ N5 t- B r5 E% W% X8 ^
IRET 中断返回$ f5 C3 v; |; J! }0 S% O* d
5>处理器控制指令9 J' z" [( `$ j9 ?! ?
HLT 处理器暂停, 直到出现中断或复位信号才继续.
s! ~& h4 I, u1 [6 f WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.' }0 T" q ]3 D# ?2 I
ESC 转换到外处理器.5 Z( ]' `$ Y: H' v5 I
LOCK 封锁总线.% d- K, ?. }* B& Q
NOP 空操作.: u; j( m! g6 t" W! W! A b. U+ `
STC 置进位标志位." f& ?) T% e3 _$ U; V
CLC 清进位标志位.
7 n9 ?3 N4 ?; T- u. x. B CMC 进位标志取反.$ P' I6 a" \0 P4 ?% {$ H
STD 置方向标志位.
4 z' [7 i, [3 N1 r! A% P8 J4 i CLD 清方向标志位./ R* V$ I7 H) C% L
STI 置中断允许位.3 u3 Z" H- H/ [% \! x: s
CLI 清中断允许位. ' f7 i) Y1 C% J) `, X
六、伪指令2 ?0 g/ y! C7 A$ G! r S7 z
9 k( R* r* G* `3 w. m1 U3 T DW 定义字(2字节).: ?$ Q0 X/ K U s2 d
PROC 定义过程.
. L! o4 s& k; f, Q" v5 c0 B ENDP 过程结束.' l, Z. o1 F5 [+ E0 j
SEGMENT 定义段.
4 C2 \8 i4 [% ]) m2 `$ T" s7 f ASSUME 建立段寄存器寻址.: K0 {8 \, }$ z6 t9 G( }0 P3 N
ENDS 段结束.: P' n8 Y" ]- Z) r) A/ U: ^
END 程序结束., W2 c7 M2 ]; P- Z- N
七、处理机控制指令:
, Y; H' ]) p$ S/ Z 标志处理指令 CLC(进位位置0指令)' `- w) w; f5 I! {. g
CMC(进位位求反指令)' B5 b# g: s% b: p
STC(进位位置为1指令)
/ h$ ?. E" B, Q# z8 p CLD(方向标志置1指令)
0 S% G( j) r1 R; S STD(方向标志位置1指令) D, A. |. Y1 N0 C( h$ G
CLI(中断标志置0指令)/ s* e: W8 |; E7 u" z
STI(中断标志置1指令)
/ u( b3 F h1 k, }2 T NOP(无操作)
% c/ B5 d( I+ r) M% u% c ^ HLT(停机)5 C" F" Z2 t2 L6 x+ W' ~/ X
WAIT(等待)) A l! k% B3 `, E- J! x( a
ESC(换码)% |) D8 f: |- y0 p$ L9 }
LOCK(封锁) - ^! Y; d' p! ?2 [
|