第二章80X86指令系2.docx
《第二章80X86指令系2.docx》由会员分享,可在线阅读,更多相关《第二章80X86指令系2.docx(15页珍藏版)》请在冰豆网上搜索。
第二章80X86指令系2
云南大学软件学院
实验报告
第二章80X86指令系统
2.1数据传送指令的使用
一、数据传送指令概述
负责把数据、地址或立即数传送到寄存器、存储单元以及I/O端口,或从内存单元、I/O端口中读取数据。
可以分为下面几类:
1.通用传送指令:
MOV,PUSH,POP,XCHG,XLAT
2.输入输出指令指令:
IN,OUT
3.目的地址传送指令:
LEA,LDS,LES
4.标志位传送指令:
LAHF,SAHF,PUSHF,POPF
注意:
除SAHF和POPF指令外,所有指令对标志寄存器没有影响。
二、数据传送指令详解
略
三、数据传送指令的有关说明
1.MOV指令的源操作数和目的操作数必须同时为字节或字操作数;若指令中给出的两个操作数一个为立即数操作数,另一个为内存操作数,则不能确定内存操作数为字节操作数还是字操作数,必须使用PTR伪指令进行说明;若指令中有一个操作数为寄存器操作数,则由寄存器规定操作数是字节还是字操作数;例如:
MOVNEM1,AX;
把AX寄存器中字数据传送到地址为NEM1字内存单元中,高字节AH中内容传送到地址为NEM1+1内存单元中,低字节AL中的内容传送到地址NEM1内存单元中;从指令中可以看出,在内存中存放一个字数据需要两个内存单元;内存单元中字数据的地址使用低字节的地址表示;
MOVNEM1,12H
把12H传送到地址为NEM1的内存单元。
上面的指令是错误的,原因是NEM1可以表示内存单元中一个字节数据的地址或者是一个字数据的地址,那么12H到底应该传送到字内存单元中还是字内存单元中呢?
不能由12H的大小而断定上面的语句是字节传送指令。
正确语句应该表示如下:
MOVWORDPTRNEM1,12H
把12H传送到字内存单元NEM1中
MOVBYTEPTRNEM1,12H
把12H传送到字节内存单元NEM1中
2.PUSH、POP指令只需要一个操作数,必须为字操作数;另一个默认的操作数是SS:
SP所指向的字内存单元操作数。
POPF和PUSHF指令的操作数也必须为字操作,而且默认为标志寄存器PSW和SS:
SP所指向字内存单元;SAHF和LAHF指令的操作数必须为字节操作数,而且默认为AH寄存器和PSW寄存器的低8位。
3.LEA、LDS和LES是用来取源操作数的地址的指令,则目的操作数必须为16位的通用寄存器;
四、例题讲解
1.使用数据传送指令,把标志寄存器中的OF标志清0其余位保持不变;
PUSHF;把PSW中的内容传送到堆栈中
POPAX;把PSW的内容从堆栈中弹出,传送到AX寄存器中
ANDAX,0F7FFH;把AX中第11位置0,其余位保持不变
PUSHAX;把AX中内容压入堆栈
POPF;把堆栈中内容弹出到PSW中
思考:
采用SAHF和LAHF能否实现上面的功能,为什么?
2.在当前数据段偏移地址为2000H开始的4个内存单元中,存放着某个内存空间的地址指针,高字存放段地址指针,低字存放偏移地址指针,试把该地址指针指向的内存空间的内容读出放入AX寄存器中。
MOVSI,2000H
MOVAX,[SI]
MOVBX,AX
MOVAX,[SI+2]
MOVDS,AX
MOVAX,[BX]
五、练习
1.传送指令
1)用A命令在内存100H处键入下列内容:
MOVAX,1234
MOVBX,5678
XCHGAX,BX
MOVAH,35
MOVAL,48
MOVDX,75AB
XCHGAX,DX
2)用U命令检查键入的程序并记录,特别注意左边的机器码。
3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。
并注意标志位有无变化。
2.改变标志寄存器psw中AF标志的状态(0——1或1——0),其余位保持不变。
PUSHF
POPAX
XORAX,08H
PUSHAX
POPF
3.设DS=当前段地址,BX=0300H,SI=0002H,请用DEBUG的命令将存储器偏移地址300H~304H连续单元顺序装入0AH,0BH,0CH,0DH,0EH。
在DEBUG状态下使用A命令送入下面程序,并用单步T命令执行的方法,分析每条指令源地址的形成过程?
当数据传送每完成一次,试分析AX寄存器中的内容是什么?
程序清单如下:
MOVAX,BX
MOVAX,0304H
MOVAX,[0304H]
MOVAX,[BX]
MOVAX,0001[BX]
MOVAX,[BX][SI]
HLT
4.使用标志位传送指令,编程序段将标志位寄存器的低八位的值存入内存单元DS:
1000H中或堆栈中,然后将标志位寄存器的低八位置位为10101010。
PUSHF
POPDS:
1000H
MOVDS:
1000H,0AAH
2.2算术逻辑运算和移位指令的使用
一、算术逻辑运算和移位指令概述
使用算术逻辑运算和移位指令,可以实现对二进制数据的加、减、乘、除等四则运算,与、或、非、异或等逻辑运算,以及移位运算和代码转换运算。
具体说来,可以分为如下几类:
1.算术运算指令:
加法指令、减法指令,乘法指令、除法指令以及转换指令;
对于算术运算指令来说,
⏹大部分都影响标志位,不同指令影响不同:
(1)加、减法指令影响SF,ZF,AF,PF,CF,OF;
(2)加1和减1指令不影响CF;
(3)乘法指令影响CF,OF;
(4)除法指令使大部分标志位的状态不确定;
(5)对BCD码调整指令对标志位的影响不同;
(6)转换指令对标志位无影响
⏹都可以用于字节、字的运算;
⏹双操作数指令除源为立即数外,其余必须有一个操作数为寄存器;单操作数指令不能为立即数。
2.逻辑运算指令:
AND,TEST,OR,XOR,NOT
对于逻辑运算指令来说,逻辑运算是按位操作,操作数应该是位串而不是数;
在8086/8088中,可以使用的操作数可以为8位或16位二进制数,即可以是一个字节或字数据;NOT指令不允许使用立即数,其它4条指令除非源操作数是立即数,至少有一个操作数必须放在寄存器中,另一个操作数则可以使用任意的寻址方式;NOT指令不影响标志位,其它4条指令对标志位的影响规定如下:
CF=0F=0,AF未定义,SF、ZF、PF根据运算结果进行设置。
3.移位指令:
移位运算可以分为算术逻辑移位和循环移位两类。
(1)算术逻辑移位指令:
SHL,SHR,SAL,SAR
(2)循环移位指令:
ROL,ROR,RCL,RCR
对于移位指令来说,
(1)所有的移位指令都可以用来对字节或字数据进行移位运算;
(2)移位指令的目的操作数可以使用寄存器或储存器寻址方式;
(3)若移位次数大于1次,则移位次数应先放在CL寄存器;
移位指令对标志位的影响规定如下:
(1)算术逻辑移位指令影响:
执行多次移位指令后对CF、OF的影响:
CF=从目标操作数移出的最后一位;OF不定。
执行一次移位指令后对CF、OF的影响:
OF用于判断移位后最高有效位是否发生变化:
最高位与CF不等,OF=1;无变化时,OF=0;CF根据各条指令的规定设置;对于SF、ZF、PF,AF无定义。
(2)循环移位指令的影响:
SF、ZF、PF、AF不影响。
OF、CF见指令说明。
二、算术逻辑运算和移位指令详解
略
三、算术逻辑运算和移位指令的有关说明
1.不论程序中给出的是何种进制的数值,在程序执行时,运算指令都按照二进制数的运算规律进行数值的运算,运算的结果都为二进制数;
2.加法与减法运算OF、CF的讨论:
加法:
OF=1,表示两个同符号数相加,结果符号与其相反,产生溢出,即运算结果错误;
OF=0,表示两个同符号数相加,结果符号与其相同,不产生溢出;或两个异号数相加,不可能溢出。
CF=1,表示两个无符号数相加产生溢出,但结果并没有错,只是结果放不下。
CF=0,表示两个无符号数相加不产生溢出,结果正确;
减法:
OF=1,表示两个带符号数符号相反,进行减法运算,结果符号与减数相同,则运算结果发生溢出。
OF=0,表示两个带符号数符号相反,或两个带符号数符号相同,进行减法运算,运算结果不发生溢出;
CF=1,表示两个不带符号数进行减法运算,结果发生溢出。
即CF=1,表示减数>被减数,有借位;CF=0,表示被减数>减数,无借位;
3.用SAR指令与用IDIV指令做除法的区别:
用SAR指令做除法(对负数向下舍入):
MOVAX,81H;(AX)=-127
SARAX,1;(AX)=-64
用IDIV指令做除法(IDIV指令对负数向上舍入):
MOVAX,81H;(AX)=-127
MOVCL,2
IDIVCL;(AL)=-63,(AH)=-1
四、例题讲解
1.应用举例,求绝对值:
在内存中,从WANG开始存放100个带符号数,求各数的绝对值存于XIAO的开始单元。
LEASI,WANG
LEADI,XIAO
MOVCX,100
CHECK:
MOVAL,[SI]
ORAL,AL;(AL)内容不变,置标志
JNSNEXT;SF=0转NEXT
NEGAL;负数求补
NEXT:
MOV[DI],AL;送目标
INCSI
INCDI
DECCX
JNZCHECK
INT20H
2.将DX、AX组合起来构成32位寄存器向左移一位。
如下图所示:
SHLAX,1
RCLDX,1
3.测试(AL)5=?
0
MOVCL,3
ROLAL,CL
JNCZERO
……
ZERO:
……
……
思考:
采用ROR,CL=?
4.对存放在DX和AX中的双字长数据求补码。
MOVBX,DX
SHLBX,1
JNCEXIT
CLC
NOTAX
NOTDX
ADDAX,1
ADCDX,0
EXIT:
INT20H
思考:
能否使用NEG指令?
能否使用INC指令?
5.编制程序,完成双字乘法:
MULTCNDDW1234H;被乘数低字节
DW5678H;被乘数高字节
MULTPLRDW9ABCH;乘数
PRODUCTDW0;乘积
DW0
DW0
MOVAX,MULTCND
MULMULTPLR
MOVBX,DX
MOVPRODUCT,AX
MOVAX,MULTCND+2
MULMULTPLR
ADDAX,BX
ADCDX,0
MOVPRODUCT+2,AX
MOVPRODUCT+4,DX
6.假定48位二进制数存放在DX:
BX:
AX中,编制程序,让48位二进制数的乘4。
Shlax,1
Rclbx,1
Rcldx,1
Shlax,1
Rclbx,1
Rcldx,1
下面错误:
CLC
MOVCL,2
ROLAX,CL
RCLBX,CL
RCLDX,CL
五、练习
1.已知程序段定义如下:
MOVAX,1234
MOVCL,4
SHLAX,CL
INCAX
DECCL
RORAX,CL
MOVBX,4
MULBX
MOVBX,4
DIVBX
INT20
(1)每条指令执行后,AX寄存器中的内容是什么?
AX=1234AX=1234AX=2340AX=2341AX=2341AX=2468AX=2468AX=91A0AX=91A0AX=2468
(2)每条指令执行后,标志寄存器的各位标志等于什么?
(3)程序结束时,AX和DX的内容等于什么?
AX=2468DX=0000
2.编写一程序求双字数据的绝对值。
双字数据保存在DX和AX中,结果保存在BX和CX中。
TESTDX,DX
JSa
a:
NOTDX
NOTAX
ADDAX,1
ADCDX,1
MOVCX,AX
MOVBX,DX
MOVCX,AX
MOVBX,DX
Int20
3.编制程序,将DX和AX中的双字右移4位。
movch,4
go:
shrdx,1
rcrax,1
decch
jnzgo
4.编制程序,判断DL寄存器的低4位是否全为0?
是否有0?
判断AL寄存器中的数值是奇数还是偶数?
是否为4的倍数?
TESTDL,0FH
TESTAL,01H
TESTAL,03H
6.编制程序,用一条指令让AX寄存器清0;用一条指令使DX寄存器高3位为1,其余位保持不变;用一条指令使BL寄存器低4位为0,其余位保持不变;用一条指令,使SI和DI寄存器中对应位不相同的位置均置1;
ANDAX,00H
ORDX,0E0H
ANDBL,0F0H
XORSI,DI
7.从内存3000H开始的单元中顺序存放着40个同学某门课的考试成绩,试编写程序段求该班该门课的总成绩和平均成绩。
MOVCX,40
MOVSI,0
MOVAX,3000H[SI]
AGAIN:
ADCAX,3000H[SI+1];
INCSI
DECCX
TESTCX,CX
JNZAGAIN
MOVCL,20
SHRAX,20
INT20