移位操作编程实验
上机实验05 移位操作编程实验
一、实验要求和目的
1.了解汇编语言移位操作指令;
2.熟悉汇编语言逻辑移位指令的使用方法;
3.掌握利用汇编语言逻辑移位运算指令实现程序设计的方法。
二、软硬件环境
1.硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;
2.软件环境:装有MASM 5.0、DEBUG、LINK和EDIT等应用程序。
三、实验涉及的主要知识单元
移位指令主要包括算术移位、逻辑移位、循环移位,以下分三类介绍。其中统一的语句格式为:
操作符 OPD,1
操作符 OPD,CL
功能为将目的操作数的所有位按操作符规定的方式移动1位或按寄存器CL规定的次数(0~255)移动,结果送入目的地址。
1、算术移位
(1)算术左移指令SAL
格式:SAL OPD 1或CL
描述:
将(OPD)向左移动CL指定的次数,最低位补入相应的0,CF的内容为最后移入位的值。如图3-3所示,受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)。
图3-3 SAL
- 算术右移指令SAR
格式:SAR OPD 1或CL
描述:
将(OPD)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。如图3-4所示,受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)。
图3-4 SAR
2、逻辑移位
(1)逻辑左移
格式:SHL OPD 1或CL
描述:
把目的操作数的低位向高位移CL规定的次数,空出的低位补0,CF的内容为最后移入位的值。与算术左移相同,如图3-3所示,受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)。
(2)逻辑右移
格式:SHR OPD 1或CL
描述:
把目的操作数的高位向低位移CL规定的次数,空出的高位补0,CF的内容为最后移入位的值。 如图3-5所示,受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)。
图3-5 SHR
3、循环移位
循环移位包括不带进位的循环移位指令ROL、ROR和带进位的循环移位指令RCL、RCR。
(1)不带进位循环左移指令ROL
格式:ROL OPD 1或CL
描述:
把目的操作数的低位向高位移CL规定的次数,移出的位不仅要进入CF,而且还要填补空出的位,CF的内容为最后移入位的值。如图3-6所示,受影响的标志位:CF、OF。
图3-6 ROL
(2)不带进位循环右移指令ROR
格式:ROR OPD 1或CL
描述:
把目的操作数的高位向低位移CL规定的次数,移出的位不仅要进入CF,而且还要填补空出的位,CF的内容为最后移入位的值。如图3-7所示,受影响的标志位:CF、OF。
图3-7 ROR
(3)带进位循环左移指令RCL
格式:RCL OPD 1或CL
描述:
把目的操作数的低位向高位移CL规定的次数,用原CF的值填补空出的位,移出的位进入CF。如图3-8所示,受影响的标志位:CF、OF。
图3-8 RCL
(3)带进位循环右移指令RCR
格式:RCR OPD 1或CL
描述:
把目的操作数的高位向低位移CL规定的次数,,移出的位不仅要进入CF,而且还要填补空出的位,如图3-9所示,受影响的标志位:CF、OF。
图3-9 RCR
四、实验内容与步骤
1、实验内容
(1)用A命令写程序片段,在寄存器AX中存入一个数,要求对其用移位命令进行乘8,除4的操作。
- 编写程序片段,实现如下的计算A=10*B,要求用到移位命令,不用乘法计算。
- 编写指令序列把由DX和AX组成的32位二进制数进行算术左移。
2、实验步骤
(1)预习移位命令的基本知识,熟悉这些命令的基本操作,根据实验内容,整理编程思路;
(2)利用在DEBUG调试中的A命令输入对应程序片段;
(3)对写好的程序片段,利用DEBUG的T、P命令或G命令查看数据区,核对实验结果。
五、实验要求与提示
1、实验要求
(1)根据实验内容,写出分析思路;
(2)对写出的程序片段,加上适量注释;
(3)回答思考问题;
(4)记录实验结果。
2、实验提示
(1)移位运算中,左移一位相当于乘2操作,右移一位相当于除2操作;
对寄存器AX赋值为4,然后先执行左移1位操作,再执行右移1位操作,用P命令观察寄存器AX的变化,如图3-10所示。
图3-10
(2)算术移位适合于有符号数的运算,逻辑移位适用于无符号数的运算。
(3)32位的移位注意CF的变化。
(4)运算下面程序,并观察各寄存器和标志位的值变化情况。
;****************************************************************
STACK SEGMENT PARA STACK
DB 20 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK
START:
MOV AX,0CBA5H
MOV CX,0CH
LOOP1:
SAL AX,1 ;算术左移
LOOP LOOP1
MOV AX,0CBA5H
MOV CX,0CH
LOOP2:
SAR AX,1 ;算术右移
LOOP LOOP2
MOV AX,0CBA5H
MOV CX,0CH
LOOP3:
SHL AX,1 ;逻辑左移
LOOP LOOP3
MOV AX,0CBA5H
MOV CX,0CH
LOOP4:
SHR AX,1 ;逻辑右移
LOOP LOOP4
MOV AX,0CBA5H
MOV CX,0CH
LOOP5:
ROL AX,1 ;不带进位的循环左移
LOOP LOOP5
MOV AX,0CBA5H
MOV CX,0CH
LOOP6:
ROR AX,1 ;不带进位的循环右移
LOOP LOOP6
MOV AX,0CBA5H
MOV CX,0CH
LOOP7:
RCL AX,1 ;带进位的循环左移
LOOP LOOP7
MOV AX,0CBA5H
MOV CX,0CH
LOOP8:
RCR AX,1 ;带进位的循环右移
LOOP LOOP8
MOV AH,4CH ;返回DOS
INT 21H
CODE ENDS
END START
;************************************************************************
3、编程:设在数据段中定义有三个变量X,Y,Z,请利用算术移位指令编写程序“sy05_1.asm”,计算出下式的值(假设乘积的结果只有低16位有效):
Z=10*(X+Y)
掌握和熟悉以上的各移位操作指令,并把调试好的程序sy05_1.asm 提交。
代码:
DATA SEGMENT
X DW 0520H
Y DW 0521H
Z DW 2 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AX,X
MOV BX,Y
ADD AX,BX
MOV CX,AX
MOV CL,3
SHL AX,CL
SHL CX,1
ADD AX,CX
MOV Z,AX
MOV DX,Z
CODE ENDS
END START
六、思考与练习以及测评标准
1.执行以下命令,观察AX是否有变化:
(1)SAL AX, 1
SAR AX, 1
(2)SAR AX, 1
SAL AX, 1
2.移位指令如何影响标志位CF、OF?