数据传送指令及算术逻辑运算和移位指令的使用
- 格式:doc
- 大小:556.50 KB
- 文档页数:8
移位与算法指令及应用移位指令是计算机指令的一种,用于对操作数进行移位操作。
移位操作是将二进制数向左或向右移动一定的位数。
移位指令包括逻辑左移、逻辑右移、算术右移和循环左移等操作。
逻辑左移(Logical Left Shift)是将一个二进制数向左移动一定的位数,通过在右边补0来完成。
逻辑左移可以看作是乘以2的移位操作,因为在二进制数中,向左移动一位相当于将数值乘以2。
逻辑右移(Logical Right Shift)是将一个二进制数向右移动一定的位数,通过在左边补0来完成。
逻辑右移可以看作是除以2的移位操作,因为向右移动一位相当于将数值除以2。
算术右移(Arithmetic Right Shift)是将一个带符号的二进制数向右移动一定的位数,并在左边使用原来的符号位进行填充。
算术右移适用于带符号的整数,其操作类似于逻辑右移,但是保持符号位不变。
循环左移(Circular Left Shift)是将一个二进制数向左循环移动一定的位数。
循环左移会将最高位的数移到最低位,同时原来的最低位移到最高位,其它位数依次向左移动。
移位指令在计算机中广泛应用于各种算法和数据处理中,下面将介绍一些常见的应用场景。
1. 乘以或除以2的幂次方:通过逻辑左移或逻辑右移实现。
例如,将一个数值左移n位,相当于将其乘以2的n次方;将一个数值右移n位,相当于将其除以2的n次方。
2. 快速乘法:通过移位和加法操作实现。
对于两个数a和b,可以将其中一个数进行拆分,然后利用移位和加法操作进行计算,最后再进行合并。
这样可以大大降低乘法的复杂度。
3. 位操作:移位操作可以用于提取或设置二进制数的特定位。
通过逻辑右移和位与操作,可以提取出某一位的值;通过逻辑左移和位或操作,可以将某一位设置为1。
4. 编码压缩和解压缩:在一些数据压缩算法中,移位操作可以用于对数据进行编码压缩和解压缩。
例如,对于重复出现的相同数据,可以使用移位指令将其压缩为更小的形式,并在需要时进行解压缩。
第4课教学内容:2.4.2数据传送指令及要点分析2.4.3算术运算类指令及要点分析2.4.4逻辑操作与移位指令及要点分析2.4.5控制转移指令及其偏移量的计算2.4.6位操作指令2.4.7对指令的进一步说明教学目标:了解:单片机指令的分类与格式。
掌握:单片机指令的寻址方式,内部数据传送指令特点与应用,算术运算类指令及要点,逻辑操作与移位指令及要点,程序转移指令的相对偏移量计算,位操作指令的特点,PSW标志位的作用。
课时安排:3 课时教学重点:各类指令特点与应用教学提示:一、重点内容与要点分析1.数据传送类指令的共性:1)操作:把源操作数传送到目的操作数,指令执行后,源操作数不改变,目的操作数修改为源操作数。
2)若要求在进行数据传送时,不丢失目的操作数,则可以用交换型的传送指令。
3)数据传送指令不影响标志C、AC和OV,不包括奇偶标志P。
对于P一般不加说明。
POP PSW 或 MOV PSW,#(x)可能使某些标志位发生变化。
助记符有:MOV,MOVX,MOVC,XCH,XCHD,SWAP,POP,PUSH 8种。
源操作数可为:寄存器、寄存器间接、直接、立即、寄存器基址加变址 5种寻址方法;目的操作数可为:寄存器、寄存器间接、直接 3种寻址方法。
例1:设内部RAM的(30H)=40H,(40H)=10H ,(10H)=00H ,端口P1上的内容为11001010B(后缀B表示二进制数),分析下面7条指令分别属于上述16条指令中的哪一条,操作数采用的寻址方法,以及指令执行后各单元及寄存器、端口的内容。
MOV R0,#30H ;属于第8条(寄存器寻址、立即数寻址)(R0)=#30HMOV A,@R0 ;3条(寄存器寻址、寄存器间接寻址)(A)=#40HMOV R1, A ;2条(寄存器寻址、寄存器寻址)(R1)=#40HMOV B, @R1 ;13条(直接寻址、寄存器间接寻址)(B)=#10HMOV @R1, P1 ;14条(寄存器间接寻址,直接寻址)(40H)=#11001010B MOV P2, P1 ;15条(直接寻址、直接寻址)(P2)=#11001010B MOV 10H, #20H ;10条(直接寻址、立即寻址)(10H)=#20H指令执行以后,P1口的内容均为11001010B,其它内容如上。
实验一数据传送实验目的:1.熟悉8086指令系统的数据传送指令及8086的寻址方式。
2.利用TurboDebugger调试工具来调试汇编语言程序。
实验任务:1.通过下述程序段的输入和执行来熟悉TurboDebugger的使用,并通过显示器屏幕观察程序的执行情况。
练习程序段如下:MOVBL,08HMOVCL,BLMOVAX,03FFHMOVBX,AXMOVDS:[0020H],BX2.用以下程序段将一组数据压入(PUSH)堆栈区,然后通过不同的出栈顺序出栈,观察出栈后数据的变化情况。
压栈程序段如下:MOVAX,0102HMOVBX,0304HMOVCX,0506HMOVDX,0708HPUSHAXPUSHBXPUSHCXPUSHDX出栈程序段请自行编写(用不同的出栈顺序)。
3.指出下列指令的错误并加以改正,上机验证之。
(1)MOV[BX],[SI](2)MOVAH,BX(3)MOVAX,[SI][DI](4)MOVBYTEPTR[BX],2000H(5)MOVCS,AX(6)MOVDS,2000H4.设置各寄存器及存储单元的内容如下:(BX)=0010H,(SI)=0001H(10010H)=12H,(10011H)=34H,(10012H)=56H,(10013H)=78H(10120H)=0ABH,(10121H)=0CDH,(10122H)=0EFH说明下列各条指令执行完后AX寄存器中的内容,并上机验证。
(1)MOVAX,1200H(2)MOVAX,BX(3)MOVAX,[0120H](4)MOVAX,[BX](5)MOVAX,0110H[BX](6)MOVAX,[BX][SI](7)MOVAX,0110H[BX][SI]5.将DS:1000H字节存储单元中的内容送到DS:2020H单元中存放。
试分别用8086的直接寻址、寄存器间接寻址、变址寻址、寄存器相对寻址传送指令编写程序段,并上机验证结果。
实验二算术逻辑运算及移位操作一、实验目的1.熟悉算术逻辑运算指令和移位指令的功能。
2.了解标志寄存器各标志位的意义和指令执行对它的影响。
二、实验要求1.复习8086指令系统中的算术逻辑类指令和移位指令。
2.按照题目要求在实验前编写好实验中的程序段。
三、实验内容与步骤1. 实验程序段及结果表格如下2.用BX寄存器作为地址指针,从BX所指的内存单元(0010H)开始连续存入三个无符号数(10H、04H、30H),接着计算内存单元中的这三个数之和,和放在0013H单元中,再求出这三个数之积,积放0014单元中。
写出完成此功能的程序段并上机验证结果。
MOV BX,0010HMOV [BX],10HMOV [0001H][BX],04HMOV [0002H][BX],30HMOV AL,[BX]ADD AL,[0001H][BX]ADD AL,[0002H][BX]MOV [0003H][BX],ALMOV AL,BLMUL [0001H][BX]MUL [0002H][BX]MOV [0004H][BX],AX3.写出完成下述功能的程序段。
上机验证你写出的程序段,程序运行的最后结果(AX)=0372(1) 传送15H到AL寄存器; MOV AL,15H(2) 再将AL的内容乘以2;(3) 接着传送15H到BL寄存器; MOV BL,15H(4) 最后把AL的内容乘以BL的内容。
MUL BL(AX)=03724.写出完成下述功能的程序段。
上机验证你写出的程序段,程序运行后的商=73(1) 传送数据2058H到DS:1000H单元中,数据12H到DS:1002H单元中;(2) 把DS:1000H单元中的数据传送到AX寄存器;(3) 把AX寄存器的内容算术右移二位;(4) 再把AX寄存器的内容除以DS:1002H字节单元中的数;(5) 最后把商存入字节单元DS:1003H中。
MOV [1000H],2058HMOV [1002H],12HMOV AX,[1000H]MOV CL,2SAR AX,CLDIV [1002H]MOV [1003H],ALRET四、实验心得与体会在上节课实验的基础上,这次的实验比较顺利,感觉到了微机实验的魅力,对实验产生了浓厚的兴趣。
实验报告
1.数据传送指令的使用
一,实验目的;
把数据、地址或立即数传送到寄存器、存储单元以及I/O端口,或从内存单元、I/O端
口中读取数据。
1. 通用传送指令: MOV,PUSH,POP,XCHG,XLAT
2. 输入输出指令指令: IN,OUT
3. 目的地址传送指令: LEA,LDS,LES
4. 标志位传送指令: LAHF,SAHF,PUSHF,POPF
二,实验步骤;
1. 传送指令
1)用A命令在内存100H处键入下列内容:
MOV AX,1234
MOV BX,5678
XCHG AX,BX
MOV AH,35
MOV AL,48
MOV DX,75AB
XCHG AX,DX
2)用U命令检查键入的程序并记录,特别注意左边的机器码。
3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。并注意
标志位有无变化。
2. 改变标志寄存器psw中tf标志的状态(0——1或1——0),其余位保持不变。
3. 设DS=当前段地址,BX=0300H,SI=0002H,请用DEBUG的命令将存储器偏移地址
300H~304H连续单元顺序装入0AH,0BH,0CH,0DH,0EH。在DEBUG状态下使用A
命令送入下面程序,并用单步T命令执行的方法,分析每条指令源地址的形成过程?当数
据传送每完成一次,试分析AX寄存器中的内容是什么?
程序清单如下:
MOV AX,BX
MOV AX,0304H
MOV AX,[0304H]
MOV AX,[BX]
MOV AX,0001[BX]
MOV AX,[BX][SI]
HLT
4. 使用标志位传送指令,编程序段将标志位寄存器的低八位的值存入内存单元DS:1000H
中或堆栈中,然后将标志位寄存器的低八位置位为10101010。
2.算术逻辑运算和移位指令的使用
一,实验目的;
使用算术逻辑运算和移位指令,可以实现对二进制数据的加、减、乘、除等四则运算,与、
或、非、异或等逻辑运算,以及移位运算和代码转换运算
1, 算术运算:加法指令、减法指令,乘法指令、除法指令以及转换指令;
2. 逻辑运算指令:AND,TEST,OR,XOR,NOT
3. 移位指令:
移位运算可以分为算术逻辑移位和循环移位两类。
(1)算术逻辑移位指令:SHL,SHR,SAL,SAR
(2)循环移位指令:ROL,ROR,RCL,RCR
二,实验步骤;
1. 已知程序段定义如下:
MOV AX,1234
MOV CL,4
SHL AX,CL
INC AX
DEC CL
ROR AX,CL
MOV BX,4
MUL BX
MOV BX,4
DIV BX
INT 20
(1) 每条指令执行后,AX寄存器中的内容是什么?
(2) 每条指令执行后,标志寄存器的各位标志等于什么?
(3) 程序结束时,AX和DX的内容等于什么?
2. 编写一程序求双字数据的绝对值。双字数据保存在DX和AX中,结果保存在BX和CX
中。
3、编制程序,将DX和AX中的双字右移4位。
4. 编制程序,判断DL寄存器的低4位是否全为0?是否有0?判断AL寄存器中的数值是
奇数还是偶数?是否为4的倍数?
6、编制程序,用一条指令让AX寄存器清0;用一条指令使DX寄存器高3位为1,其余位
保持不变;用一条指令使BL寄存器低4位为0,其余位保持不变;用一条指令,使SI和
DI寄存器中对应位不相同的位置均置1;
三,串操作指令的使用
一,实验目的;
所谓串就是内存中一段地址相连的字节或字。串操作就是对串中各项数据进行某种运算,也
叫数据块操作。
8086/8088有5种基本串操作:
MOVS(Move string) 串传送指令
CMPS(Compare string) 串比较指令
SCAS(Scan string) 串扫描指令
LODS(Load from string) 从串取指令
STOS (Store in to string) 存入串指令
可以使用3种重复前缀:
REP(Repeat) 无条件重复
REPE/REPZ(Repeat while equal/zero) 相等/为零则重复
REPNE/REPNZ(Repeat while not equal/not zero)不相等/不为零则重复
可以只有源操作数,可以只有目标操作数,可能二者都有
源操作数用SI 寻址,隐含DS值为段地址,可以用段跨越前缀指定其它段;目标操作
数用DI寻址,隐含ES为段地址
每次串操作指令执行后根据DF标志对SI、DI 自动进行调整:
DF=1,DI、SI自动-1 (字节)或-2(字)
DF=0,DI、SI自动+1(字节)或+2(字)
通过使用串操作时我们对汇编的编写程序可以更简单,更快的写出程序。
二,实验步骤;
1.
编写程序段,查找字符串中是否含有字符"&",若有,将字符"&"用空格字符代替。
2.已知在N到N+I的内存单元中有一组ASCII码字符串(共I+1个),编写程序将此字符串传
送到NI到NI+I内存单元中,并使字符串的顺序与原来字符串的顺序相反
3.编写程序段:查找TELEPHONE中的电话号码(10位)中有无“-”字符,若有则将程序转向FOUND
处执行;若无则将程序转向NON_FOUND出执行;
4、ds:100开始的内存单元中存放着以“*”结尾的字符串,编写程序段查找该字符串中包含
字符’$’的个数,把个数放入CX寄存器中。
实验截屏如下:
三,实验小结;
注意:在数据传送指令中:除 SAHF和POPF指令外,所有指令对标志寄存器没有影响。
LEA A,B是将B的有效地址送到A中,而MOV A,B是B所指向字的单元的内容送到A中。
LDS A,B计算出有效地址EA,DS的有效地址EA+2。
在算术运算类指令中,如果用ADD,SUB等指令,也就是不带进位的加法指令。如果最高位相
加有进位,则自动丢失。
AND指令一般用来使某些位清“0”
OR指令一般用来使某些位置“1”
XOR指令使相同位为“0”,不同位为“1”
NOT指令一般用来“求反”
对于ROL,ROR等无进位循环,循环8次变回原来的数。
对于RCL,RCR等带进位循环,循环9次变回原来的数。