微机原理课后习题解答_第1页
微机原理课后习题解答_第2页
微机原理课后习题解答_第3页
微机原理课后习题解答_第4页
微机原理课后习题解答_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机原理习题

第一章绪论

习题与答案

1.把下列二进制数转换成十进制数、十六进制数及BCD码形式。

(1)10110010B=

(2)01011101.1016=

解:

(1)10110010B=178D=B2H=(000101111000)BCD

(2)01011101.101B=93.625D=5D.AH

=(10010011.011000100101)BCD

2.把下列十进制数转换成二进制数。

(1)100D=

(2)1000D=

(3)67.21D=

解:

(1)100D=01100100B

(2)1000D=1111101000B

(3)67.21D=1000011.0011B

3.把下列十六进制数转换成十进制数、二进制数。

⑴2B5H=

⑵4CD.A5H=

解:

(1)2B5H=693D=001010110101B

(2)4CD.A5H=1229.6445D=010011001101.10100101B

4.计算下列各式。

(1)A7H+B8H=

(2)E4H-A6H=

解:

(1)A7H+B8H=15FH

(2)E4H-A6H=3EH

5.写出下列十进制数的原码、反码和补码。

(1)+89

(2)-37

解:

(1)[+89]原码、反码和补码为:01011001B

(2)[-37]原码=10100101B

[-37]反码=11011010B

[-37]补码=11011011B

6.求下列用二进制补码表示的十进制数

(1)(01001101)补=

(2)(10110101)补=

解:

(1)(01001101)补=77D

(2)(10110101)补=-75D

7.请用8位二进制数写出下列字符带奇校验的ASCII码。

(1)C:1000011(2)0:1001111

(3)M:1001101(4)P:1010000

解:

(1)C:01000011(2)0:01001111

(3)M:11001101(4)P:11010000

8.请用8位二进制数写出下列字符带偶校验的ASCII码。

(1)+:0101011(2)=:0111101

(3)#:0100011(4)>:0111110

解:

(1)+:00101011(2)=:10111101

(3)#:10100011(4)>:10111110

9.叙述CPU中PC的作用。

解:PC是CPU中的程序计数器,其作用是提供要执行指令的地址。

第二章微处理器体系与结构

习题与答案

1.8086/8088CPU由哪两大部分组成?请分别叙述它们的功能。

解:808的088CPU均由两个独立的逻辑单元组成,一个称为总线接口单元BIU(BusInterface

Unit),另一个称为执行单元EU(ExecutionUnit)。

总线接口单元BIU取指令时,从存储器指定地址取出指令送入指令队列排队;执行指令时,

根据EU命令对指定存储器单元或I/O端口存取数据。

执行单元EU任务是执行指令,进行全部算术逻辑运算、完全偏移地址的计算,向总线接口

单元BIU提供指令执行结果的数据和偏移地址,并对通用寄存器和标志寄存器进行管理。

2.8086/8088与传统的计算机相比在执行指令方面有什么不同?这样的设计思想有什

么优点?

解:总线接口部分和执行部分是分开的,每当EU执行一条指令时,造成指令队列空出2个

或空出一个指令字节时,BIU马上从内存中取出下面一条或几条指令,以添满他的指令队

列。这样,一般情况下,CPU在执行完一条指令后,便可马上执行下一条指令,不像以往8

位CPU那样,执行完一条指令后,需等待下一条指令。即EU从指令队列中取指令、执行指

令和BIU补充指令队列的工作是同时进行的。这样大大提高了CPU利用率,降低了系统都

对存储器速度的要求。

3.状态标志和控制标志有何不同?8086/8088的状态标志和控制标志分别有哪些?

解:808的088CPU设立了一个两字节的标志寄存器,共九个标志。其中标志位。、S、Z、A、

P、C是反映前一次涉及ALU操作结果的状态标志,D、I、T是控制CPU操作特征的控制标

志。

4.8086/8088CPU寻址存储器时,什么是物理地址?逻辑地址?它们之间有何关系?

解:808的088系统中每个存储单元都有一个物理地址,物理地址就是存储单元的实际地址

编码。在CPU与存贮器之间进行任何信息交换时,需利用物理地址来查找所需要的访问的

存储单元。逻辑地址由段地址和偏移地址两部分组成。

逻辑地址的表示格式为:段地址:偏移地址。知道了逻辑地址,可以求出它对应的物理地址:

物理地址=段地址X10H+偏移地址。

5.段寄存器CS=1200H,指令指针寄存器IP=FF00H,此时,指令的物理地址为多少?

指向这一物理地址的CS值和IP值是唯一的吗?

解:根据:物理地址=段地址X10H+偏移地址,指令的物理地址为21F00H。指向这一物理地

址的CS值和IP值不唯一。

6.8086CPU中信号和A0信号是通过怎样的组合解决存储器和外设端口的读/写的?

这种组合决定了8086系统中存储器偶地址体及奇地址体之间应该用什么信号区分?怎样区

分?

解:若存取一个字节的数据,总是用一个总线周期来完成该操作;若存取一个字,则依该字

是规则字还是不规则字需用一个或两个总线周期来完成。对规则字,只用一个总线周期来完

成16位数据的传送,而对于非规则字则用相邻两个总线周期来完成该字的存储操作,先取

其奇地址字节(即数据的低位字节),然后存取偶地址字节。在组成存储系统时,总是偶地

址单元的数据通过AD0-AD7传送,而奇地址单元的数据通过AD8-AD15传送,即通过总线

高字节传送。信号和A0信号控制存储器读写见下表:

操作A0使用的数据总线

存取规则字00AD15~AD0

传送偶地址的一个字10AD7~AD0

传送奇地址的一个字01AD15~AD8

存取非规则字01AD15-AD8(第一个总线周

期)

10AD7-AD0(第二个总线周期)

11为非法码

7.什么叫总线?为什么各种微型计算机系统中普遍采用总线结构?

答:总线是模块与模块之间传送信息的一组公用信号线。

总线标准的建立使得各种符合标准的模块可以很方便地挂在总线上,使系统扩展和升级

变得高效、简单、易行。因此微型计算机系统中普遍采用总线结构。

8.微型计算机系统总线从功能上分为哪三类?它们各自的功能是什么?

答:微型计算机系统总线从功能上分为地址总线、数据总线和控制总线三类。地址总线

用于指出数据的来源或去向,单向:数据总线提供了模块间数据传输的路径,双向;控制总

线用来传送各种控制信号或状态信息以便更好协调各功能部件的工作。

9.8086/8088CPU分为哪两个部分?如何协调工作?

答:EU是执行部件,主要的功能是执行指令和形成有效地址。BIU是总线接口部件,

与片外存储器及I/。接口电路传输数据,主要功能是形成实际地址、预取指令和存取操作数。

EU经过BIU进行片外操作数的访问,BIU为EU提供将要执行的指令。EU与BIU可分别独立

工作,当EU不需BIU提供服务时,BIU可进行填充指令队列的操作。

10.8086/8088CPU的地址总线有多少位?其寻址范围是多少?

答:8086/8088CPU的地址总线共20位,最大可寻址1MB空间。

11.8086/8088CPU使用的存储器为什么要分段?怎么分段?

答:8086/8088为16位CPU,其内部的ALU、相关的地址寄存器(如SP、IP以及BX、BP、

SI、DI)等都是16位的,因而对存储器地址的处理也只能是16位操作,即8086/8088的直接寻

址能力在64KB范围内。而实际上8086/8088有20条地址线,它的最大寻址空间为1MB。这就

产生了一个矛盾,即如何用16位的地址寄存器去表示一个20位的存储器物理地址?

实际使用的解决办法是:将1MB大小的存储空间分为若干"段",每段不超过64KB。这样,

一个20位的物理地址就可以用"16位段基址:16位偏移量”的形式(称为逻辑地址)来表示了,

其中段地址存放在8086/8088的段寄存器中。

12.8086/8088CPU中有几个通用寄存器?有几个变址寄存器?有几个指针寄存器?通

常哪几个寄存器亦可作为地址寄存器使用?

答:8086/8088CPU中共有:

8个16位的通用寄存器AX、BX、CX、DX、BP、SP、SLDI;

2个变址寄存器SI、DI;

2个指针寄存器BP、SP;

其中BX、BP、SLDI亦可作地址寄存器。

13.Intel8086与8088有何区别?

答:8086与8088的区别主要表现在以下几个方面:

第一、8086的指令队列可以容纳6个字节,每个总线周期在存储器中取出2个字节指令代

码填入队列。而8088只能容纳4个字节,且每个总线周期只能取出1个字节指令代码。

第二、8086外部数据总线宽度为16位,8088外部数据总线宽度只有8位。注意:8086和

8088外部数据总线的宽度不同将导致扩展主存储器及输入/输出接口时系统地址线和数据线

连接方式的不同。

第三、其他不同的引脚定义:(1)ADI5-ADO,在8086中为地址/数据复用,而在8088

中ADi5~AD8改为Ai5~A8只作地址线用:(2)34、28号引脚定义不同。

14.8086/8088CPU工作在最小模式时:当CPU访问存储器时,要利用哪些信号?当CPU

访问外设接口时,要利用哪些信号?

答:8086/8088CPU工作在最小模式时,若访问存储器,需用到以下信号:例/石、ALE、

DT/RsDEN、READY,BHE、WR、RD、ADo-ADis.Ai9/S6-Ai6/S3o若访问外设,需用

到以下信号:Mild,ALE、DT/R.DEN、READY,WR、RD、ADo~ADis«

15.试指出下列运算后的各个状态标志,并说明进位标志和溢出标志的区别:

(1)1278H+3469H

答:CF=OAF=1ZF=OSF=OOF=0PF=1

(2)54E3H—27A0H

答:CF=OAF=OZF=OSF=OOF=0PF=O

(3)3881H+3597H

答:CF=OAF=OZF=OSF=OOF=0PF=1

(4)01E3H-01E3H

答:CF=OAF=OZF=1SF=OOF=0PF=1

其中,进位标志CF用于判别无符号数运算是否超出数的表示范围,而溢出标志OF用

于判别带符号数运算是否超出数的表示范围。

奇偶标志PF只能判断结果低8位中"1"的个数为奇数还是偶数。

16.什么是逻辑地址?什么是物理地址?它们之间有什么联系?各用在何处?

答:逻辑地址由两个16位的部分即段基址和偏移量组成,一般在程序中出现的地址都

表示为逻辑地址形式;物理地址是一个20位的地址,它是唯一能代表存储空间每个字节单

元的地址,一般只出现在地址总线上。

由于8086/8088CPU中的寄存器只有16位长,所以程序不能直接存放20位的物理地

址,而必须借助逻辑地址,即用两个16位的寄存器来表示物理地址。他们之间的关系是:

物理地址=段基址*16+偏移量;另外,一个物理地址可对应多个逻辑地址。

17.设现行数据段位于存储器0B0000H〜0BFFFFH单元,DS段寄存器内容为多少?

答:DS段寄存器内容为0B000H。

18.在8086中,逻辑地址、偏移地址、物理地址分别指的是什么?

答:逻辑地址是在程序中对存储器地址的一种表示方法,由段基址和段内偏移地址两部

分组成,都是16位的二进制代码,如1234H:0088H。偏移地址是指段内某个存储单元相

对该段首地址的差值。物理地址是8086芯片引线送出的20位地址码,物理地址=段基址*16+

偏移地址,用来指出一个特定的存储单元。

19.给定一个存放数据的内存单元的偏移地址是20C0H,(DS)=0C0E0H,求出该内存

单元的物理地址。

答:物理地址:0C2EC0H,

20.808的088为什么采用地址/数据引线复用技术?

答:考虑到芯片成本和体积,808的088采用40条引线的封装结构。40条引线引出

808钝088的所有信号是不够用的,采用地址/数据线复用引线方法可以解决这一矛盾,从逻

辑角度,地址与数据信号不会同时出现,二者可以分时复用同一组引线。

21.怎样确定8086的最大或最小工作模式?

答:引线MN/K底的逻辑状态决定8086的工作模式,MN/加引线接高电平,8086被设

定为最小模式,MN/而引线接低电平,8086被设定为最大模式。

22.8086基本总线周期是如何组成的?

答:基本总线周期由4个时钟(CLK)周期组成,按时间顺序定义为Tl、T2、T3、T4。

23.在把8086的微计算机系统中,存储器是如何组织的?存储器是如何与处理器总

线连接的?丽市信号起什么作用?

答:8086为16位微处理器,可访问1M字节的存储器空间;1M字节的存储器分为两

个512K字节的存储体,分别命名为偶存储体和奇存储体;偶体型据线连接D7~D0,"体选”

信号接地址线A0;奇体的数据线连里)15~D8,"体选"信号接诉信号;A0信号有效时允

许访问偶体中的低字节存储单元,国正信号有效时允许访问奇体中的高字节存储单元,实

现8086的低字节访问、高字节访问及字访问。

24.有一个由20个字组成的数据区,其起始地址为61OAH:1CE7H。试写出该数据区首

末单元的实际地址PA。

首单元地址:610A0H+lCE7H=62D87H

末单元地址:62D87H+27H=62DAEH

25.有两个16位的字31DAH、5E7FH,它们在8086系统存储器中的地址为00130H和

00135H,试画出它们的存储器示意图。

地址内容

00130H

00131H

00132H

00133H

00134H

00135H

00136H

26.试说明8086CPU的控制引脚ALE的作用。

答:8086的低位地址线与数据线复用,为保证地址线维持足够的时间,需使用ALE信

号将低位地址线通过锁存器保存,以形成系统地址总线。

第三章80x86指令系统

习题与答案

1、指出下列指令中操作数的寻址方式(8086系统)。

(1)MOVAX,100(2)MOVAX,[100]

(3)MOVDL,[BP+SI](4)MOV[BX],CX

(5)MOVDX,[SI](6)MOV1234H[BX],DS

(7)MOV[DI+5678H],AL(8)MOV12[BP][DI],BH

(9)POPex(10)MOVAX,[BX+SI+10]

解:

目的操作数源操作数

(1)MOVAX,100寄存器寻址立即数寻址

(2)MOVAX,[100]寄存器寻址直接寻址

(3)MOVDL,[BP+SI]寄存器寻址基址变址寻址

(4)MOV[BX],CX寄存器间接寻址寄存器寻址

(5)MOVDX,[SI]寄存器寻址寄存器间接寻址

(6)MOV1234H[BX],DS寄存器相对寻址寄存器寻址

(7)MOV[DI+5678H],AL寄存器相对寻址寄存器寻址

(8)MOV12[BP][DI],BH相对基址变址寻址寄存器寻址

(9)POPCX隐含为堆栈寄存器寻址

(10)MOVAX,[BX+SI+10”寄存器寻址相对基址变址寻址

2、指出下列指令中操作数的寻址方式(80386系统)。

(1)MOV[EBX+12H],AX(2)MOV[EBP+EDI*2],EBX

(3)MOV[EBX*4],BX(4)MOVEDX,[EAX+ESI*8-12H]

解:

目的操作数源操作数

(1)寄存器相对寻址寄存器寻址

(2)基址比例变址寻址寄存器寻址

(3)比例变址寻址寄存器寻址

(4)寄存器寻址相对基址比例变址寻址

3、指出以下指令中,哪些指令是非法的,并说明为什么(8086系统)。

(1)PUSH1234H(2)MOVCS,AX

(3)INAX,300(4)MOVAX,[DX+12]

(5)MOVBX,[BX](6)MOVDS,1000H

(7)XCHGAL,AL(8)MOVAL,100H

(9)MOVDX,AL(10)LEABL,[BX+5]

(11)LEADX,BX(12)MOV[1000H],12H

(13)ADDAX,DS(14)SUB[0100H],BYTEPTR[0001]

(15)SHLBL,2(16)SHRCL,CL

(17)MULAL,BL(18)INT400

解:(1)非法,8086系统不允许PUSH指令的操作数为立即数;

(2)非法,MOV指令中CS不能作为目的操作数;

(3)非法,端口号大于OFFH;

(4)非法,DX不能出现在中括号口内;

(5)合法;

(6)非法,不能把立即数赋给段寄存器;

(7)合法;

(8)非法,源操作数大于OFFH,不能赋给8位寄存器AL;

(9)非法,源操作数是8位寄存器,目的操作数却是16位寄存器,不匹配;

(10)非法,LEA指令得到的是16位偏移量,但目的操作数是8位寄存器;

(11)非法,LEA指令的源操作数只能是存储器操作数;

(12)非法,指令存在歧义,无法确定传送的是字节还是字;

(13)非法,段寄存器不能参与算术运算;

(14)非法,源和目的寄存器不能同为存储器操作数;

(15)非法,在8086系统中,移位次数大于1时需要将移位次数存放到CL中;

(16)合法;

(17)非法,在8086系统中MUL指令没有双操作数的用法;

(18)非法,中断类型号大于OFFH。

4、指出以下指令中,哪些指令是非法的,并说明为什么(80386系统)。

(1)MOVAX,12[EBX][SI*16](2)RCREAX,10

(3)PUSH5678H(4)POP1000H

(5)MOV[EAX+EAX],EAX(6)MOVAL,[ESP+ESP*2]

(7)MOVBL,[AX+12](8)IMULAL,BL,12

解:(1)非法,比例因子只能是1、2、4、8,不能是16;

(2)合法;

(3)合法;

(4)非法,POP指令的目的操作数不能是立即数;

(5)合法;

(6)非法,ESP只能作为基址寄存器,不能作为变址寄存器;

(7)非法,在386系统中AX不能作为基址寄存器,也不能作为变址寄存器;

(8)合法。

5、假设(AX)=1234H,(BX)=5678H,(SP)=1000H,指出执行下面的程序段后,各相关寄存器及

堆栈段中的内容。

PUSHAX;(AX)=?,(BX)=?,(SP)=?,栈顶字节[SP]=?,栈顶第二字节[SP+1]=?

PUSHBX;(AX)=?,(BX)=?,(SP)=?,栈顶字节[SP]=?,栈顶第二字节[SP+1]=?

POPAX;(AX)=?,(BX)=?,(SP)=?,栈顶字节[SP]=?,栈顶第二字节[SP+1]=?

解:(AX)=1234H,(BX)=5678H,(SP)=OFFEH,栈顶字节[SP]=34H,栈顶第二字节[SP+1]=12H

(AX)=1234H,(BX)=5678H,(SP)=OFFCH,栈顶字节[SP]=78H,栈顶第二字节[SP+1]=56H

(AX)=5678H,(BX)=5678H,(SP)=OFFEH,栈顶字节[SP]=34H,栈顶第二字节[SP+1]=12H

6、假设A、B、C、D、X、Y为字节变量,AA、BB、YY为字变量,试利用算术运算指令编写

程序段,完成以下各算术运算题。

(1)计算YYGA+B*C,其中A、B、C都是无符号数;

(2)计算(AA+BB)/(C.D),商赋给X,余数赋给Y,其中AA、BB、C、D都是带符号数;

(3)计算YY-A-B)*C,其中A、B、C都是未组合BCD码。

解:

(1)MOVAL,B

MULC

ADDAL,A

ADCAH,0

MOVYY,AX

(2)MOVAX,AA

ADDAX,BB

MOVBL,C

SUBBL,D

IDIVBL

MOVX,AL

MOVY,AH

(3)MOVAL,A

SUBAL,B

AAS

MULC

AAM

MOVYYAX

7、利用移位指令编写程序段,实现以下运算。

(1)计算AXGAX*10,其中AX为无符号数;

(2)32位带符号数存放在寄存器DX和AX中,其中DX存放高16位,AX存放低16位计算

(DX,AX)G(DX,AX)*2O

(3)32位带符号数存放在寄存器DX和AX中,其中DX存放高16位,AX存放低16位计算

(DX,AX)6(DX,AX)/2

解:

(1)SHLAX,1

MOVBX,AX

SHLAX,1

SHLAX,1

ADDAX,BX

(2)SALAX,1

RCLDX,1

(3)SARDX,1

RCRAX,1

8、指出以下指令执行后,标志寄存器OF、SF、ZF、AF、PF、CF的状态。

(1)(AL)=OFFH,(BL)=2OH,执行指令:ADDAL,BL

(2)(AL)=01H,(BL)=02H,执行指令:CMPAL,BL

(3)(AL)=OFFH,执行指令:INCAL

(4)(AL)=O,执行指令:DECAL

(5)(AL)=OFOH,(BL)=04H,执行指令:IMULBL

(6)(AX)=1FOH,(BL)=08H,执行指令:DIVBL

(7)(AL)=12H,(BL)=34H,执行指令:TESTAL,BL

(8)(AL)=98H,执行指令:SALAL,1

解:

OFSFZFAFPFCF

(1)000001

(2)010111

(3)00111X

(4)01011X

(5)0—————0

(6)——————

(7)000——00

(8)100—11

注:0表示结果为0,1表示结果为1,x表示结果不变,一表示结果不确定。

9、在8086系统下,编写实现如下功能的程序段:

(1)从地址为80H的端口中读入一个字节;

(2)如果该字节最高位为"1",则将字节0FFH送到地址为81H的端口中,并退出程序;

(3)如果该字节最高位为"0",则转向第(1)步,继续循环扫描。

解:参考程序段:

AGAIN:INAL,80H

TESTAL,80H

JZAGAIN

MOVAL,OFFH

OUT81H,AL

10、我们知道,MOV指令并不能直接修改CS、IP的值,但事实上,我们还可以通过其他方

法来达到修改、的目的。试编写一个程序段,使该程序段运行后,

CSIP(CS)=0100H,(IP)=0000Ho

解:

方法一、利用段间返回指令RETF:

MOVAX,0100H

PUSHAX;段基址入栈

MOVAX,0

PUSHAX;偏移量入栈

RETF

方法二、利用JMP指令实现段间跳转,假设ADDR为双字变量:

MOVWORDPTRADDR,0;WORDPTRADDR<-偏移量

MOVWORDPTRADDR+2,0100H;WORDPTRADDR+2G段基址

JMPDWORDPTRADDR

11.写出能完成下述操作的指令。

(1)将立即数1234H送至DS寄存器。

(2)将存储单元3000H和内容送至4000H单元。

(3)将累加器AX与寄存器CX中的内容对调。

答案:⑴MOVAX,1234H

MOVDS,AX

(2)MOVAX,[3000H]

MOV[4000H],AX

(3)XCHGAX,CX

12.编程:将数据段中以BX为偏移地址的连续4单元的内容颠倒过来。

答案:MOVAL,[BX]

XCHGAL,[BX+3]

MOV[BX],AL

MOVAL,[BX+1]

XCHGAL,[BX+2]

MOV[BX+1],AL

13.将AX寄存器清零有4种方法,试写出这4条指令。

答案:MOVAX,OOH

SUBAX,AX

ANDAX,OOH

XORAX,AX

14.使用一条逻辑运算指令实现下列要求:(1)使AL高4位不变,低4位为0。(2)使AL

最高位置1,后7位不变。⑶使AL中的bit3、bit4变反,其余位不变。(4)测试判断CL

中的bit2,bit5,bit7是否都为1。

答案:(1)ANDAL,0F0H

(2)ORAL,80H

(3)XORAL18H

(4)TESTAL,0A4H

15.试分析下面的程序段完成什么功能。

MOVCL,4

SHLAX,CL

SHLBL,CL

MOVAL,BL

SHRDH,CL

ORAL,DH

答案:将AX中间8位,BX的低4位,DX的高4位组成一个新字存放在AX中。

16.若要将源串100个字节数据传送到目标串单元中去,设源串首址的偏移地址为

2500H,目标串首址的偏移地址为1400H,请编写程序实现以下功能。⑴完成源串到目

标串的搬移。(2)比较两串是否完全相同,若两串相同,则BX寄存器内容为0:若两串

不同,则BX指向源串中第一个不相同字节的地址,且该字节的内容保留在AL的寄存

器中。

答案:(1)CLD

MOVCX,100

MOVSI,2500H

MOVDI,1400H

REPMOVSB

⑵CLD

MOVCX,100

MOVSI,2500

MOVDI,1400

REPECMPSB

JZEQQ

DECSI

MOVBX,SI

MOVAL,[SI]

JMPSTOP

EQQ:MOVBX,0

STOP:HLT

17.设若标志寄存器原值为0A11H,(SP)=0060H,(AL)=4。下列几条指令执行后,

标志寄存器、AX、SP的值分别是多少?

PUSHF

LAHF

XCHGAH,AL

PUSHAX

SAHF

POPF

答:指令执行后标志寄存器的值为0411H,AX=0411H,SP=005EHo

18.假如在程序的括号中分别填入指令:

(1)LOOPL20

(2)LOOPNEL20

(3)LOOPEL20

试说明在三种情况下,当程序执行完后,AX、BX、CX、DX四个寄存器的内容分别是什

么?

BEGIN:MOVAX,01

MOVBX,02

MOVDX,03

MOVCXz04

L20:INCAX

ADDBX,AX

SHRDX,1

)

答案:(1)(AX)=5(BX)=16(CX)=0(DX)=0

(2)(AX)=3(BX)=7(CX)=2(DX)=0

(3)(AX)=2(BX)=4(CX)=3(DX)=1

19.变量N1和N2均为2字节的非压缩BCD数码,请写出计算N1与N2之差的指

令序列。

答案:MOVAX,0

MOVAL,N1

SUBAL,N2

AAS

MOVDL,AL

MOVAL,Nl+1

SBBAL,N2+1

AAS

MOVDH,AL

20.在已学的指令中,可实现累加器清0的单条指令有哪些?比较它们的功能。

答:(1)MOVAX,0;仅将累加器清0,不会影响任何标志位

(2)SUBAX,AX;累加器清0的同时影响所有状态标志,具体地有:ZF、PF

置1,CF、AF、SF、OF均清0

(3)ANDAX,0;将累加器清0,ZF、PF置1,CF、OF、SF清0

(4)XORAX,AX;将累加器清0,ZF、PF置1,CF、OF、SF清0

21.已知(DS)=2000H,有关的内存单元值为:(21000H)=00H,(21001H)=12H,

(21200H)=00H,(21201H)=10H,(23200H)=20H,(23201H)=30H,(23400H)=40H,

(23401H)=30H,(23600H)=60H,(23601H)=30H,符号COUNT的偏移地址为1200H。执行

下列指令后,寄存器AX、BX、SI的值分别是多少?

MOVBX,OFFSETCOUNT

MOVSI,[BX]

MOVAX,COUNT[SI][BX]

答:执行结果为(BX)=1200H,(SI)=1000H,(AX)=3040H。

22.设若内存单元DATA在数据段中偏移量为24C0H处,24C0H~24c3H单元中依次

存放着55H、66H、77H、88H。下列几条指令执行后,寄存器AX、BX、CL、SI、DS的值

分别是多少?

MOVAX,DATA

LEASI,DATA

MOVCL,[SI]

LDSBX,DATA

答:执行结果为(AX)=6655H,(BX)=6655H,(CL)=55H,(SI)=24C0H,(DS)

=8877H。

23.若(AX)=26D3H,(CX)=7908H,CF=1,执行下列指令后,寄存器AX、CX的

值分别是多少?CF=?0F=?

SALCH,1

RCRAX,CL

ROLAL,1

答:执行结果为(AX)=0A64CH,(CX)=0F208H,CF=OF=Oo

24.已知有程序段如下:

MOVAL,35H

MOVDL,AL

ANDDL,OFH

ANDAL,OFOH

MOVCL,4

SHRAL,CL

MOVBL,10

MULBL

ADDAL,DL

执行之后,AL的值等于多少?该程序段完成了什么功能?

答:程序段执行后(AL)=23Ho该程序段实现了将AL中的1个组合BCD码转换为

十六进制数并存回AL中的功能。

25.下面的程序执行后,DX、AX的值分别是多少?

;以X为首址的字单元中的数据依次为1234H、5678H

;以Y为首址的字单元中的数据依次为8765H、4321H

LEASI,X

LEADI,Y

MOVDX,[SI+2]

MOVAX,X

ADDAX,X

ADCDX,[Sl+2]

CMPDX,[Dl+2]

JLL2

CMPAX,Y

JMPEXIT

LI:MOVAX,1

JMPEXIT

L2:MOVAX,2

EXIT:......

答:执行结果为(AX)=2,(DX)=OACFOHo

26.设VAR字单元的值为x,Fl字单元的值为y,试编程按以下要求给y赋值:

-2x>30

y=/030>x>l

I—2x<l

答:一种可能的程序段实现如下:

MOVAX,V,AR;AX<-x

CMPAX,30

JGPLUS2;x>30,贝!]转PLUS2

CMPAX,1

JLMIN2;x<l,则转MIN2

MOVF1,0;302x21,y=0

JMPGO

PLUS2:MOVFl,2;y=2

JMPGO

MIN2:MOVFl,-2;y=-2或OOFEH

GO:.....后续处理

简析:本例中并未说明VAR字节单元是带符号数还是无符号数,读者在使用判断转

移指令时可任意选用。若当作带符号数,应使用JG、JL、JGE、JLE等指令,如参考程序;

若当作无符号数,则应使用JA、JB、JAE、JBE等指令。

第四章80x86汇编语言程序设计

习题与答案

1、指出以下数据定义伪指令所分配的字节数(8086系统)。

(1)DATA1DB10,?,'A'

(2)DATA2DW10DUP(2,3DUP(?),1)

(3)DATA3DB<HELLO,WORLD!','$'

(4)DATA4DWDATA4

解:(1)3字节;(2)100字节;(3)13字节;(4)2字节。

2、指出以下数据定义伪指令所分配的字节数(80386系统)。

(1)DATA1DF12,34,56

(2)DATA2DFDATA2

(3)DATA3DQ0,10DUP<

(4)DATA4DT0,1,2

解:(1)18字节;(3)6字节;(3)88字节;(4)30字节。

3、指出以下指令中哪些是无效的,并说明原因。

(1)ADDRDB$

(2)DATADBFOH,12H

(3)1_DATADW1234H

(4)@VARDWVARI;VARI为一个字节变量

(5)MOVAX,[10-VAR1];VARI为一个字变量

(6)MOVBX,[VAR2*2+1];VAR2为一个字变量

解:

(1)非法,地址计数器$是32位数;

(2)非法,以字母开头的16进制数应在前面加“0”,即应为“0F0H”;

(3)非法,变量名非法,不能以数字开头;

(4)合法;

(5)非法,地址表达式不能是“常数-地址”;

(6)非法,地址表达式不能出现乘法。

4、假设已定义数据段如下:

DATASEGMENT

ORG100H

DATA1DB10DUP(1,2,3)

DATA2DWDATA1,$

DATAENDS

且段寄存器DS已初始化为该数据段的段基址(假设段基址为1234H)。请指出以下指令执行

后,相应的寄存器中的内容。

(1)MOVAX,WORDPTRDATA1;(AX)=?

(2)MOVBX,DATA2;(BX)=?

(3)MOVCX,DATA2+2;(CX)=?

(4)MOVDX,OFFSETDATA2;(DX)=?

(5)MOVSI,SEGDATA1;(Sl)=?

(6)MOVDI,LENGTHDATA1;(Dl)=?

(7)MOVSP,TYPEDATA1;(SP)=?

(8)MOVBP,SIZEDATA2;(BP)=?

解:

(1)(AX)=0201H;(2)(BX)=O1OOH;(3)(CX)=0120H;(4)(DX)=O11EH;

(5)(SI)=1234H;(6)(DI)=000AH;(7)(SP)=OOO1H;(8)(BP)=OOO2H»

5、在8086系统下,编写完整程序,实现从键盘上输入8位二进制数,从显示器上显示相应

的16进制数,例如从键盘上输入“00010010”,应在显示器上显示“12H”。

解:参考程序:

DATASEGMENT

MSG1DB'Inputbinarynumber(ESCtoexit):7$'

MSG2DBOAHQDH,'Inputerror!',0AH,0DH,S

DATAENDS

OUTPUTMACROASC;定义输出一个字符的宏

MOVDL,ASC

MOVAH,2

INT21H

ENDM

CODESEGMENT

ASSUMECS:CODEZDS:DATA

MAINPROCFAR

PUSHDS

MOVAX,0

PUSHAX

MOVAX,DATA

MOVDS,AX

AGAIN:LEADX,MSG1

MOVAH,9

INT21H;提示输入信息

MOVCX,8;输入8位二进制数

MOVBL,0

L:MOVAH,1

INT21H

SHLBL,1

CMPAL,1BH;ESC键退出

JZDONE

CMPAL,'O';输入“0”

JZNEXT

CMPAL,T;输入ar

JNZERROR;输入其他则出错

INCBL

NEXT:LOOPL

OUTPUTOAH

OUTPUTODH

PUSHBX

MOVCL,4

SHRBL,CL

CALLTRAN;显示高4位对应的16进制数

POPBX

ANDBL,OFH

CALLTRAN;显示低4位对应的16进制数

OUTPUT'H'

OUTPUTOAH

OUTPUTODH

JMPAGAIN

ERROR:LEADXZMSG2

MOVAH,9

INT21H

JMPAGAIN

DONE:RET

MAINENDP

TRANPROCFAR

CMPBL,OAH

JBBELOW

ADDBL,7

BELOW:ADDBL,30H

OUTPUTBL

RET

TRANENDP

CODEENDS

ENDMAIN

6、在8086系统下,编写完整程序,实现从键盘上输入两个4位十进制数,从显示器上显示

这两个数之和,例如输入“1234”、“5678”,应在显示器上显示“6912”。

解:参考程序:

DATASEGMENT

MSG1DB'Inputthefirstnumber(ESCtoexit):7$*

MSG2DB'Inputthesecondnumber(ESCto

MSG3DB0AH,0DH,'Inputerrorllnputagain:',

DATAENDS

OUTPUTMACROASC;定义输出一个字符的宏

MOVDL,ASC

MOVAH,2

INT21H

ENDM

CODESEGMENT

ASSUMECS:CODE,DS:DATA

MAIN:MOVAX,DATA

MOVDS,AX

AGAIN:LEADX,MSG1

MOVAH,9

INT21H;提示输入第一个数

CALLINPUT;输入过程

PUSHBX

OUTPUTOAH

OUTPUTODH

LEADX,MSG2

MOVAH,9

INT21H;提示输入第二个数

CALLINPUT;输入过程

OUTPUTOAH

OUTPUTODH

POPAX;实现两个4位组合BCD码相加

ADDAL,BL;低8位相加

DAA;校正

MOVCL,AL;保存至CL

ADCAH,BH;高8位相加

MOVAL,AH;移至AL

DAA;校正

MOVAH,AL

MOVAL,CL

MOVBX,AX;最后结果放在BX中

JNCNEXT

OUTPUT;如果相加结果大于9999,则显示进位1

NEXT:PUSHBX

MOVCL,4

SHRBH,CL

ADDBH,30H

OUTPUTBH;显示千位数

POPBX

PUSHBX

ANDBH,OFH

ADDBH,30H

OUTPUTBH;显示百位数

POPBX

PUSHBX

MOVCL,4

SHRBL,CL

ADDBL,30H

OUTPUTBL;显示十位数

POPBX

ANDBL,OFH

ADDBL,30H

OUTPUTBL;显示个位数

OUTPUTOAH

OUTPUTODH

JMPAGAIN

INPUTPROCFAR;输入一个4位十进制数的过程

BEGIN:MOVCX,4

MOVBX,0

L:SHLBX,1

SHLBX,1

SHLBX,1

SHLBX,1;BX的值乘以16

MOVAH,1

INT21H;输入

CMPAL,1BH;ESC键退出

JZDONE

CMPAL,'01

JBERROR;非数字,出错

CMPAL,'9'

JAERROR;非数字,出错

SUBAL,30H

XORAH,AH

ADDBX,AX;将输入加到BX中

LOOPL

RET

ERROR:LEADXZMSG3

MOVAH,9

INT21H

JMPBEGIN

DONE:MOVAH,4CH

INT21H

INPUTENDP

CODEENDS

ENDMAIN

7、在8086系统下,编写完整程序,实现两个32位带符号数相乘。假设被乘数存放在以字

变量MUL1开始的连续4个字节中,乘数存放在以字变量MUL2开始的连续4个字节中中,

相乘结果存放在以字变量RES开始的连续8个字节中。

解:参考程序:

DATASEGMENT

MUL1DWOFFFFHQFFFFH;被乘数

MUL2DW5678H,1234H;乘数

RESDW4DUP(O);结果

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATA

MAINPROCFAR

PUSHDS

MOVAX,0

PUSHAX

MOVAX,DATA

MOVDS,AX

MOVCX,MUL1

MOVBBMUL1+2

MOVSI,MUL2

MOVDI,MUL2+2

TESTBP,8000H;被乘数是否为负数

JZNEXT1

NOTBP;为负数,则取反加1

NOTex

ADDCX,1

ADCBRO

NEXT1:TESTDI,8000H;乘数是否为负数

JZ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论