第二章80X86指令系2.docx

上传人:b****4 文档编号:11924977 上传时间:2023-04-16 格式:DOCX 页数:15 大小:92.86KB
下载 相关 举报
第二章80X86指令系2.docx_第1页
第1页 / 共15页
第二章80X86指令系2.docx_第2页
第2页 / 共15页
第二章80X86指令系2.docx_第3页
第3页 / 共15页
第二章80X86指令系2.docx_第4页
第4页 / 共15页
第二章80X86指令系2.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

第二章80X86指令系2.docx

《第二章80X86指令系2.docx》由会员分享,可在线阅读,更多相关《第二章80X86指令系2.docx(15页珍藏版)》请在冰豆网上搜索。

第二章80X86指令系2.docx

第二章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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1