1
3.3.3 逻辑运算和移位指令
1.逻辑运算指令
● 运算规则:按位操作,无进 /借位
● 对标志位的影响 (除 NOT指令外 ):
CF OF SF ZF PF AF
0 0 * * * 无定义
根据运算结果设置
2
(1) 逻辑”与” AND
对两个操作数进行按位逻辑“与”操作。
格式,AND dest,src
用途:保留操作数的某几位,清零其他位。
例 1:保留 AL中低 4位,高 4位清 0。
AND AL,0FH
例 2,AL中有字符 ’a’~’ z’,将其转换成大写。
AND AL,01011111B
3
例 3:测试 AL的 bit7,bit5,bit2是否都是 1。
AND AL,10100100B
CMP AL,10100100B
JZ YES ; if match,go to YES
… … ; if not match
… …
YES,… … ; goes here if all ‘1’
4
对两个操作数进行按位逻辑, 或, 操作。
格式,OR dest,src
用途:对操作数的某几位置 1;对两操作数
进行组合。
例 1:把 AL中的非压缩 BCD码变成相应十进制
数的 ASCII码。
OR AL,30H
(2) 逻辑”或”
OR
5
例 2,把 AH和 AL中的非压缩 BCD码组合成压
缩的 BCD码,放到 AL中。
MOV CL,4
SHL AH,CL
OR AL,AH
例 3:把 AL的第 5位置为 1
OR AL,00100000B
6
对操作数进行按位逻辑, 非, 操作。
格式, NOT mem/reg
例,NOT CX
NOT BYTE PTR[DI]
(3) 逻辑“非” (取反 ) NOT
7
对两个操作数按位进行, 异或, 操作。
格式,XOR dest,src
用途:对 reg清零 (自身异或 )
把 reg/mem的某几位变反 (与 ’1’异或 )
例 1:把 AX寄存器清零。 例 2:把 DH的 bit4,3变反
① MOV AX,0 XOR DH,18H
② XOR AX,AX
③ AND AX,0
④ SUB AX,AX
(4) 逻辑”异或” XOR
8
操作与 AND指令类似,但不将, 与, 的结果送回,
只影响标志位。
TEST指令常用于位测试,与条件转移指令一起
用。
例:测试 AL的内容是否为负数。
TEST AL,80H ; 检查 AL中 D7=1?
JNZ MINUS ; 是 1(负数 ),转 MINUS
… … ; 否则 (正数 )不转移
MINUS,… …
… …
(5) 测试指令 TEST
9
2.移位指令
(1)非循环移位指令
算术左移指令 SAL(Shift Arithmetic Left)
算术右移指令 SAR(Shift Arithmetic Right)
逻辑左移指令 SHL(Shift Left)
逻辑右移指令 SHR(Shift Right)
这 4条指令的格式相同,以 SAL为例:
SAL mem/reg,CL ;移位位数大于 1时1 ;移位位数等于 1时
10
移位指令执行的操作如下图所示:
最低位最高位
CF 0
(a)算术 /逻辑左移 SAL/SHL
最低位最高位
CF
(b)算术右移 SAR
最低位最高位
CF
(c)逻辑右移 SHR
0
非循环移位指令功能示意图
11
?算术移位 —— 把操作数看做有符号数;
逻辑移位 —— 把操作数看做无符号数。
?移位位数放在 CL寄存器中,如果只移 1位,也
可以直接写在指令中。例如:
MOV CL,4
SHR AL,CL ; AL中的内容右移 4位
?影响 C,P,S,Z,O标志 。
?结果未溢出时:
左移 1位 ≡ 操作数 *2
右移 1位 ≡ 操作数 /2
12
例:把 AL中的数 x乘 10
因为 10=8+2=23+21,所以可用移位实现乘 10
操作。程序如下:
SAL AL,1 ; 2x
MOV AH,AL
SAL AL,1 ; 4x
SAL AL,1 ; 8x
ADD AL,AH ; 8x+2x = 10x
13
不含进位位的循环左移指令 ROL
不含进位位的循环右移指令 ROR
含进位位的循环左移指令 RCL
含进位位的循环右移指令 RCR
?格式同非循环移位指令 。
?移位位数放在 CL寄存器中,如果只移 1位,
也可以直接写在指令中。
?循环移位指令只影响标志位 CF和 OF。
(2)循环移位指令
14
这 4条指令的功能如下图示:
最低位最高位
CF
(a) ROL
最低位最高位
CF
(c) RCL
最低位最高位
CF
(b) ROR
最低位最高位
CF
(d) RCR
循环移位指令功能示意图
15
?用移位操作代替乘除法可提高运算速度
例:前例中计算 x× 10。
(1)采用乘法指令,
MOV BL,10
MUL BL
共需 70~ 77个 T周期。
(2)采用移位和加法指令,
SAL AL,1 ; 2T
MOV AH,AL ; 2T
SAL AL,1 ; 2T
SAL AL,1 ; 2T
ADD AL,AH ; 3T
只需 11个 T周期,仅相当于乘法的 1/7。
16
循环移位举例:
例 1:将 AL的高 4位与低 4位互换。
MOV CL,4
ROL AL,CL
例 2:将 1A00H内存单元中的双字循环左移 1位。
CMP [1A00H],8000H
CMC
RCL WORD PTR[1A02H],1
RCL WORD PTR[1A00H],1
17
例:设在 1000H开始存有四个压缩的 BCD码 12、
34,56,78。要求把它们转换为 ASCII码存放
在 3000H开始的单元中。
假定 DS,ES都已设置为
数据段的段基址。
程序见下页。
1000H
3000H
12
34
56
78
32H
31H
34H
33H
36H
35H
38H
37H
18
MOV SI,1000H ; SI←BCD 首址
MOV DI,3000H ; DI←ASCII 首址
MOV BX,4 ; 置计数器初值
BBB,MOV AL,[SI] ; AL←BCD 码,第一次取 12H
AND AL,0FH ; 屏蔽高 4位 →02H
OR AL,30H ; 转换为 ASCII码 → 32H
STOSB ;保存结果
LODSB
MOV CL,4
SHR AL,CL ; 逻辑右移 4位
OR AL,30H ; 得到高 4位 ASCII码
STOSB ;保存结果
DEC BX ; (BX)←(BX) -1
JNZ BBB ; (BX)≠0,则继续循环
19
作业
P152-P153
3.1,3.2,3.7,3.9,3.13, 3.16
20
3.3.4 串操作指令
串:顺序放在内存中的一组相同类型的数据。
串操作,对串中的元素进行相同的操作。
串操作的寻址方式:
源操作数指针 ——— DS:SI(DS可超越 )
目的操作数指针 —— ES:DI
每次串操作后,
串操作指令自动修改 SI和 DI—— 字节 ± 1,字 ± 2。
DF标志决定 ± 。 (注意:退出串操作后,指针指向最后
操作的元素的下一个元素 )
可完成两个存储单元之间的传送和比较操作(也仅
是串指令可以)
21
重复前缀
有的串操作指令前面可加上 重复前缀 REP。 当
使用 REP前缀时,该指令重复执行,重复执行
次数由 CX决定(带有 REP前缀的 串操作指令每
执行一次,CX自动减 1)。
重复前缀 包括:
REP CX≠0 时重复执行
REPE/REPZ CX≠0∧ ZF=1时重复执行
REPNE/REPNZ CX≠0∧ ZF=0时重复执行
22
串指令使用的一般方法
设置源串地址
设置目标串地址
设置串长度
设置操作方向 DF
串指令
MOV SI,源串首地址
(或 LEA SI,源串)
MOV DI,目的串首地址
(或 LEA DI,目的串)
MOV CX,串长度
CLD(或 STD)
,串指令,
23
指令执行的操作为:
MOVSB,((ES):(DI))←((DS):(SI))
SI± 1,DI± 1
MOVSW,((ES):(DI+1)(DI))←((DS):(SI+1)(SI))
SI± 2,DI± 2
指令也可写成,MOVS dest,src
但要求:
① src用 DS:SI寻址,dest用 ES:DI寻址
② 传送是字节还是字,由操作数的类型决定
⒈串传送指令 MOVSB / MOVSW
24
串传送指令使用举例
用串传送指令实现 200个字节的数据传
送:
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REP MOVSB
HLT
25
⒉串比较指令 CMPSB / CMPSW
指令执行的操作为:
CMPSB,((DS):(SI))-((ES):(DI))
SI± 1,DI± 1
CMPSW,((DS):(SI+1)(SI))-((ES):(DI+1)(DI))
SI± 2,DI± 2
?指令也可写成,CMPS dest,src
?比较的结果只反映在标志位上,串本身无变化。
?本指令可用来检查两个串是否相等。
26
⒊串扫描 SCASB / SCASW
执行的操作:
对字节,(AL)- ((ES):(DI))
DI± 1
对字,(AX)- ((ES):(DI+ 1)(DI))
DI± 2
?搜索指令执行的仍是比较 (减法 )操作,结果
只影响标志位。
?要搜索的关键字放在 AL(字节 )或 AX(字 )中。
?本指令用于在串中查找指定的信息。
27
SCAS指令加上重复前缀后,可对串 进行连续
扫描比较:
?若前缀为 REPZ,则表示 比较结果相等且
(ZF=1)且串未结束 (CX≠0),则继续比较。
?若前缀为 REPNZ,则表示比较结果不相等
(ZF=0)且串未结束 (CX≠0) 就继续比较。
28
例:在 ES段的偏移 1000H开始处存有 10个
ASCII码。搜索’ E’,若找到则记下搜索次
数及存放地址,并在屏幕上显示’ Y’;若未
找到则显示’ N’。 (见右图 )
在屏幕上显示一个字符的
指令段如下,(参见附录 C.3)
MOV DL,<字符 >
MOV AH,2
INT 21H
实现题目要求的程序段见下页:
1000H 41
42
43
44
45
46

A’’ B’
’ C’

D’

F’.,
.
ES段
’ E’
29
MOV DI,1000H ; (DI)← 串偏移地址
MOV CX,0AH ; (CX)← 串长度
MOV AL,’E’ ; 搜索关键字 =’E’
CLD ; 从低地址到高地址进行搜索
REPNZ SCASB ; 若未找到,继续搜索
JZ FOUND ; 找到,转至 FOUND
MOV DL,’N’ ; 串中无’ E’,(DL)←’N’
JMP DONE ; 转至 DONE
FOUND:DEC DI ; 指针回退
MOV ADDR,DI ; ADDR←’E’ 的地址
SUB DI,1000H
MOV NUM,DI ; NUM← 搜索次数
MOV DL,’Y’ ; (DL)←’Y’
DONE,MOV AH,2
INT 21H ;显示字符
HLT
30
执行的操作为:
对字节,(AL)←((DS):(SI))
SI± 1
对字,(AX)←((DS):(SI+1)(SI))
SI± 2
串装入指令通常不加重复前缀。
LODSB等价于, LODSW等价于,
MOV AL,[SI] MOV AX,[SI]
INC SI INC SI
INC SI
⒋串装入指令 LODSB / LODSW
31
36H
32H
39H
31H
STRING1
STRING2
38H
35H
36H
33H








‘ 8’
‘ 5’
‘ 6’
‘ 2’
‘ 9’
‘ 1’
‘ 6’
‘ 3’
SUM


...
...
07H
07H
02H
06H
32
下面要求将和的结果送显示,为此,要先
化成 ASCII码再送显示,程序段如下:
LEA SI,SUM+3 ; (SI)←SUM+3
MOV CX,4 ; (CX)← 和长度
STD ; 置 DF=1,减量修改 SI
MOV AH,02 ; (AH)← 功能号
LP,LODSB ; 取 BCD码至 AL,且 (SI)←(SI) -1
ADD AL,30H ; 转换为 ASCII码
MOV DL,AL ; (DL)← 字符
INT 21H ;显示字符
DEC CX
JNZ LP
……
33
指令的操作为:
对字节,((ES):(DI))←(AL)
DI± 1
对字,((ES):(DI+1)(DI))←(AX)
DI± 2
? 本指令用于把一块存储区域填充成某一初始
值 (即对存储区进行初始化 )。
? 存储区域的首地址要预先设置到 ES:DI中。
? 要存储到串中的数据要预先存到 AL(AX)中。
⒌串存储指令 STOSB / STOSW
34
例 1:把从 A000H开始的 2KB内存单元清零 。
程序段如下:
MOV DI,0A000H
MOV AX,0
MOV CX,1024
CLD
REP STOSW
35
例 2:把 1000H开始的 100个存储单元填入
ASCII码 2AH(*)。
程序段如下:
MOV DI,1000H ; 首地址
MOV AL,2AH ;‘ *’
MOV CX,100 ; 重复执行 100次
CLD ; 增量修改 DI
REP STOSB