逻辑运算和移位指令
逻辑运算指令
逻辑与AND
- 格式
AND reg, imm/reg/mem ;reg←reg^imm/reg/mem
AND mem, imm/reg ; mem←-mem ^ imm/reg - 功能:对两个操作数执行按位的逻辑与运算,结果送到目的操作数
- 说明:
(1)按位的逻辑与运算;
(2)操作数不能同时为存储器操作数;
(3)注意对标志位的影响; (OF,CF==0) - 思考:
(1)某一个操作数自己和自己相逻辑与,结果是?(还是其本身)
(2) AND指令主要用在什么场合?
可屏蔽某些位(将这些位置0) 注:和0与清零,和1与保留原来的值
逻辑或OR
- 格式
OR reg,imm/reg/mem; reg←reg V imm/reg/mem
OR mem,imm/reg ; mem←memV imm/reg - 功能:对两个操作数执行按位逻辑或运算,结果送到目的操作数
- 说明
(1)按位逻辑或运算;
(2)OR指令对操作数的限制和对标志位的影响;(OF,CF==0)
思考:
(1)某一个操作数自己和自己相逻辑或,结果是?其本身
(2)OR指令主要用在什么场合? 功能: 使某些位置为1
逻辑非NOT
- 格式 NOT reg/mem ;~reg/mem
- 功能:对一个操作数执行按位逻辑非运算
- 说明
(1)按位取反,原来是“0”的位变为“1”,原来是“1”的位变为“0”;
(2) NOT指令是一个单操作数指令;
(3) NOT指令不影响标志位;
逻辑异或XOR
- 格式
XOR reg,imm/reg/mem ; reg← reg 异或 imm/reg/mem
XOR mem,imm/reg ; mem← mem 异或 imm/reg - 功能:对两个操作数执行按位逻辑异或运算,结果送到目的操作数
- 说明:
(1) 只有相“异或”的两位不相同,结果才是1;
(2)XOR指令对操作数的限制和对标志位的影响同AND指令(OF,CF==0) - 思考:
(1)某一个操作数自己和自己相异或,结果是?为0
(2) XOR指令主要用在什么场合?
使操作数的某些位取反或测试两数是否相等
测试TEST
- 格式:
TEST reg, imm/reg/mem ; reg^ imm/reg/mem
TEST mem, imm/reg ; mem^ imm/reg
TEST目的,源 ;目的^源,不回送结果,但影响标志位(例如ZF) - 例子
TEST AL, 80H; 测AL中第7位
JNZ T_ ALARM; D7=1, 转温度报警
TEST AL, 40H; 测D6位
JNZ P_ ALARM; D6=1, 转压力报警
移位指令(破坏性移位)
算术左移SAL(无符号数)
- 格式: SAL 目的,计数值
SAL AH,1
SAL AH,CL(当计数值大于1时,数要先传入CL)
SAL BYTE PTR [BX] ,1
逻辑左移SHL(有符号数)
- 格式: SHL目的,计数值
SHL AH, 1
SHL AH, CL - 注
1)CF总是被移出的高位,两者均属于破坏性移位
2)左移1位,相当于乘2
3)移位次数为1时,若最高位被改变,0F=1,否则0F=0(按有符号位相当于溢出)逻辑右移SHR
格式: SHR目的,计数值
右移1次,无符号数相当于除以2 (余数丢弃)
MOV AL, 10000110B ; AL=134
SHR AL, 1; AL=67
SHR AL, 1; AL=33, CF=1
算数右移SAR
格式: SAR目的,计数值;
右移1次,有符号数相当于除以2
例:
MOV AL, 80H; AL=10000000B- -128
MOV CL, 03H
SAR AL, CL ; AL=11110000B-F0H=-16
循环移位指令
ROL 循环左移
ROR循环右移
RCL带进位循环左移
RCR带进位循环右移
- 循环移位指令的应用
1.用于某些状态位的测试
2.高位部分和低位部分的交换
3.特定应用程序跑马灯等