第3章数据处理(4)位操作和字符串操作指令1
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
非门电路 ~ 01000101 10111010
真值表
A T 0 1 1 0
A
T 逻辑表达式
T=A
7
4. 逻辑异或指令XOR
逻辑异或(逻辑半加)运算规则: 两位不同(相异),则结果是1;否则,结果是0 逻辑异或指令XOR: 按位进行逻辑异或,结果返回目的操作数 XOR dest,src ;逻辑或:dest←dest src 设置CF=OF=0 A B T 影响SF,ZF和PF 异或门电路 0 0 0 A T 0 1 1 B 01000101 00110001 真值表 1 0 1 逻辑表达式 01110100 T=AB 1 1 0
5
OR 指令通常用于将某些位置1。 例如,将AL=1000 0110B,现需要将D3~D0四位全变为 1 ,保持D7~D4不变。 OR AL,00001111B 这样,执行指令后,D7~D4保持不变,D3~D0全部变为1 指令执行后,(AL)=1000 1111B
被置1
6
3. 逻辑非指令NOT
逻辑非(逻辑反)运算规则: 原来为0的位变成1,原来为1的位变成0 逻辑非指令NOT: 按位进行逻辑非,结果返回操作数 NOT reg/mem ;逻辑非:reg/mem←~reg/mem 不影响状态标志位
15
1. 移位指令
分逻辑(Logical)和算术(Arithmetic)移位 具有左移(Left)或右移(Right)操作 SHL reg/mem,i8/CL
;逻辑左移:最低位补0,最高位进入CF
SHR reg/mem,i8/CL
;逻辑右移:最高位补0,最低位进入CF
SAL reg/mem,i8/CL
EAX=0 AX=要乘以10的无符号数 左移一位等于乘2 EBX=EAX×2 再左移2位,EAX=EAX×8 EAX=EAX×10 显示乘积 换行 EAX=EAX×10 显示乘积
SHL逻辑左移一位相当于无符号数乘以2 SHR逻辑右移一位相当于无符号数除以219
2. 循环移位指令
循环(Rotate)移位指令要将从一端移出的位返回到 另一端形成循环 分成不带进位循环移位和带进位循环移位 分别具有左移或右移操作 ROL reg/mem,i8/CL
;数据段 byte '38'
;字符串,存放3,8数字ASCII码
;3的ASCII码(33H)在前, ;8的ASCII码(38H)在后
byte ? ;代码段 mov al,ascii and al,0fh mov ah,ascii+1 shl ah,4 or al,ah mov bcd,al
;变为00000011数字3的BCD ;左移4位,变为1000 0000B ; AL =1000 0011B BCD=83H
8
XOR 指令通常用于将某些指定位取反 例如,将AL=10010110B,现需要将D7,D5,D3,D1取反 , 保持D6、D4、D2、D0不变——与10101010B异或 AND AL,00001111B
这样,执行指令后,D7~D4被清为0,D3~D0维持不变 指令执行后,(AL)=00111100B 与NOT指令的区别——Not指令对每一位取反 XOR指令可以对指定的位取反
;保存结果
26
3.7 串操作类指令
数据串(数组):以字节、字和双字为单位的多个数据 存放在连续的主存区域中 源操作数:允许段超越:DS:[ESI] 目的操作数:不允许段超越:ES:[EDI] 每执行一次串操作:ESI和EDI自动±1/2/4 以字节为单位(用B结尾)操作:地址指针±1 以字为单位(用W结尾)操作:地址指针±2 以双字为单位(用D结尾)操作:地址指针±4 DF=0(执行CLD指令):地址指针增加(+) DF=1(执行STD指令):地址指针减小(-)
N位操作数循环左移,操作数最高位与最低位连接成一个环,每 位循环左移指定的位数, 如果循环左移k位,则最到位N-k位进入CF, 例如 AX=1001 1000 0111 0110B 循环左移2位 ROL AX,2 执行后 AX=0110 0001 1101 1010 16-2=14,D14=0进入CF,CF=0 移位位数=2,大于1,OF不确定
9
〔例〕逻辑运算程序-1
;定义数据段: varA dword 11001010000111100101010101001101B varB dword 00110111010110100011010111100001B varT1 dword ? varT2 dword ? mov eax,varA ; EAX=11001010000111100101010101001101B not eax ; EAX=00110101111000011010101010110010B and eax,varB ; EAX=00110101010000000010000010100000B
12 运行结果
逻辑运算的屏蔽作用
AND指令复位某些位(同0与),不影响其他(同1与) OR指令置位某些位(同1或),不影响其他(同0或) XOR求反某些位(同1异或),不影响其他(同0异或) and bl,11110110b or bl,00001001b xor bl,00001001b 置位Set:置1 ;BL中D0和D3清0,其余位不变 ;BL中D0和D3置1,其余位不变 ;BL中D0和D3求反,其余位不变 复位Reset:清0,清除Clear
11
〔例〕逻辑运算程序-2
mov eax,varA A B AB AB xor eax,varB ; EAX=11111101010001000110000010101100B mov varT2,eax ; mov eax,varT1 ; 二进制形式显示VART1 call dispbd call dispcrlf ; 换行显示 mov eax,varT2 ; 二进制形式显示VART2 call dispbd
18
〔例〕移位指令实现乘法程序
xor eax,eax mov ax,wvar shl eax,1 mov ebx,eax shl eax,2 add eax,ebx call dispuid call dispcrlf imul eax,10 call dispuid
; ; ; ; ; ; ; ; ; ;
10
mov ebx,varB ; EBX=00110111010110100011010111100001B not ebx ; EBX=11001000101001011100101000011110B and ebx,varA ; EBX=11001000000001000100000000001100B or eax,ebx ; EAX=11111101010001000110000010101100B mov varT1,eax
大写=小写 AND DFH 小写=大写 OR 20H
xor eax,eax sub eax,eax mov eax,0
13
5. 测试指令TEST
按位进行逻辑与运算,不返回逻辑与结果 TEST dest,src ;作逻辑与运算:dest src TEST指令像AND指令一样来设置状态标志 TEST指令常用于检测一些条件是否满足,一般后跟条 件转移指令,目的是利用测试条件转向不同的分支
3
AND 指令通常用于将某些位清0 例如,将AL=10010110B,现需要将D7,D6,D5,D4清0 , 保持D3~D0不变 AND AL,00001111B 这样,执行指令后,D7~D4被清为0,D3~D0维持不变 指令执行后,(AL)=00000110B
被清0
4
2. 逻辑或指令OR
逻辑或(逻辑加)运算规则: 两位都是逻辑0,则结果是0;否则,结果是1 逻辑或指令OR: 按位进行逻辑或,结果返回目的操作数 OR dest,src ;逻辑或:dest←dest src 设置CF=OF=0 A B T 影响SF,ZF和PF 或门电路 0 0 0 A T B 0 1 1 01000101 逻辑表达式 00110001 真值表 1 0 1 01110101 T=A+B 1 1 1
;不带进位循环左移指令
ROL/ROR示意图
ROR reg/mem,i8/CL
;不带进位循环右移指令
RCL reg/mem,i8/CL
;带进位循环左移指令
RCR reg/mem,i8/CL
;带进位循环右移指令
RCL/RCR示意图
20
不带进位的循环移位指令
包括 循环左移 循环右移 两条指令。
21
循环左移
22
循环右移
循环右移与循环左移相似,只是移位方向变为由高位 向低位移位,低位进入CF
23
带进位的循环移位指令
24
〔例〕循环移位程序-1
qvar ;数据段 qwຫໍສະໝຸດ Baidurd 1234567887654321h ;代码段 mov ecx,4 shr dword ptr qvar+4,1 rcr dword ptr qvar,1 loop again
again:
64位数据右移位,不能一次完成,需要分2次 (1)高32位右移一位,最低为进入CF——SHR (2)低32位带进位位右移——只有带进位位循环右移,进位位 进入最高位
高32位
64位数据 逻辑右移 0
CF
低32位
25
〔例〕循环移位程序-2:将两位数字ASCII转换为压缩BCD码
ascii bcd
3.6 位操作类指令
计算机中最基本的数据单位是二进制位 针对二进制位进行操作、实现位控制的指令 逻辑运算指令 移位指令 …… 进行一位或若干位处理,采用位操作类指令
1
3.6.1 逻辑运算指令
逻辑与指令 AND 逻辑或指令 OR 逻辑非指令 NOT 逻辑异或指令 XOR 测试指令 TEST 除NOT指令不影响标志外 其他逻辑指令 使OF=CF=0 根据结果按定义影响ZF、SF和PF
27
3.7.1 串传送指令
MOVSB|MOVSW|MOVSD ;串传送:ES:[EDI]←DS:[ESI] ;然后:ESI←ESI±1/2/4,EDI←EDI±1/2/4 STOSB|STOSW|STOSD ;串存储:ES:[EDI]←AL/AX/EAX ;然后:EDI←EDI±1/2/4 LODSB|LODSW|LODSD ;串读取:AL/AX/EAX←DS:[ESI] ;然后:ESI←ESI±1/2/4 REP ;执行一次串指令,ECX减1;直到ECX=0
28
1. 串传送 MOVS 字节传送 MOVSB 字传送 MOCSW 双字传送 MOVSD (1) 默认源地址: DS:ESI 允许段超越 (2) 默认目的地址:ES:DI 不允许段超越 (3) 依据每次传送的字节数,自动修改SI和DI MOVSB SI,DI自动+1或-1 MOVSW SI,DI自动+2或-2 MOVSD SI,DI自动+4或-4 由标志寄存器的DF=1(STD指令设置),+ DF=0(CLD指令设置),(4)串传送指令MOVS前可以使用重复前缀 REP,重复次数由CX (ECX)的值确定,没执行一次传送,CX-1
AND与TEST?
TEST与CMP?
14
3.6.2 移位指令
逻辑左移指令 逻辑右移指令 算术左移指令 算术左移指令
SHL SHR SAL SAR
S: Shift R: Rotate L: Left R: Right A: Arithmetic C: Carry flag
不带进位循环左移指令 ROL 不带进位循环右移指令 ROR 带进位循环左移指令 RCL 带进位循环右移指令 RCR
;算术左移,与SHL是同一条指令
SAR reg/mem,i8/CL
;算术右移:最高位不变,最低位进入CF
目的操作数:寄存器或存储单元reg/mem 后一个操作数:移位位数i8/CL
16
对符号位的影响 (1)由移入的位确定CF (2)如果只进行1位移位,则由移位前后最高位是否 变化确定OF—— 最高位改变,OF=1 最高为不变化,OF=0 (3)如果移位位数大于1,则OF不确定 (4)其他标志位:SF、ZF、PF依据最后结果设置 (5) AF
2
1. 逻辑与指令AND
逻辑与(逻辑乘)运算规则: 两位都是逻辑1,则结果是1;否则,结果是0 逻辑与指令AND: 按位进行逻辑与,结果返回目的操作数 AND dest,src ;逻辑与:dest←dest src 设置CF=OF=0 A B T 影响SF,ZF和PF 与门电路 0 0 0 A T 0 1 0 B 01000101 逻辑表达式 00110001 真值表 1 0 0 00000001 T=A·B 1 1 1
真值表
A T 0 1 1 0
A
T 逻辑表达式
T=A
7
4. 逻辑异或指令XOR
逻辑异或(逻辑半加)运算规则: 两位不同(相异),则结果是1;否则,结果是0 逻辑异或指令XOR: 按位进行逻辑异或,结果返回目的操作数 XOR dest,src ;逻辑或:dest←dest src 设置CF=OF=0 A B T 影响SF,ZF和PF 异或门电路 0 0 0 A T 0 1 1 B 01000101 00110001 真值表 1 0 1 逻辑表达式 01110100 T=AB 1 1 0
5
OR 指令通常用于将某些位置1。 例如,将AL=1000 0110B,现需要将D3~D0四位全变为 1 ,保持D7~D4不变。 OR AL,00001111B 这样,执行指令后,D7~D4保持不变,D3~D0全部变为1 指令执行后,(AL)=1000 1111B
被置1
6
3. 逻辑非指令NOT
逻辑非(逻辑反)运算规则: 原来为0的位变成1,原来为1的位变成0 逻辑非指令NOT: 按位进行逻辑非,结果返回操作数 NOT reg/mem ;逻辑非:reg/mem←~reg/mem 不影响状态标志位
15
1. 移位指令
分逻辑(Logical)和算术(Arithmetic)移位 具有左移(Left)或右移(Right)操作 SHL reg/mem,i8/CL
;逻辑左移:最低位补0,最高位进入CF
SHR reg/mem,i8/CL
;逻辑右移:最高位补0,最低位进入CF
SAL reg/mem,i8/CL
EAX=0 AX=要乘以10的无符号数 左移一位等于乘2 EBX=EAX×2 再左移2位,EAX=EAX×8 EAX=EAX×10 显示乘积 换行 EAX=EAX×10 显示乘积
SHL逻辑左移一位相当于无符号数乘以2 SHR逻辑右移一位相当于无符号数除以219
2. 循环移位指令
循环(Rotate)移位指令要将从一端移出的位返回到 另一端形成循环 分成不带进位循环移位和带进位循环移位 分别具有左移或右移操作 ROL reg/mem,i8/CL
;数据段 byte '38'
;字符串,存放3,8数字ASCII码
;3的ASCII码(33H)在前, ;8的ASCII码(38H)在后
byte ? ;代码段 mov al,ascii and al,0fh mov ah,ascii+1 shl ah,4 or al,ah mov bcd,al
;变为00000011数字3的BCD ;左移4位,变为1000 0000B ; AL =1000 0011B BCD=83H
8
XOR 指令通常用于将某些指定位取反 例如,将AL=10010110B,现需要将D7,D5,D3,D1取反 , 保持D6、D4、D2、D0不变——与10101010B异或 AND AL,00001111B
这样,执行指令后,D7~D4被清为0,D3~D0维持不变 指令执行后,(AL)=00111100B 与NOT指令的区别——Not指令对每一位取反 XOR指令可以对指定的位取反
;保存结果
26
3.7 串操作类指令
数据串(数组):以字节、字和双字为单位的多个数据 存放在连续的主存区域中 源操作数:允许段超越:DS:[ESI] 目的操作数:不允许段超越:ES:[EDI] 每执行一次串操作:ESI和EDI自动±1/2/4 以字节为单位(用B结尾)操作:地址指针±1 以字为单位(用W结尾)操作:地址指针±2 以双字为单位(用D结尾)操作:地址指针±4 DF=0(执行CLD指令):地址指针增加(+) DF=1(执行STD指令):地址指针减小(-)
N位操作数循环左移,操作数最高位与最低位连接成一个环,每 位循环左移指定的位数, 如果循环左移k位,则最到位N-k位进入CF, 例如 AX=1001 1000 0111 0110B 循环左移2位 ROL AX,2 执行后 AX=0110 0001 1101 1010 16-2=14,D14=0进入CF,CF=0 移位位数=2,大于1,OF不确定
9
〔例〕逻辑运算程序-1
;定义数据段: varA dword 11001010000111100101010101001101B varB dword 00110111010110100011010111100001B varT1 dword ? varT2 dword ? mov eax,varA ; EAX=11001010000111100101010101001101B not eax ; EAX=00110101111000011010101010110010B and eax,varB ; EAX=00110101010000000010000010100000B
12 运行结果
逻辑运算的屏蔽作用
AND指令复位某些位(同0与),不影响其他(同1与) OR指令置位某些位(同1或),不影响其他(同0或) XOR求反某些位(同1异或),不影响其他(同0异或) and bl,11110110b or bl,00001001b xor bl,00001001b 置位Set:置1 ;BL中D0和D3清0,其余位不变 ;BL中D0和D3置1,其余位不变 ;BL中D0和D3求反,其余位不变 复位Reset:清0,清除Clear
11
〔例〕逻辑运算程序-2
mov eax,varA A B AB AB xor eax,varB ; EAX=11111101010001000110000010101100B mov varT2,eax ; mov eax,varT1 ; 二进制形式显示VART1 call dispbd call dispcrlf ; 换行显示 mov eax,varT2 ; 二进制形式显示VART2 call dispbd
18
〔例〕移位指令实现乘法程序
xor eax,eax mov ax,wvar shl eax,1 mov ebx,eax shl eax,2 add eax,ebx call dispuid call dispcrlf imul eax,10 call dispuid
; ; ; ; ; ; ; ; ; ;
10
mov ebx,varB ; EBX=00110111010110100011010111100001B not ebx ; EBX=11001000101001011100101000011110B and ebx,varA ; EBX=11001000000001000100000000001100B or eax,ebx ; EAX=11111101010001000110000010101100B mov varT1,eax
大写=小写 AND DFH 小写=大写 OR 20H
xor eax,eax sub eax,eax mov eax,0
13
5. 测试指令TEST
按位进行逻辑与运算,不返回逻辑与结果 TEST dest,src ;作逻辑与运算:dest src TEST指令像AND指令一样来设置状态标志 TEST指令常用于检测一些条件是否满足,一般后跟条 件转移指令,目的是利用测试条件转向不同的分支
3
AND 指令通常用于将某些位清0 例如,将AL=10010110B,现需要将D7,D6,D5,D4清0 , 保持D3~D0不变 AND AL,00001111B 这样,执行指令后,D7~D4被清为0,D3~D0维持不变 指令执行后,(AL)=00000110B
被清0
4
2. 逻辑或指令OR
逻辑或(逻辑加)运算规则: 两位都是逻辑0,则结果是0;否则,结果是1 逻辑或指令OR: 按位进行逻辑或,结果返回目的操作数 OR dest,src ;逻辑或:dest←dest src 设置CF=OF=0 A B T 影响SF,ZF和PF 或门电路 0 0 0 A T B 0 1 1 01000101 逻辑表达式 00110001 真值表 1 0 1 01110101 T=A+B 1 1 1
;不带进位循环左移指令
ROL/ROR示意图
ROR reg/mem,i8/CL
;不带进位循环右移指令
RCL reg/mem,i8/CL
;带进位循环左移指令
RCR reg/mem,i8/CL
;带进位循环右移指令
RCL/RCR示意图
20
不带进位的循环移位指令
包括 循环左移 循环右移 两条指令。
21
循环左移
22
循环右移
循环右移与循环左移相似,只是移位方向变为由高位 向低位移位,低位进入CF
23
带进位的循环移位指令
24
〔例〕循环移位程序-1
qvar ;数据段 qwຫໍສະໝຸດ Baidurd 1234567887654321h ;代码段 mov ecx,4 shr dword ptr qvar+4,1 rcr dword ptr qvar,1 loop again
again:
64位数据右移位,不能一次完成,需要分2次 (1)高32位右移一位,最低为进入CF——SHR (2)低32位带进位位右移——只有带进位位循环右移,进位位 进入最高位
高32位
64位数据 逻辑右移 0
CF
低32位
25
〔例〕循环移位程序-2:将两位数字ASCII转换为压缩BCD码
ascii bcd
3.6 位操作类指令
计算机中最基本的数据单位是二进制位 针对二进制位进行操作、实现位控制的指令 逻辑运算指令 移位指令 …… 进行一位或若干位处理,采用位操作类指令
1
3.6.1 逻辑运算指令
逻辑与指令 AND 逻辑或指令 OR 逻辑非指令 NOT 逻辑异或指令 XOR 测试指令 TEST 除NOT指令不影响标志外 其他逻辑指令 使OF=CF=0 根据结果按定义影响ZF、SF和PF
27
3.7.1 串传送指令
MOVSB|MOVSW|MOVSD ;串传送:ES:[EDI]←DS:[ESI] ;然后:ESI←ESI±1/2/4,EDI←EDI±1/2/4 STOSB|STOSW|STOSD ;串存储:ES:[EDI]←AL/AX/EAX ;然后:EDI←EDI±1/2/4 LODSB|LODSW|LODSD ;串读取:AL/AX/EAX←DS:[ESI] ;然后:ESI←ESI±1/2/4 REP ;执行一次串指令,ECX减1;直到ECX=0
28
1. 串传送 MOVS 字节传送 MOVSB 字传送 MOCSW 双字传送 MOVSD (1) 默认源地址: DS:ESI 允许段超越 (2) 默认目的地址:ES:DI 不允许段超越 (3) 依据每次传送的字节数,自动修改SI和DI MOVSB SI,DI自动+1或-1 MOVSW SI,DI自动+2或-2 MOVSD SI,DI自动+4或-4 由标志寄存器的DF=1(STD指令设置),+ DF=0(CLD指令设置),(4)串传送指令MOVS前可以使用重复前缀 REP,重复次数由CX (ECX)的值确定,没执行一次传送,CX-1
AND与TEST?
TEST与CMP?
14
3.6.2 移位指令
逻辑左移指令 逻辑右移指令 算术左移指令 算术左移指令
SHL SHR SAL SAR
S: Shift R: Rotate L: Left R: Right A: Arithmetic C: Carry flag
不带进位循环左移指令 ROL 不带进位循环右移指令 ROR 带进位循环左移指令 RCL 带进位循环右移指令 RCR
;算术左移,与SHL是同一条指令
SAR reg/mem,i8/CL
;算术右移:最高位不变,最低位进入CF
目的操作数:寄存器或存储单元reg/mem 后一个操作数:移位位数i8/CL
16
对符号位的影响 (1)由移入的位确定CF (2)如果只进行1位移位,则由移位前后最高位是否 变化确定OF—— 最高位改变,OF=1 最高为不变化,OF=0 (3)如果移位位数大于1,则OF不确定 (4)其他标志位:SF、ZF、PF依据最后结果设置 (5) AF
2
1. 逻辑与指令AND
逻辑与(逻辑乘)运算规则: 两位都是逻辑1,则结果是1;否则,结果是0 逻辑与指令AND: 按位进行逻辑与,结果返回目的操作数 AND dest,src ;逻辑与:dest←dest src 设置CF=OF=0 A B T 影响SF,ZF和PF 与门电路 0 0 0 A T 0 1 0 B 01000101 逻辑表达式 00110001 真值表 1 0 0 00000001 T=A·B 1 1 1