1
第三章寻址方式与指令系统指令系统,一组指令集操作码 操作数,.,操作数指令:
一地址指令,INC AX
DEC CX
二地址指令,MOV AX,[2000H]
ADD AH,BL
寻址方式,取得操作数地址的方式或 指令中用于说明操作数所在地址的表示方法。
2
一,立即寻址方式格式,n ; n为一常数(立即数)
特点,n 本身是需要寻找的操作对象。
它紧跟指令存于内存代码段中。
例,MOV BX,10
MOV AH,‘A’
MOV AX,3064H
3.1 寻址方式
3
内存,
:
MOV
64H
30H
:
低高代码段
CPU,
AX
AH AL
注,? 立即数只能作双操作数指令的源操作数,不能作目的操作数。
立即数不能作单操作数指令的操作数。
如,MOV 100H,AX ×
INC 50 ×
立即数送入目的操作数中,注意溢出如,MOV AL,- 90H ×
4
二,直接寻址方式
格式:
段寄存器,[EA](其中:段寄存器为 DS,ES,SS之一)
或含有变量的地址表达式。
特点:
操作数的地址偏移量 EA,或变量地址表达式的 EA直接包含在指令中,与操作码一起放在代码段中。
操作数对象一般不作特别说明,存放在当前数据段中,
其物理地址求法为,(DS) 0000 + EA
4
例,MOV AX,DS:[2000H ] ;((DS)+2000H) AX
设执行前 (DS) = 3000H 4
(32000H)=2415H
则执行后 (32000H)字 AX 即 (AX)=2415H
若 MOV AL,DS,[2000H]
则 (32000H)字节 AL 即 (AL)=15H
5
:
MOV 0000
00H 4
20H +
:
:
15H 32000H
24H 32001H
:
代码段数据段
3000H
内存这说明:
段寄存器,[EA]这种直接寻址方式没有类型;
含有变量地址表达式的形式有类型,其类型由变量类型决定。
例,MOV AX,ES:[2000H] ; ((ES)+2000H) AX
段跨越符 4
MOV SS,[1000H],BX ; (BX) (SS)+1000H
4
MOV BUF,AX MOV [BUF],AX
DS
6
寄存器寻址方式 * — 操作数在指定的寄存器中
MOV AX,BX
MOV AL,BH
* 字节寄存器只有 AH AL BH BL CH CL DH DL
* SRC 和 DST的字长一致? MOV AH,BX
* CS不能用 MOV指令改变? MOV CS,AX
三,寄存器寻址方式
7
格式,[R];其中 R为 BX,BP,SI,DI之一,不允许是其它寄存器。
特点:操作对象在内存中,操作对象的 EA在 BX,BP,SI,DI之一中。(不在内存)
即,EA= (BX)
(BP)
(SI)
(DI)
注,(1)若选择 [BX],[SI],[DI]之一,且缺省段跨越符,则对象在当前的数据段中;
四、寄存器间接寻址方式
8
例,MOV AX,[BX] ;((DS)+(BX)) AX
4
若执行前 (DS)=2000H,(BX)=1000H
:
MOV AX,[BX] DS BX
,
,4
0A0H 21000H +
50H 21001H
:
数据段
2000H 1000H
50H 0A0H内存
AX
( 2)若缺省段跨越符,且 BP作间址寄存器,则对象存放在当前堆栈段中。
如,MOV BX,[BP] ;((SS)+(BP)) BX
4
9
( 3)若指定段跨越符,则不管 BP,BX,SI,DI之一作变址器,都取相应段中数据。
如,MOV ES:[BP],AX ;(AX) (ES)+(BP)
MOV AX,ES:[BX] ;((ES)+(BX)) AX
4
注,? 间址器一定要是 BP,BX,SI,DI之一如,MOV CX,[AX] ×
间接寻址方式表示对象的地址,并不能表示对象的类型。
10
格式,X[R] ;其中 R为 BX,BP,SI,DI之一。
X为一整常数或变量地址表达式。
特点,? 操作对象在内存中
EA为 R的内容和 X之和(即,X在代码段中,EA另一部分在 R中)。
EA= X+(SI)
X+(DI)
X+(BX)
X+(BP)
缺省段跨越符的物理地址
(DS)+ (SI)+X
4 (DI)+X
(BX)+X
(SS)+(BP)+X
4
五,相对寻址方式
11
例,MOV CX,-6[BX] ;((DS)+(BX)-6) CX
设执行前,(BX)=16H,(DS)=2000H,(20010H)=3789H
执行:
执行后 (CX)=3789H,
其他寄存器内容不变。
,DS BX
MOV CX
OFFH
OFAH +
:
89H 20010H
37H 20011H
:
代码段数据段
2000H 16H
- 6
例,MOV [BX+7],BX
MOV DL,4[AX] ×
MOV BX,ES:ABC[SI] ;其中 ABC为变量名,它表示变量到所在段段首址的 EA
12
格式,[BR+IR]
其中,BR为基址寄存器,仅为 BX和 BP之一;
IR为变址寄存器,仅为 SI和 DI之一。
特点,? 操作对象在内存中。
操作数的 EA= (BX)+(SI)或 (DI)
(BP)+(SI)或 (DI)
缺省段跨越符,其物理地址,(DS)+(BX)+(SI)或 DI
4
(SS)+(BP)+(SI)或 DI
4
例,MOV AX,[BX+BP] ×
MOV [SI+DI],CX ×
MOV [BX+CX],AX ×
六,基址变址寻址方式
13
例,MOV AX,[BX+DI] MOV AX,[BX][DI]
设执行前 (DS)=2100H
(BX)=158H
(DI)=10A5H
(221FDH)=1234H
EA=158H+10A5H=11FDH
∴ 物理地址,(DS)+EA=21000H+11FDH=221FDH
4,DS BX DI
指令码
,4
,+
34H 221FDH
12H 221FEH
:
2100H 158H 10A5H
数据段执行后,(AX)=1234H
当 MOV AL,[BX+DI];(221FDH)字节 =34H AL 即 (AL)=34H
14
格式,X[BR+IR]
其中,BR为基址器,仅为 BX,BP之一;
IR为变址器,仅为 SI,DI之;
X为一整常数或已定义的变量名。
特点,
对象在内存中;
操作数的 EA= (BX)+(SI)或 (DI)+X
(X为变量名,则该变量名到所在段的段首的字节个数 )
(BP)+(SI)或 (DI)+X
七,相对基址变址寻址方式
15
例,MOV AX,8[BX+SI]
执行前,(AX)=45H,(BX)=30H,(SI)=20H,(DS)=1000H
(10058H)=99H
:
指令码
8
:
:
99H
0
:
代码段数据段
DS BX SI
+
10058H
10059H
执行后,(10058H) AX
(AX)=99H
1000H 30H 20H
例,MOV DX,M[BX+DI] ;设 M已定义在数据段中
MOV SS:[BX+SI+7],CX ;物理地址= (SS)+(BX)+(SI)+7
4
16
习题:
1.分别指出下列指令中源操作数和目的操作数的寻址方式
① MOV SI,’C’ ④ ADD CX,DS:[10H]
② MOV [BX+3],AX ⑤ MOV DL,[BP+DI]
③ SUB [BX][SI],AL ⑥ MOV [BX],AX
2.指出下列各寻址中的错误,并说明原因
① MOV 100H,AX ④ MOV [BX+BP],[SI]
② MOV [CX],AH ⑤ ADD AX,[DI+SI]
③ ADD AX,BL ⑥ MOV AH,1000
⑦ POP CL
3.已 (DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=0ADH,(BX)=100H,
(BP)=10H,试指出下列源操作数的寻址方式是什么?其物理地址值是什?
( 1) MOV AX,DS:[100H]
( 2) MOV BX,[SI]
( 3) MOV CX,[BX+10H]
( 4) MOV AX,[BX][SI]
( 5) MOV CL,[BP+4]
( 6) MOV CH,ES:[BP+SI]
17
数据传送指令
算术运算指令
逻辑运算指令
串操作指令
程序转移指令
处理机控制指令注意,1,指令的基本功能
2,指令的执行对标志位的影响
3,对寻址方式或寄存器使用的限制和隐含使用的情况
3.2 指令系统
18
功能:负责把数据,地址或立即数送到寄存器或内存单元中。
1.传送指令,MOV
格式,MOV DEST,SC
功能,(SRC) DEST
立即数传送到通用寄存器或存储单元
MOV CL,25H ;字节传送
MOV AX,4321H ;字传送
MOV DA_BYTE,34H ;字节传送
MOV DA_WORD,4321H ;字传送注意:立即数只能出现在源操作数位置,不能作为目的操作数一,数据传送指令
19
寄存器之间的传送
MOV BL,DL ;字节传送
MOV DX,CX ;字传送
MOV ES,AX ;通用寄存器与段寄存器之间传送注意:段寄存器 CS仅只能作源操作数,不能作目的操作数 。
20
寄存器与存储单元之间的传送
MOV DL,DA_BYTE ;字节传送
MOV AX,DA_WORD ;字传送
MOV DA_BYTE,CL ;字节传送
MOV DA_WORD,DX ;字传送注意:两个存储单元之间不能用一条 MOV指令直接完成数据传送 。
立即数不能直接传送给段寄存器,且段寄存器之间亦不能进行直接传送 。
21
立即数存储器通用寄存器 AX BX
CX DXBP
SP SI DICS
段寄存器
DS ES SS
图 3.7 MOV指令的数据传送方向
22
格式,XCHG DEST,SRC
功能,(SRC)?(DEST)
例,XCHG AL,AH ;(AL)?(AH)
注,SRC或 DEST均不能为立即数二,交换指令
23
标志送 AH指令,LAHF
执行操作,(AH)? (PSW的低字节 )
AH送标志寄存器指令,SAHF
执行操作,(PSW的低字节 )? (AH)
标志进栈指令,PUSHF
执行操作,(SP)? (SP) - 2
( (SP)+1,(SP) )? (PSW)
标志出栈 指令,POPF
执行操作,(PSW)? (SP)+1,(SP))
(SP)? (SP) + 2
* 影响标志位三,标志寄存器传送指令
24
有效地址送寄存器指令,LEA REG,SRC
执行操作,(REG)? SRC
指针送寄存器和 DS指令,LDS REG,SRC
执行操作,(REG)? (SRC)
(DS)? (SRC+2)
4个相继字节?寄存器 ( 通常是 SI),DS
指针送寄存器和 ES指令,LES REG,SRC
执行操作,(REG)? (SRC)
(ES)? (SRC+2)
4个相继字节?寄存器(通常是 DI),ES
四,地址传送指令
25
例,LEA BX,[BX+SI+0F62H]
例,LDS SI,[10H]
例,LES DI,[BX]
例:
(DS):1000H 40 H
00 H
00 H
30 H
TABLE
MOV BX,TABLE ; (BX)=0040H
MOV BX,OFFSET TABLE ; (BX)=1000H
LEA BX,TABLE ; (BX)=1000H
LDS BX,TABLE ; (BX)=0040H; (DS)=3000H
LES BX,TABLE ; (BX)=0040H; (ES)=3000H注意,
* 不影响标志位
* REG不能是 段寄存器
* SRC必须为存储器寻址方式
26
换码指令,XLAT 或 XLAT OPR
执行操作,(AL)? ( (BX) + (AL) )
例,MOV BX,OFFSET TABLE ; (BX)=0040H
MOV AL,3
XLAT TABLE
指令执行后 (AL)=33H
注意,
* 不影响标志位
* 字节表格 (长度不超过 256)
首地址? (BX)
* 需转换代码? (AL)
(BX)? 30 H F0040
31 H F0041
(AL) = 3 32 H F0042
33 H F0043
TABLE
(DS)=F000H
五,换码指令
27
加法指令
减法指令
乘法指令
除法指令
十进制调整指令
3.2.2 算术指令
28
加法指令加法指令,ADD DST,SRC
执行操作,(DST)? (SRC) + (DST)
带进位加法指令,ADC DST,SRC
执行操作,(DST)? (SRC) + (DST) + CF
加 1指令,INC OPR
执行操作,(OPR)? (OPR) + 1
注意,
* 除 INC指令 不影响 CF标志外,均对条件标志位有影响。
29
加法指令对条件标志位 ( CF/OF/ZF/SF) 的影响:
CF位表示无符号数相加的溢出。
OF位表示带符号数相加的溢出。
1 结果为负
0 否则SF=
1 结果为 0
0 否则ZF=
1 和的最高有效位有向高位的进位
0 否则CF=
1 两个操作数符号相同,而结果符号与之相反
0 否则OF=
30
无符号数溢出
0 0 0 0 0 1 1 1
+ 1 1 1 1 1 0 1 1
0 0 0 0 0 0 1 0
带,(+7)+(-5)=+2 OF=0
无,7+251=2 CF=1
带符号数和无符号数都不溢出
0 0 0 0 0 1 0 0
+ 0 0 0 0 1 0 1 1
0 0 0 0 1 1 1 1
带,(+4)+(+11)=+15 OF=0
无,4+11=15 CF=0
带符号数溢出
0 0 0 0 1 0 0 1
+ 0 1 1 1 1 1 0 0
1 0 0 0 0 1 0 1
带,(+9)+(+124)=-123 OF=1
无,9+124=133 CF=0
带符号数和无符号数都溢出
1 0 0 0 0 1 1 1
+ 1 1 1 1 0 1 0 1
0 1 1 1 1 1 0 0
带,(-121)+(-11)=+124 OF=1
无,135+245=124 CF=1
n=8bit 带符号数 (-128~127) 无符号数 (0~255)
31
例:双精度数的加法
( DX) = 0002H ( AX) = 0F365H
( BX) = 0005H ( CX) = 0E024H
指令序列 (1) ADD AX,CX
(2) ADC DX,BX
(1) 执行后,( AX) = 0D389H CF=1 OF=0
SF=1 ZF=0
(2) 执行后,( DX) = 0008H CF=0 OF=0
SF=0 ZF=0
32
减法指令减法指令,SUB DST,SRC
执行操作,(DST)? (DST) - (SRC)
带借位减法指令,SBB DST,SRC
执行操作,(DST)? (DST) - (SRC) - CF
减 1指令,DEC OPR
执行操作,(OPR)? (OPR) - 1
求补指令,NEG OPR
执行操作,(OPR)? - (OPR)
比较指令,CMP OPR1,OPR2
执行操作,(OPR1) - (OPR2)
注意,
* 除 DEC指令 不影响
CF标志外,均对条件标志位有影响。
33
减法指令对条件标志位 ( CF/OF/ZF/SF) 的影响:
CF位表示无符号数减法的溢出。
OF位表示带符号数减法的溢出。
NEG指令对 CF/OF的影响:
CF位:操作数为 0时,求补的结果使 CF=0,否则 CF=1。
OF位:字节运算对 -128求补或字运算对 -32768求补时 OF=1,
否则 OF=0。
1 被减数的最高有效位有向高位的借位
0 否则CF=
1 两个操作数符号相反,而结果的符号与减数相同
0 否则OF=
1 减法转换为加法运算时无进位
0 否则CF=

34
例,x,y,z均为双精度数,分别存放在地址为 X,X+2;
Y,Y+2; Z,Z+2的存储单元中,用指令序列实现
w? x+y+24-z,并用 W,W+2单元存放 w。
MOV AX,X
MOV DX,X+2
ADD AX,Y
ADC DX,Y+2 ; x+y
ADD AX,24
ADC DX,0 ; x+y+24
SUB AX,Z
SBB DX,Z+2 ; x+y+24-z
MOV W,AX
MOV W+2,DX ; 结果存入 W,W+2单元
35
乘法指令无符号数乘法指令,MUL SRC
执行操作:字节操作数 (AX)? (AL) * (SRC)
字操作数 (DX,AX)? (AX) * (SRC)
带符号数乘法指令,IMUL SRC
注意,
* AL(AX)为隐含的乘数寄存器。
* AX(DX,AX)为隐含的乘积寄存器。
* SRC不能为立即数。
* 除 CF和 OF外,对条件标志位 无定义 。
36
乘法指令对 CF/OF的影响:
00 乘积的高一半为零
11 否则MUL指令,CF/OF =
例,(AX) = 16A5H,(BX) = 0611H
(1) IMUL BL ; (AX)? (AL) * (BL); A5*11? 5B*11=060B? F9F5; (AX) = 0F9F5H CF=OF=1
(2) MUL BX ; (DX,AX)? (AX) * (BX); 16A5*0611=0089 5EF5; (DX) = 0089H (AX) = 5EF5H CF=OF=1
00 乘积的高一半是低一半的符号扩展
11 否则IMUL指令,CF/OF =
37
除法指令无符号数除法指令,DIV SRC
执行操作,字节操作 (AL)? (AX) / (SRC) 的商
(AH)? (AX) / (SRC) 的余数字操作 (AX)? (DX,AX) / (SRC) 的商
(DX)? (DX,AX) / (SRC) 的余数带符号数除法指令,IDIV SRC
注意,
* AX(DX,AX)为隐含的被除数寄存器。
* AL(AX)为隐含的商寄存器。
* AH(DX)为隐含的余数寄存器。
* SRC不能为立即数。
* 对所有条件标志位均 无定义 。
38
符号扩展指令:
CBW AL? AX
执行操作,若 (AL)的最高有效位为 0,则 (AH)= 00H
若 (AL)的最高有效位为 1,则 (AH)= 0FFH
CWD AX? (DX,AX)
执行操作:若 (AX)的最高有效位为 0,则 (DX)= 0000H
若 (AX)的最高有效位为 1,则 (DX)= 0FFFFH
注意,* 无操作数指令
* 隐含对 AL或 AX进行符号扩展
* 不影响 条件标志位例,(AX)=0BA45H
CBW ; (AX)=0045H
CWD ; (DX)=0FFFFH (AX)=0BA45H
39
例,x,y,z,v均为 16位带符号数,计算 (v-(x*y+z-540))/x
MOV AX,X
IMUL Y ; x*y
MOV CX,AX
MOV BX,DX
MOV AX,Z
CWD
ADD CX,AX
ADC BX,DX ; x*y+z
SUB CX,540
SBB BX,0 ; x*y+z-540
MOV AX,V
CWD
SUB AX,CX
SBB DX,BX ; v-(x*y+z-540)
IDIV X ; (v-(x*y+z-540))/x
40
十进制调整指令
BCD码,用二进制编码的十进制数,又称 二 --十进制数压缩的 BCD码:用 4位二进制数表示 1位十进制数例,(59)10 = (0101 1001)BCD
非压缩的 BCD码:用 8位二进制数表示 1位十进制数例,(59)10 = (0000 0101 0000 1001)BCD
数字的 ASCII码是一种非压缩的 BCD码
DIGIT ASCII BCD
0 30H 0011 0000
1 31H 0011 0001
2 32H 0011 0010
… … …
9 39H 0011 1001
41
例:写出 (3590)10的压缩 BCD码和非压缩 BCD码,并分别把它们存入数据区 PAKED和 UNPAK。
压缩 BCD,(3590)10= (0011 0101 1001 0000)BCD
非压缩 BCD:
(3590)10= (00000011 00000101 00001001 00000000)BCD
PAKED 90H
35H
UNPAK 00H
09H
05H
03H
42
压缩的 BCD码 调整指令加法的十进制调整指令,DAA
执行操作,(AL)? (AL)压缩 BCD
减法的十进制调整指令,DAS
执行操作,(AL)? (AL)压缩 BCD
19 压缩 BCD,0001 1001
+ 08 + 0000 1000
27 0010 0001 + 110
(0010 0111)BCD AF=1
问题的提出:
注意,
* 隐含的操作寄存器为 AL
* 紧接在加减指令之后使用
* 影响 条件标志位
(对 OF无定义 )
43
调整方法:
AF= 1或 (AL)0~3= A~F,则 (AL)? (AL)? 06H,AF= 1
CF= 1或 (AL)4~7= A~F,则 (AL)? (AL)? 60H,CF= 1
( DAA做‘ +’,DAS做‘ -’ )
例,DATA SEGMENT
BCD1 DB 34H,18H ; (1834)BCD
BCD2 DB 89H,27H ; (2789)BCD
BCD3 DB 2 DUP (?)
DATA ENDS
(1) BCD3? BCD1 + BCD2 ; (4623)BCD
(2) BCD3? BCD1 - BCD2 ; (9045)BCD = -955
44
(1) MOV AL,BCD1 ; (AL)=34H
ADD AL,BCD2 ; (AL)=34+89=BDH
DAA ; (AL)=BD+60+06=23H AF=CF=1
MOV BCD3,AL ; (BCD3)=23H
MOV AL,BCD1+1 ; (AL)=18H
ADC AL,BCD2+1 ; (AL)=18+27+1=40H AF=1 CF=0
DAA ; (AL)=40+06=46H
MOV BCD3+1,AL ; (BCD3+1)=46H
(2) MOV AL,BCD1 ; (AL)=34H
SUB AL,BCD2 ; (AL)=34-89=ABH
DAS ; (AL)=AB-60-06=45H AF=CF=1
MOV BCD3,AL ; (BCD3)=45H
MOV AL,BCD1+1 ; (AL)=18H
SBB AL,BCD2+1 ; (AL)=18-27-1=F0H
DAS ; (AL)=F0-60=90H
MOV BCD3+1,AL ; (BCD3+1)=90H
45
非压缩的 BCD调整指令加法调整指令,AAA (AL)? (AL)非压缩 BCD
减法调整指令,AAS (AL)? (AL)非压缩 BCD
注意,* 隐含的操作寄存器为 AL
* 紧接在加减指令之后使用
* 除 AF,CF外,对其它条 件标志位 无定义调整方法:
若 (AL)0~3=0~9,且 AF=0,则 (AL)4~7 = 0,AF? CF= 0
若 (AL)0~3=A~F,或 AF=1,则 (AL)? (AL)± 6,(AL)4~7= 0
(AH)? (AH)± 1,AF? CF= 1
( AAA做‘ +’,AAS做‘ -’ )
46
乘法调整指令,AAM (AL)? (AX)非压缩 BCD
注意,* 隐含的操作寄存器为 AL
* 紧接在 MUL指令之后使用
* 对 OF,CF,AF无定义调整方法:
(AL)除以 0AH,商?(AH),余数?(AL)
除法调整指令,AAD
被除数 (AX) = (0000 xxxx 0000 xxxx)非压缩 BCD
除数 = (0000 xxxx)非压缩 BCD
在 DIV指令之前:
(AL)2? 0AH × (AH)+(AL)
(AH)2? 0
47
例,(AX)= 0504H (BL)= 03H
(1) (AL)*(BL)
MUL BL ; (AX)=000CH
AAM ; (AH)=01H (AL)=02H
(2) (AX)/(BL)
AAD ; (AH)=00H (AL)=36H
DIV BL ; (AH)=00H (AL)=12H
AAM ; (AH)=01H (AL)=08H
48
逻辑运算 指令
移位 指令
49
逻辑非指令,NOT OPR * OPR不能为立即数执行操作,(OPR) (OPR) * 不影响标志位逻辑与指令,AND DST,SRC
执行操作,(DST)? (DST)? (SRC)
逻辑或指令,OR DST,SRC
执行操作,(DST)? (DST)? (SRC)
异或指令,XOR DST,SRC
执行操作,(DST)? (DST)? (SRC)
测试指令,TEST OPR1,OPR2
执行操作,(OPR1)? (OPR2)
CF OF SF ZF PF AF
0 0 * * * 无定义根据运算结果设置
50
例:屏蔽 AL的 0,1两位
AND AL,0FCH
例:置 AL的第 5位为 1
OR AL,20H
例:使 AL的 0,1位变反
XOR AL,3
例:测试某些位是 0是 1
TEST AL,1
JZ EVEN
* * * * * * * *
AND 1 1 1 1 1 1 0 0
* * * * * * 0 0
* * * * * * * *
OR 0 0 1 0 0 0 0 0
* * 1 * * * * *
* * * * * * * *
XOR 0 0 0 0 0 0 1 1
* * * * * * * *
51
移位指令:
逻辑左移 SHL OPR,CNT
逻辑右移 SHR OPR,CNT
算术左移 SAL OPR,CNT( 同逻辑左移 )
算术右移 SAR OPR,CNT
CF 0
0 CF
CF
52
循环移位指令:
循环左移 ROL OPR,CNT
循环右移 ROR OPR,CNT
带进位循环左移 RCL OPR,CNT
带进位循环右移 RCR OPR,CNT
CF
CF
CF
CF
53
注意,
* OPR可用立即数以外的任何寻址方式
* CNT=1,SHL OPR,1
CNT>1,MOV CL,CNT
SHL OPR,CL ; 以 SHL为例
* 条件标志位:
CF = 移入的数值
1 CNT=1时,最高有效位的值发生变化
0 CNT=1时,最高有效位的值不变移位指令:
SF,ZF,PF 根据移位结果设置
AF无定义循环移位指令:
不影响 SF,ZF,PF,AF
OF =
54
例,(AX)= 0012H,(BX)= 0034H,把它们装配成 (AX)= 1234H
MOV CL,8
ROL AX,CL
ADD AX,BX
例,(BX)=84F0H
(1) (BX)为无符号数,求 (BX)/2
SHR BX,1 ; (BX) = 4278H
(2) (BX)为带符号数,求 (BX)/2
SAR BX,1 ; (BX) = 0C278H
(3) 把 (BX)中的 16位数每 4位压入堆栈
0008
0004
000F
0000? (SP)
MOV CH,4 ; 循环次数
MOV CL,4 ; 移位 次数
NEXT,ROL BX,CL
MOV AX,BX
AND AX,0FH
PUSH AX
DEC CH
JNZ NEXT
55
串传送指令
存入串指令
从串取指令
串比较指令
串扫描指令配合使用的前缀有:
REP 重复
REPE/REPZ 相等 /为零则重复
REPNE/REPNZ 不相等 /不为零则重复
56
与 REP配合工作的 MOVS / STOS / LODS
REP MOVS / STOS / LODS
执行操作,(1) 如 (CX)= 0则退出 REP,否则转 (2)
(2) (CX)? (CX) -1
(3) 执行 MOVS / STOS / LODS
(4) 重复 (1) ~ (3)
57
MOVS 串传送指令
MOVS DST,SRC
MOVSB ( 字节 )
MOVSW( 字 )
例,MOVS ES,BYTE PTR [DI],DS,[SI]
执行操作,(1) ((DI)) ← ((SI))
(2) 字节操作,(SI)← (SI)± 1,(DI)← (DI)± 1
字操作,(SI)← (SI)± 2,(DI)← (DI)± 2
方向标志 DF=0时用 +,DF=1时用 - 。
REP MOVS:将数据段中的整串数据传送到附加段中 。
源串 ( 数据段 ) → 目的串 ( 附加段 )
执行 REP MOVS之前,应先做好:
( 1)源串首地址(末地址) → SI
( 2)目的串首地址(末地址) → DI
( 3)串长度 → CX
( 4)建立方向标志 ( CLD使 DF=0,STD使 DF=1)
58
( SI)?
低地址高地址数据段 附加段
( SI)( DI)
( DI)DF=0 DF=1
59
例 3.58
datarea segment
mess1 db ‘personal_computer’
datarea ends
extra segment
mess2 db 17 dup (?)
extra ends
code segment

lea si,mess1
lea di,mess2
mov cx,17
cld
rep movsb

code ends
lea si,mess1+16
lea di,mess2+16
mov cx,17
std
rep movsb
60
STOS存入串指令
STOS DST
STOSB ( 字节 )
STOSW ( 字 )
执行操作,字节操作,((DI))← (AL),(DI)← (DI)± 1
字操作,((DI))← (AX),(DI)← (DI)± 2
例:把附加段中的 5个字节缓冲区置为 20H
lea di,mess2
mov al,20H
mov cx,5
cld
rep stosb
61
LODS从串取指令
LODS SRC
LODSB ( 字节 )
LODSW ( 字 )
执行操作,字节操作,(AL)← ((SI)),(SI)← (SI)± 1
字操作,(AX)← ((SI)),(SI)← (SI)± 2
注意,* LODS指令一般不与 REP联用
* 源串必须在数据段中,目的串必须在附加段中,
但源串允许使用段跨越前缀来修改。
* 不影响条件标志位
62
与 REPE/REPZ和 REPNE/REPNZ配合工作的 CMPS
和 SCAS
REPE/REPZ (REPNE/REPNZ) CMPS / SCAS
执行操作,(1) 如 (CX)=0或 ZF=0 (ZF=1)则退出,
否则转 (2)
(2) (CX)← (CX)-1
(3) 执行 CMPS / SCAS
(4) 重复 (1) ~ (3)
63
CMPS串比较指令
CMPS SRC,DST
CMPSB ( 字节 )
CMPSW( 字 )
执行操作:
(1) ((SI)) - ((DI))
根据比较结果设置条件标志位:相等 ZF=1
不等 ZF=0
(2) 字节操作,(SI)← (SI)± 1,(DI)← (DI)± 1
字操作,(SI)← (SI)± 2,(DI)← (DI)± 2
64
SCAS串扫描指令
SCAS DST
SCASB (字节)
SCASW (字)
执行操作:
字节操作,(AL) - ((DI)),(DI)← (DI)± 1
字操作,(AX) - ((DI)),(DI)← (DI)± 2
65
例 3.60 从一个字符串中查找一个指定的字符
mess db ‘COMPUTER’
lea di,mess
mov al,‘T’
mov cx,8
cld
repne scasb
(DI),相匹配字符的下一个地址
(CX):剩下还未比较的字符个数
C
O
M
P
U
T
E
R
(di)? C
O
M
P
U
T
E
R
(di)?
66
例 3.61 比较两个字符串,找出它们不相匹配的位置
lea si,mess1
lea di,mess2
mov cx,8
cld
repe cmpsb
例:反向传送
C
O
M
P
U
T
E
R
C
O
M
P
U
T
E
R
67
无条件转移指令
条件转移指令
循环指令
3.2.5 控制转移指令
68
无条件转移指令 JMP
段内 直接短转移,JMP SHORT OPR
执行操作,(IP)← (IP)+8位位移量( -128~127)
例:

...
JMP SHORT HELLO


HELLO,MOV AL,3
69
段内 直接近转移,JMP NEAR PTR OPR
执行操作,(IP)← (IP)+16位位移量段内 间接转移,JMP WORD PTR OPR
执行操作,(IP)← (EA)
段间 直接 (远 )转移,JMP FAR PTR OPR
执行操作,(IP)← OPR的段内偏移地址
(CS)← OPR所在段的段地址段间 间接转移,JMP DWORD PTR OPR
执行操作,(IP)← (EA)
(CS)← (EA+2)
70
条件转移指令注意,只能使用段内直接寻址的 8位位移量 ( -128~127)
根据单个条件标志的设置情况转移:
格式 测试条件
JZ(JE) OPR ZF=1
JNZ(JNE) OPR ZF=0
JS OPR SF=1
JNS OPR SF=0
JO OPR OF=1
JNO OPR OF=0
JP OPR PF=1
JNP OPR PF=0
JC OPR CF=1
(JB,JNAE)
JNC OPR CF=0
(JNB,JAE)
71
比较两个无符号数,并根据比较结果转移,*
格式 测试条件
< JB(JNAE,JC) OPR CF=1
≥ JNB(JAE,JNC) OPR CF=0
≤ JBE(JNA) OPR CF∨ ZF=1
> JNBE(JA) OPR CF∨ ZF=0
* 适用于地址或双精度数低位字的比较
72
比较两个带符号数,并根据比较结果转移,*
格式 测试条件
< JL(JNGE) OPR SF?OF=1
≥ JNL(JGE) OPR SF?OF=0
≤ JLE(JNG) OPR (SF?OF)∨ ZF=1
> JNLE(JG) OPR (SF?OF)∨ ZF=0
* 适用于带符号数的比较测试 CX的值为 0则转移:
格式 测试条件
JCXZ OPR (CX)=0返回
73
例 3.64 X>50,转到 TOO_HIGH;
计算 X-Y,溢出转到 OVERFLOW,否则
|X-Y|→ RESULT
MOV AX,X
CMP AX,50
JG TOO_HIGH
SUB AX,Y
JO OVERFLOW
JNS NONNEG
NEG AX
NONNEG,MOV RESULT,AX
TOO_HIGH,…

OVERFLOW,…

74
例 3.65?,?是双精度数,分别存于 DX,AX及 BX,CX中,
>?时转 X,否则转 Y。
CMP DX,BX
JG X
JL Y
CMP AX,CX
JA X
Y,…
...
X,…
...
75
循环指令
1,LOOP 指令指令格式,LOOP 目标执行 LOOP指令,在进行循环次数的计数 (即 CX <=
(CX)-1后,若( CX) ≠0,则转移到目标单元,否则顺序执行。
2,LOOPE/ LOOPZ指令指令格式,LOOPE 目标或者 LOOPZ 目标执行 LOOPE/ LOOPZ 指令,在进行循环次数的计数
(即 CX<= (CX)- 1后,若( CX) ≠0
且 ZF= 1,则转移到目标单元,否则顺序执行。
76
3,LOOPNE/ LOOPNZ指令指令格式,LOOPNE 目标或者 LOOPNZ 目标执行 LOOPNE/ LOOPNZ指令,在进行循环次数的计数 (即 CX<= (CX)-1后,如 (CX)≠0且 ZF= 0,则转移到目标单元,否则顺序执行。
4,JCXZ指令指令格式,JCXZ 目标
JCXZ指令仅仅是测试现有寄存器 CX 的内容。如果
(CX)=0,则转移到目标单元,否则顺序执行。
77
标志处理指令:
CLC CF← 0
CMC CF←?CF
STC CF← 1
CLD DF← 0
STD DF← 1
CLI IF← 0
STI IF← 1
注意,* 只影响本指令指定的标志
3.2.6 处理机控制指令
78
其他处理机控制指令:
NOP 无操作 (机器码占一个字节 )
HLT 暂停机 (等待一次外中断,之后继续执行程序 )
WAIT 等待 (等待外中断,之后仍继续等待 )
ESC mem 换码 ( (mem)? 数据总线 )
LOCK 封锁 (维持总线的锁存信号,直到其后的指令执行完 )
注意,
* 不影响条件标志