汇编指令是汇编语言中使用的一些操作符(如mov,inc,loop)和助记符,还包括一些伪指令(如assume,end)。用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。3 J' U8 \2 F9 B) v
一、数据传输指令1 L# @: U1 U, x! ?, U% u
它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据。 2 B" V/ \& _" H3 F1 }
1. 通用数据传送指令 # a' U1 U4 d% H* P- Z; S! ^6 M
MOV 传送字或字节.
5 R" A. l! `* Y% HMOVSX 先符号扩展,再传送. , j8 C7 x6 v6 `* ^0 B
MOVZX 先零扩展,再传送. , ]' f5 _. s7 {
PUSH 把字压入堆栈. 3 ]- p1 i$ h) w8 N) I% E* b9 ^
POP 把字弹出堆栈.
: w/ y6 h3 j+ y% n1 z; BPUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. 8 t. V$ G( }. _4 {5 F
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. , W- q# @5 Q4 [6 Q6 G
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. 7 M7 Z* @" _* E0 ^ a
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
5 \1 Y! ~0 [( J5 g9 j4 P& tBSWAP 交换32位寄存器里字节的顺序 ) f. `" A! `$ Q) I
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
. n1 K0 C0 o6 T6 C, {CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) - y5 }1 c( B! {# z$ l9 K" _! }- v
XADD 先交换再累加.( 结果在第一个操作数里 ) , r3 O1 w m# h9 H; z# h. w
XLAT 字节查表转换. , E. @5 [+ h* |3 d$ [
── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
. b' h$ S8 c J- h i& K8 N
3 H* b3 n V$ M' V2. 输入输出端口传送指令.
/ V+ g* w& l1 @7 N6 aIN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
' ~* B( k/ p+ [0 zOUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
# F3 K$ C T0 a; S& X# h3 ^输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, 其范围是 0-65535. 6 ?- w; R8 j8 @5 q; |; h! i
; p4 u" m2 y" J1 ~+ { O
3. 目的地址传送指令. ) ^6 O {9 V' d/ k
LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX.
. e# e: m/ ]$ K$ `. WLDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
) A* o9 G5 K: b' i5 s5 ]LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ESI. / f5 \' B6 b( T7 R/ n- o( d
LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FSI. 9 u0 i! W% ?! L
LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GSI.
6 P9 n$ G8 x# U1 wLSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SSI.
: n# \( o9 z+ v( z1 ^7 e" K9 y/ ] R; B
4. 标志传送指令.
) D) H; ?- `& ?% d6 e& g ?LAHF 标志寄存器传送,把标志装入AH. ( M8 v5 b* H3 ?, c& G; h3 H7 [
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
+ ]: H. N. w# f: O j: ?PUSHF 标志入栈. 2 p. Z" t# t- w/ I1 X4 R
POPF 标志出栈. - E, Y( _: l! n0 I8 e
PUSHD 32位标志入栈.
: Q$ S7 n: A- [1 yPOPD 32位标志出栈.
' X3 e8 X, Q3 X, A% j9 |* J0 J二、算术运算指令" D0 G! n4 V: h }- J
- v( }- U5 }3 P5 V ADD 加法.
- L/ ]3 R1 @* F8 h ADC 带进位加法.$ ?6 m3 s4 E! k' |' E4 W
INC 加 1.* @ U9 R- Z @
AAA 加法的ASCII码调整.3 }* ^( I; D. P+ N
DAA 加法的十进制调整.( ^' W4 ~1 ]( }2 D( F
SUB 减法.
4 T: U& u/ B( N7 j% s SBB 带借位减法.
( n7 k# T( N" `4 B DEC 减 1.. {* Z6 `& E! l; r
NEC 求反(以 0 减之).* K! u* Q1 P$ O( W9 R5 ~* l
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).: l K! H9 f! _
AAS 减法的ASCII码调整.) d3 K& t) P& |$ i ?, w7 U
DAS 减法的十进制调整.
8 Q! Z6 \ N1 U) P MUL 无符号乘法.
6 k. @$ Z, o5 R0 F, W IMUL 整数乘法.
5 l! R: k& g1 b' m4 A; q 以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),7 C! y8 {$ T% G* J9 i
AAM 乘法的ASCII码调整.
" \* b, A, K. j( d" E1 X& c& | DIV 无符号除法.- @' g( G) ^, N
IDIV 整数除法.& o( C. [* G+ ^; G/ {# z9 I6 I5 P/ x
以上两条,结果回送:
# ?% X4 r; f9 X; l ^: ^0 i. N 商回送AL,余数回送AH, (字节运算);7 c' N- w. G! V" C5 q1 k" U
或 商回送AX,余数回送DX, (字运算).
' g" L- Q- d: |( F, Z AAD 除法的ASCII码调整.
* F* F, [* \' X4 k6 C, W( W CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
$ Q6 l" {% p a7 ` CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
$ Q: a" H8 T) d9 G' X CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
% E* b6 d5 w& i: r Z CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去) . v! F; H' W4 [+ Z4 z- Q
三、逻辑运算指令/ w, x4 [) _7 p& u6 U& T
/ {+ v6 h8 z3 J4 H/ A8 { AND 与运算.
0 K1 { M# g, _ a, D. M+ ?1 P# r or 或运算.4 k0 \( @( H; \( b
XOR 异或运算. L) ?" T6 a( w
NOT 取反.
8 j2 D8 z, V( t$ s" u TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
! s! z9 E7 @& H, U/ s6 A SHL 逻辑左移.
4 X% y9 v. @; ?0 j9 l Z1 ]& ` SAL 算术左移.(=SHL)( T5 o. b* e4 f% T2 Q* k% ]% }
SHR 逻辑右移.- |# c2 m3 g9 q$ w& u# g5 W z
SAR 算术右移.(=SHR)( ~$ v Y6 \+ l
ROL 循环左移.. S" f2 s% _( \' C8 ]! ?: ~1 a
ROR 循环右移.+ N2 |* v* T* W4 z6 v* d" H* x, v2 X% I
RCL 通过进位的循环左移.( F3 D5 y: D( U- P% x0 {$ Z
RCR 通过进位的循环右移.
; j( I2 C; u6 q- H. b8 ^+ f3 k 以上八种移位指令,其移位次数可达255次. ?) w& [; N* R2 B9 w% [$ A
移位一次时, 可直接用操作码. 如 SHL AX,1.; x* F+ g9 f: v" z0 i9 Z
移位>1次时, 则由寄存器CL给出移位次数.% |& x# d( }( _' N. z1 Q6 K+ b
如 MOV CL,04! y, L6 b0 X/ D7 s$ ]5 g4 t' w
SHL AX,CL
/ Q3 b; K) b! l四、串指令2 j' D ?$ Q- l2 m. ~, P" s8 w& n
7 F! c( ?2 F- g! a/ m2 J DS:SI 源串段寄存器 :源串变址.4 e. |! N/ H0 \. y; Y0 e
ESI 目标串段寄存器:目标串变址.
4 [% T! i% H. k. x CX 重复次数计数器.6 ?. }; P/ F7 k" e9 o& Z# | W4 r
AL/AX 扫描值., W- G7 K+ Q, l
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
# I+ o3 g. o% g0 L6 u. @9 Z! s) r0 Q Z标志 用来控制扫描或比较操作的结束.
b+ r, p& P3 M. f# b MOVS 串传送.& L4 z8 H5 B8 ^8 R& `
( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )- m5 J: R( L* q. G3 M
CMPS 串比较.# M1 |: F' y" q2 Z! ]0 _# L5 q5 B. i
( CMPSB 比较字符. CMPSW 比较字. )
* J& Z1 A, d) p! n* t SCAS 串扫描.
$ f7 A3 R6 c& r3 Z2 a2 N 把AL或AX的内容与目标串作比较,比较结果反映在标志位.* T+ K e' f: }
LODS 装入串.# Q* c) a2 {# _$ l6 c
把源串中的元素(字或字节)逐一装入AL或AX中.' \! H/ {3 q1 D' V* h# D) e
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
$ }7 N9 j5 N# K8 c STOS 保存串.. H( s) ^5 }2 Z2 i( A5 } ^
是LODS的逆过程.+ f1 E7 {# F! {: I+ | S) F; w
REP 当CX/ECX<>0时重复.
, u; N; j6 f2 i. O- }5 w$ ?, @9 t REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.6 R* @( X% q# U. x6 E, H* k4 T! p
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
3 b. H" o* x5 T6 y3 |5 Q5 ~" g REPC 当CF=1且CX/ECX<>0时重复.8 S( ^. a, a2 F5 A. { v2 L$ T
REPNC 当CF=0且CX/ECX<>0时重复. 1 c' R6 F2 e! V' O! R" y. x
五、程序转移指令
* g, j( }6 r9 i/ g. u3 h2 v1 l( `8 S
1>无条件转移指令 (长转移)/ a; @ r1 E3 d/ }
JMP 无条件转移指令. W2 k, @* s! \7 n+ G
CALL 过程调用
! K! S0 }. |$ @ RET/RETF过程返回.
. T5 h# z4 m0 u& W1 N 2>条件转移指令 (短转移,-128到+127的距离内)
% }: ?7 \# Z4 h% _; K( j ( 当且仅当(SF XOR OF)=1时,OP1<OP2 )4 c1 c* h; T' Q t3 ~
JA/JNBE 不小于或不等于时转移.
+ C$ R$ p- C. l0 W JAE/JNB 大于或等于转移., t) b4 h e' h8 x% x
JB/JNAE 小于转移.
. j7 _$ U5 S5 u& H" ~0 f) p* h JBE/JNA 小于或等于转移.
. {1 I# f2 J! N, q1 c 以上四条,测试无符号整数运算的结果(标志C和Z).' g$ ~6 {- {. o& t$ R _7 _
JG/JNLE 大于转移.0 Q* G* a% ?6 o6 r( _- r
JGE/JNL 大于或等于转移.5 W& o% |% V5 F' \& K3 ]
JL/JNGE 小于转移.$ c+ ^9 b5 J7 H! V' V8 P7 B
JLE/JNG 小于或等于转移.+ s: o D; r2 B
以上四条,测试带符号整数运算的结果(标志S,O和Z).' @) R$ w1 V; _) V. I
JE/JZ 等于转移.8 f: W2 P! |0 W
JNE/JNZ 不等于时转移.
8 \; {' a) c) O G" S; P JC 有进位时转移. J5 `8 m4 B3 ~! |4 `' H( A- @* G0 B
JNC 无进位时转移.
% ]2 h8 Z$ B. C. E5 N* G/ G/ U JNO 不溢出时转移.7 \7 T% s6 w9 d! w+ \; i$ o
JNP/JPO 奇偶性为奇数时转移.6 h8 x3 ]# F6 L! ?- F% X
JNS 符号位为 "0" 时转移.. M! e( P: X6 g9 D" ?' W
JO 溢出转移.
4 k' I. q* t. N$ K JP/JPE 奇偶性为偶数时转移.% b% ^3 N2 X, g. G/ T5 U+ c( k" d3 l% `
JS 符号位为 "1" 时转移./ c; G: |6 i; l
3>循环控制指令(短转移): i' {" O! L7 n9 H8 G6 B) n
LOOP CX不为零时循环.
n( m0 f+ }0 t5 z. |' S( a LOOPE/LOOPZ CX不为零且标志Z=1时循环.3 r. w& S! C8 M8 u; Y* ~
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.# c, }; p! a; ^8 E( u8 Q7 L) A
JCXZ CX为零时转移.# m& ^: c! A. W$ l& x& m5 y
JECXZ ECX为零时转移.) D. ^# a0 D0 h$ L( C/ Y
4>中断指令3 b, O8 i' g+ k! K8 W4 l% F& c
INT 中断指令
} `9 b3 T* Q6 o INTO 溢出中断" h, n2 o e ]; D9 ]- ]7 `# i
IRET 中断返回5 `5 r, N% o7 ]- j: D2 N
5>处理器控制指令) d, Z+ ?* I) ~0 Z
HLT 处理器暂停, 直到出现中断或复位信号才继续.
/ A f( [% U- R( K1 M WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.
: K# P- U3 I" o! Y8 ?# Q ESC 转换到外处理器.7 K( X$ C! G3 N- B0 }
LOCK 封锁总线.# T+ k5 k: E5 Q9 ~+ M
NOP 空操作.7 p9 S, h0 {) E3 \
STC 置进位标志位.! a5 S: n% O k7 J
CLC 清进位标志位.
6 R+ B7 i- E2 U/ W8 i CMC 进位标志取反.
; Z& p+ x: r5 D3 f9 i0 h: ] STD 置方向标志位.* L# x8 J9 b0 B" e7 |
CLD 清方向标志位.0 M' e' e# P8 V& a* }) w, R1 H
STI 置中断允许位.9 r" ~! `3 N- a7 R, r
CLI 清中断允许位. $ M& }" x5 c& o3 J( g" O8 y! w
六、伪指令
4 j6 J5 N I% V9 r
: U# @- l) U( O3 P8 G DW 定义字(2字节).
4 d9 Q7 K4 F2 f PROC 定义过程.
) j. q0 i: U0 l) h ENDP 过程结束.1 E: T* k. [# J: p* A0 i8 W: j
SEGMENT 定义段.! g, B$ X$ f* |! |
ASSUME 建立段寄存器寻址.7 ]7 V, E6 ~9 u4 b
ENDS 段结束.
9 ?8 H4 J& p* E: f4 h END 程序结束.
' }" W8 v, d' ^7 F' ]' `$ g 七、处理机控制指令: % e. T7 q/ p$ C# ?9 x
标志处理指令 CLC(进位位置0指令)8 `5 b% }( e1 N7 Q2 R0 \
CMC(进位位求反指令): Y# |& q I4 a. r* p
STC(进位位置为1指令)
7 Q- t; A6 s& ]8 f# x- T G CLD(方向标志置1指令)) ^7 u# Q0 `8 x! V2 y
STD(方向标志位置1指令)
) O+ z) `- }8 a* g' k% m. m6 N5 T9 l CLI(中断标志置0指令)% A+ r4 E' K, S5 n1 k, L3 i
STI(中断标志置1指令)% g. q7 F- |6 }" q/ j$ t: r; O
NOP(无操作)) f. Z: Q2 y" `' [
HLT(停机)
/ s* z- ~! ] a WAIT(等待)
' y* @: ]( {" X0 @ E' H5 u ESC(换码)
+ t" w; N; x7 c' k. g LOCK(封锁)
7 h h5 M ?: z9 U* | |