26063-微机原理及接口技术—李干林—习题参考解答2015.08.10 下载本文

习题参考解答

1.1 什么是微处理器、微型计算机、微型计算机系统?

参考答案:将运算器和控制器集成在一块大规模集成电路芯片上作为中央处理部件,简称为微处理器;

以微处理器为核心,再配上存储器、接口电路等芯片,构成微型计算机;

微型计算机系统由硬件和软件系统两大部分组成:(1)硬件系统由微型计算机和外设组成的计算机实体;(2)软件系统是指为微型计算机运行的全部技术资料和各种程序,由系统软件和应用软件构成。

1.2 什么是微型计算机的三种总线?

参考答案:系统总线包含有三种不同功能的总线,即数据总线DB(Data Bus)、地址总线AB(Address Bus)和控制总线CB(Control Bus)。

“数据总线DB”用于传送数据信息。数据总线是双向三态形式的总线,即他既可以把CPU的数据传送到存储器或I/O接口等其它部件,也可以将其它部件的数据传送到CPU。

“地址总线AB”是专门用来传送地址的,由于地址只能从CPU传向外部存储器或I/O端口,所以地址总线总是单向三态的。 “控制总线CB”用来传送控制信号和时序信号。

1.3 评估微型计算机的主要技术指标有哪些?

参考答案:评估微型计算机的主要技术指标有:⑴CPU的字长,决定计算机内部一次可以处理的二进制代码的位数;⑵内存储器容量与速度,内存储器容量是衡量它存储二进制信息量大小的一个重要指标,内存储器的速度用存取周期来衡量;⑶CPU指令执行时间,反映CPU运算速度的快慢;⑷系统总线的传输速率等。

1.4 将下列十进制数分别转换为二进制、十六进制数。 ⑴ 35 ⑵ 130 ⑶ 0.625 ⑷ 48.25 参考答案:

⑴ 100011B,23H ⑵ 10000010B,82H ⑶ 0.101B,0.AH ⑷ 110000.01B,30.4H

1.5 将下列二进制数分别转换为十进制、八进制、十六进制数。 ⑴ 101101B ⑵ 11100110B ⑶ 110110.101B ⑷ 101011.011B 参考答案:

⑴ 45,55Q,2DH ⑵ 230,346Q,E6H ⑶ 54.625,66.5Q,36.AH ⑷ 43.375,53.3Q,2B.6H

1.6 写出下列十进制数的原码、反码、补码(分别采用8位二进制和16位二进制表示)。 ⑴ 38 ⑵ 120 ⑶ -50 ⑷ -89 参考答案:

⑴ 原码、反码、补码:00100110B,0000000000100110B ⑵ 原码、反码、补码:01111000B,0000000001111000B ⑶ 原码:10110010B,1000000000110010B 反码:11001101B,1111111111001101B 补码:11001110B 1111111111001110B ⑷ -89原码:11011001B,1000000001011001B 反码:11001101B,1111111111001101B 补码:11001110B 1111111111001110B

1.7 已知补码求出其真值和原码。

⑴ 21H ⑵ 93H ⑶ 45A6H ⑷ 0DA25H 参考答案:

⑴ 真值:+21H,原码:21H ⑵ 真值:-6DH,原码:EDH ⑶ 真值:+45A6H,原码:45A6H ⑷ 真值:-25DBH,0A5DBH

1.8 将下列十进制数转换为压缩和非压缩格式的BCD码。 ⑴ 12 ⑵ 55 ⑶ 147 ⑷ 368 参考答案:

⑴ 00010010B,00000001 00000010B ⑵ 01010101B,00000101 00000101B

⑶ 000101000111B,00000001 00000100 00000111B ⑷ 001101101000B,00000011 00000110 00001000B

1.9 下列十进制数算术运算,试用8位二进制补码计算,并用十六进制数表示运算结果,判断是否有溢出。

⑴ 35-45 ⑵ 80+50 ⑶ -70-60 ⑷ -20 +(-60) 参考答案:

各数的补码:[35]补 = 00100011B,[-45]补 = 11010011B, [80]补 = 01010000B,[50]补 = 00110010B, [-70]补 = 10111010B,[-60]补 = 11000100B, [-20]补 = 11101100B。

35+(-45)

80+50

-70+(-60)

-20+(-60)

00100011B +11010011B 11110110B CY =0, CS =0 OF=CY⊕CS = 0⊕0=0

没有溢出

01010000B +00110010B 10000010B CY =0, CS =1 OF=CY⊕CS = 0⊕1=1

有溢出

10111010B +11000100B 1 01111110B CY =1, CS =0 OF=CY⊕CS = 1⊕0=1

有溢出

11101100B +11000100B 1 10110000B CY =1, CS =1 OF=CY⊕CS = 1⊕1=0

没有溢出

⑴ 35-45=11110110B=-10,结果正确,没有溢出;

⑵ 80+50=10000010B=-126,结果不正确,有溢出,因为130超出了8位补码的表示范围上限+127;

⑶ -70-60=01111110B=-126,结果不正确,有溢出,因为-130超出了8位补码的表示下限-128;

⑷ -20 +(-60)=10110000B=-80,结果正确,没有溢出。

1.10 分别写出下列字符串的ASCII码(十六进制表示)。 ⑴ 3aB8 ⑵ eF10 ⑶ +5(0: ⑷ How are you? 参考答案:

⑴ 33614238H ⑵ 65463130H ⑶ 2B3528303AH ⑷ 486F770061726500796F753FH

2.1 8086CPU内部由哪两部分组成?它们的主要用途是什么? 参考答案:

8086CPU内部按功能分执行单元EU和总线接口单元BIU。

执行单元的功能:负责指令的执行。同时向BIU输出数据(操作结果),并对寄存器和标志寄存器进行管理。在ALU中进行16位运算,数据传送和处理均在EU控制下进行。

总线接口单元的功能:负责从内存或I/O 端口取指令、取操作数和保存运算结果。

2.2 8086/8088CPU 有哪些寄存器?各有什么用途?

参考答案:8086/8088 CPU 内部有 14 个 16 位的寄存器,按功能可分为:通用寄存器(8个)、段寄存器(4个)和控制寄存器(2个)。

⑴.通用寄存器组

EU中有4个16位的通用寄存器,即数据寄存器 AX、BX、CX、DX。

数据寄存器 AX、BX、CX、DX一般用来存放数据,但它们都有各自的特定用途。 AX称为累加器,是最常用的寄存器。它常用来存放算术逻辑运算中的操作数,而且一些操作要在 AX 中完成,如乘法操作和除法操作。此外,所有的 I/O 指令都使用累加器与外设端口交换信息。

BX称为基址寄存器。它常用来存放操作数在内存中数据段内的基地址。 CX称为计数器。在设计循环程序时一般使用该寄存器存放循环次数。

DX称为数据寄存器。在寄存器间接寻址的I/O指令中存放I/O端口地址;在做双字长乘除法运算时,DX与AX一起存放一个双字长操作数,其中DX存放高16位数。

⑵.指针和变址寄存器

8086/8088CPU中,有一组4个16位寄存器,它们是基址指针寄存器BP,堆栈指针寄存器SP,源变址寄存器SI,目的变址寄存器DI。这组寄存器存放的内容是某一段地址偏移量,用来形成操作数地址,主要在堆栈操作和变址运算中使用。

SP称为堆栈指针寄存器;BP称为基址指针寄存器; SI称为源变址寄存器;DI称为目的变址寄存器。

⑶.段寄存器 CS、DS、SS、ES

8086/8088 有 20 位地址总线,一共可以寻址 1M 的空间。而所有内部寄存器都是16位的,只能直接寻址64KB,因此采用分段技术来解决。将1MB的存储空间分成若干逻辑段,每段最长64KB,这些逻辑段在整个存储空间中可以浮动。

8086/8088定义4个独立的逻辑段,分别为:代码段、数据段、堆栈段和附加数据段,将程序代码或数据分别放在这 4 个逻辑段中。每个逻辑段的段地址分别放在对应的段寄存器中,代码或资料在段内的偏移地址由有关寄存器或立即数给出。

8086/8088 的 4 个段寄存器:

① CS称为代码段寄存器,用来存储程序当前使用的代码段的段地址(起始地址)。 ② DS称为数据段寄存器,用来存放程序当前使用的数据段的段地址。 ③ SS称为堆栈段寄存器,用来存放程序当前所使用的堆栈段的段地址。 ④ ES称为附加数据段寄存器,用来存放程序当前使用的附加数据段的段地址。 ⑷.指令指针寄存器 IP

IP称为指令指针寄存器,用来存放预取指令在代码段内的偏移地址。 ⑸. 标志寄存器F

F称为标志寄存器,是一个 16 位的寄存器,其中只用了 9 位。分别为 6 个状态标志位和 3 个控制标志位。

2.3 8086/8088CPU 中标志寄存器有几位状态位?有几位控制位?其含义各是什么? 参考答案:标志寄存器是一个 16 位的寄存器,其中只用了 9 位。分别为 6 个状态标志位和 3 个控制标志位。

⑴ 状态标志位

状态标志位用来反映算术和逻辑运算结果的一些特征。

① CF:进位标志位。当进行加减运算时,若最高位发生进位或借位则CF=1,否则 CF=0。

② PF:奇偶标志位。当运算结果的低 8 位中含有偶数个 1 时,PF=1,否则 PF=0。 ③ AF:辅助进位标志位。加法或减法运算时,若结果的低字节的低 4位向高 4 位有进位或借位,则 AF=1;否则 AF=0。

④ ZF:零标志位。若当前的运算结果为 0,则 ZF=1;否则 ZF=0。

⑤ SF:符号标志位。与运算结果的最高位相同,当运算结果的最高位为 1时,SF=1;否则为 0。

⑥ OF:溢出标志位。当运算结果超出了带符号数的范围,即溢出时,OF=1;否则 OF=0。⑵ 控制标志位

控制标志位有 3 个,用来设置控制条件来控制 CPU 的操作,由程序设置或清除。

① TF:跟踪标志位。

② IF:中断允许标志位。用来控制可屏蔽中断的控制标志。若 IF=1,允许 CPU 接受可屏蔽中断请求;若 IF=0,则禁止 CPU 回应可屏蔽中断请求。IF 的状态对非屏蔽中断及内部中断没有影响。

③ DF:方向标志位。控制串操作指令用的标志。

2.4 Intel 8086CPU 和 8088CPU 主要区别有哪些?

参考答案:8086CPU 与 8088CPU 的区别主要有以下 4 个方面: ⑴. 内部结构

8086 的指令队列有 6B,而 8088 仅有 4B。它们的执行单元 EU 完全相同,而总线接口单元 BIU 却不完全相同。8086CPU 内、外部的数据总线(DB)都为 16 位,8088 内部数据总线为 16 位,外部为 8 位。 ⑵. 引出线和内存组织

8086 有一条高 8 位数据总线允许引出线BHE,它可以看做一条附加的地址线,用来访问内存的高字节,而 A0 用来访问内存的低字节。 ⑶. 地址/数据复用线

8086 的地址/数据复用线是 16 位 AD15~AD0;而 8088 仅有 AD7~AD0 复用,A8~A15仅作为地址线使用。

⑷. 内存与 I/O 接口选通信号电平。

内存与 I/O 接口选通信号电平不同:8086 为M/IO ,即高电平进行存储器操作,低电平进行 I/O 操作;而 8088 则相反,为IO/M 。

2.5 逻辑地址和物理地址指的是什么?如果已知逻辑地址为 1200:0ABCDH,其物理地址为多少?

参考答案:

把用段地址和偏移地址表示存储单元的地址称为逻辑地址,段地址和段内偏移地址经20位地址加法器生成的20位地址称为物理地址。

已知逻辑地址为 1200:0ABCDH,其物理地址为 12000H + 0ABCDH= 1CBCDH。

2.6 若CS为3000H,试说明现行代码段可寻址的存储空间的范围。

参考答案:

可寻址的存储空间的范围:30000H+0000H ~30000H+FFFFH,既:30000H~3FFFFH

2.7 设现行数据段位于存储器10000H到1FFFFH存储单元,DS段寄存器内容为多少? 参考答案:一个逻辑段最大范围:0000H~FFFFH,因此DS段寄存器内容为:1000H。

2.8 设双字节12345678H的起始地址是1000H,试说明这个双字在存储器中如何存放? 参考答案:

DS:0000H DS:0001H

DS:0001H DS:0002H DS:0003H

78 56 34 12

2.9 已知堆栈段寄存器SS=4000H,堆栈指针SP=0100H,试将数据56789ABCH推入堆栈,画出进栈示意图。最后栈顶SP=? 参考答案: 最后栈顶SP=400FCH

SP→

400FC400FEBC 9A 78 56 40100H 56 78 9A BC

2.10 试求出下列运算后的各个状态标志。 ⑴ 1234H + 6789H ⑵ 23A5H – 65C2H 参考答案:

⑴ 1234H + 6789H=79BDH,CF=0,PF=1,AF=0,ZF=0,SF=0,OF=0; ⑵ 23A5H–65C2H=0BDE3H,CF=1,PF=0,AF=0,ZF=0,SF=1,OF=0。

2.11 8088CPU工作在最小模式时。

⑴ 当CPU访问存储器时,要利用哪些信号? ⑵ 当CPU访问I/O时,要利用哪些信号?

参考答案:⑴ IO/M=0,A19/S16 ~ A16/S3,A15 ~ A8,AD7 ~ AD0,ALE,读存储器时:

RD=0,DT/R=0(写存储器时:WR=0,DT/R=1),DEN。

⑵IO/M=1,A19/S16 ~ A16/S3,A15 ~ A8,AD7 ~ AD0,ALE,读IO端口时:RD=0,DT/R=0(写IO端口时:WR=0,DT/R=1),DEN。

2.12 简要说明 8086/8088 的指令周期、总线周期、机器周期和时钟周期有何不同。 参考答案:

(1) 指令周期由若干个机器周期组成,而机器周期时间又包含若干个时钟周期,总线周期一般由 4 个时钟周期组成。

(2) 机器周期和总线周期的关系是:机器周期指的是完成一个基本操作的时间,这个基本操作有时可能包含总线读/写,因而包含总线周期,但是有时可能与总线读/写无关,所以,并无明确的相互包含关系。

2.13 什么情况下插入TW等待周期?插入TW多少,取决什么因素? 参考答案:

在T3状态,CPU采样READY线,若READY信号无效,插入TW状态;插入TW

状态为一个至多个,直到READY信号有效,才进入T4状态。

2.14 什么情况下会出现总线的空闲周期? 参考答案:

只有在8086CPU和存储器或I/O接口之间传输数据时,CPU才执行总线周期,当CPU不执行总线周期时(指令队列6个字节已装满,EU未申请访问存储器),总线接口部件不和总线打交道,就进入了总线空闲周期Ti 。

在空闲周期中,虽然CPU对总线进行空操作,但是CPU内部操作仍然进行,即EU部件在工作。所以说,总线空操作是总线接口部件BIU对总线执行部件EU的等待。

3.1 指出下列传送类指令源操作数的寻址方式。

(1) MOV SI,120 (2) MOV [BX],DX (3) MOV AX,100[BX][DI] (4) MOV DI,[BX+100] (5) MOV AX,[1000H] (6) MOV AX,80H (7) MOV AX,[BX] (8) MOV CX,[BX][SI] 参考答案:

(1) 立即数寻址 (2) 寄存器寻址 (3) 基址加变址寻址 (4) 基址寻址 (5) 直接寻址 (6) 立即数寻址 (7) 基址寻址 (8) 基址加变址寻址

3.2 指出下列指令中存储器操作数物理地址的计算表达式。

(1) MOV SI,[BX] (2) MOV 8[DI],DX (3) MOV AX,[BP][SI] (4) ADD DI,[BX+100] (5) ADD AX,[1000H] (6) SUB AX,[BX+DI+80H] (7) ADD AX,ES:[BX] (8) DEC WORD PTR[SI] 参考答案:

(1) DS×16+BX (2) DS×16+DI+8 (3) SS×16+BP+SI (4) DS×16+BX+100 (5) DS×16+1000H (6) DS×16+BX+DI+80H (7) ES×16+BX (8) DS×16+DI

3.3 指出下列指令中的错误。

(1) MOV BX,AL (2) MOV CS,AX (3) MOV 100,CL (5) PUSH 1234H

(4) MOV [BX],[1000H]

(6) MOV CS ,1200H (8) INC [2000H] (10) OUT 258H,AX

(7) XCHG AH,12H (9) ADD [BX],10 参考答案:

(1) 源操作数和目的操作数寄存器类型不匹配 (2) 代码段寄存器CS不允许赋值

(3) 立即数不能做目的操作数 (4) 内存单元之间不能直接传送 (5) 立即数不能做堆栈指令操作数 (6) 代码段寄存器CS不允许赋值 (7) 立即数不能做交换指令操作数 (8) 字类型还是字节类型不明确 (9) 目的操作数类型不明确

(10) 端口地址大于8位二进制数,需要通过DX传送。

3.4 设(SP)=3000H,(AX)=1234H,(BX)=5678H,指出执行下列指令后相关寄存器的 内容。

PUSH AX PUSH BX POP AX POP BX 参考答案:

执行后,(AX)=5678H, (BX)=1234H, (SP)=3000H。

3.5 若AX=1234H,BX=3456H,当执行SUB AX,BX指令后,求AX和标志寄存器CF、AF、SF、ZF和OF标志位的值?

参考答案:

(AX)=0DDDEH,CF=1,AF=1,SF=1,ZF=0,OF=0。

3.6 设(AH)=0F6H,(AL)=90H,问执行SUB AH,AL指令后,AX中的值及标志寄存器CF、AF、SF、ZF、PF和OF标志位的值?

参考答案:

(AX)=6690H,CF=0,AF=0,SF=0,ZF=0,OF=0,PF=1。

3.7 设(BX)=1000H,(DI)=0050H,执行LEA BX,[BX+SI-0200H]后,(BX)=? 参考答案:

(BX)=0E50H

3.8 已知(DS)=2000H,(SS)=5000H,(AX)=0012H,(BX)=0340H,(CX)=0781H, (BP)=0035H,(SI)=0100H,(DI)=0300H,(20440H)=2104H,(20742H)=0E2AH,(20372H)=6FD3H,试求单独执行下列指令后的结果。

参考答案:

(1) MOV DL,[BX][SI] ;(DL)=04H (2) MOV [BP][DI],CX ;(50336H)=07H (3) LEA BX,100H[BX][DI] ;(BX)=0740H

MOV DX,2[BX] ;(DX)=0E2AH (4) SUB SI,CX ;(SI)=0F97FH (5) XCHG CX,32H[BX] ;(CX)=6FD3H

3.9 下列指令完成什么功能?

(1) NEG BX (2) MUL BL (3) DIV CL

(4) DEC AX

(6) INC DL

(8) SAR AL,CL (10) CBW

(5) SBB AX,CX

(7) ADC AX,1000H (9) DAA 参考答案:

(1) 将BX中的内容求补(正数变负数或负数变正数,绝对值不变)后送回BX。 (2) BL×AL,结果送AX。

(3) AX/CL,商存于AL,余数存于AH。 (4) AX中值减1,结果送回AL。

(5) AX中的值减去BX中的值再减去CF中的值,结果送回AX。 (6) DL中的值当无符号数加1,结果送回DL。

(7) AX中的内容加上1000H后,再加上CF的值,结果送回AX。

(8) AL中的值向右移,移动位数为CL中的值,AL左边补充符号位的值。 (9) 将AL中的两位BCD码加法运算的结果调整为两位压缩型十进制数,仍保留在AL中。

(10) 将AL的最高有效位扩展至AH。

3.10 已知AX=3405H,BX=0FE1H,CX=0002H,DX=2A3EH,求下列每条指令执行后目的操作数的结果。

(1) AND AH,BL (2) OR CL,20H (3) NOT DX (5) TEST AL,80H

(4) XOR CX,0FE3H

(6) CMP BX,OF123H (8) SAR AL,CL (10) ROR DX,CL

(7) SHR DX,CL (9) RCL AL,1

参考答案:

(1) (AH)=02H (2) (CL)=22H (3) (DX)=0D5B1H (5) (AL)=05H

(4) (CX)=0FE1H

(6) (BX)=OFE1H (8) (AL)=01H (10) (DX)=8A8FH

(7) (DX)=0A8FH (9) (AL)=0AH

3.11 设(AX)=54D1H,执行下列程序段指令后,求相应的结果。 MOV BL,AH 参考答案: MOV CL,AL

ADD BL,100 ;BL=0B8H XCHG AL,BL ;AL=0B8H SUB AL,CL ;AX=54E7H JS HH AND AL,0FH

HH: ADC AH,BL ;AX=26E7H BL=0D1H

3.12 设(AX)=1023H、(BX)=0430H,执行下列程序段指令后,求相应的结果。 MOV CL,2 参考答案: SHR AH,CL ;AX=0423H ADD BX,AX ;BX=0853H JMP NEXT

MUL BL

NEXT:OR AX,BX ;AX=0C73H HLT

3.13 已知当前数据段中有一个十进制数字0~9的7段ASCII表,其数值依次为30H~39H,其首地址为2000H。要求用XLAT指令将十进制数46转换成相应的7段代码值,存到AX寄存器中,试写出相应的程序段。 参考答案:

MOV BX, 2000H MOV AL,4 XLAT MOV AH,AL MOV AL,6 XLAT HLT

3.14 设有程序段: DATA SEGMENT

STRING DB ‘Today is saturdy!’ N EQU $-STRING DATA ENDS

试用字符串指令完成以下功能:

⑴ 把该字符串传送到附加段中偏移量为CHAR1开始的内存单元中;

⑵ 检查该字符串是否有“!”字符,若有将找到的第一个“!”用“?”将其替换。 参考答案: ⑴ CLD MOV CX,N LEA SI,STRING LEA DI,CHAR1 REP MOVSB ⑵ LEA DI,STRING

MOV AL,‘!’ MOV CX,N CLD

REPNE SCASB MOV AL,‘?’ MOV [DI],AL

3.15 阅读程序段,说明其完成的功能。 MOV CX,100 MOV DL,0 MOV BX,1000H LP1:MOV AL,[BX] CMP AL,0 JNZ LP2 INC DL

LP2:INC BX

LOOP LP1

MOV [BX],DL HLT 参考答案:

程序段的功能:统计从数据段偏移地址1000H的100个字节单元内容0的个数,并将统计 结果存入数据段偏移地址为1064H的内存单元。

3.16 试编程完成(AL)×7/4的程序段,AL中的数为有符号数。 参考答案:

MOV BL,7 IMUL BL MOV CL,2 SAR AX,CL

3.17 使用最少指令,实现下述要求的功能。 ⑴ BL的高4位置1; ⑵ AL的低4位取反;

⑶ DL中的高4位移到低4位,低4位移到高4位; ⑷ AH的低4位移到高4位,低4位清0。 参考答案: ⑴ OR BL,0F0H; ⑵ XOR AL,0FH; ⑶ MOV CL,4 ROR AH,CL; ⑷ MOV CL,4 SHL AH,CL。

3.18 在DS:2000H为首址的内存数据段中,存放了10个16位带符号数,试编程将其中最大和最小的带符号数找出来,分别存放到以DS:3000H和DS:3002H内存单元中。 参考答案:

MOV SI,2000H

MOV AX,[SI] ;AX中存放最大数 MOV BX,[SI] ;BX中存放最小数 MOV CX,9 FIND:ADD SI,2 MOV DX,[SI] CMP AX,DX JG LOP1 MOV AX,DX L0P1:CMP BX,DX JL LOP2 MOV BX,DX LOP2:LOOP FIND MOV SI,3000H

MOV [SI],AX ADD SI,2 MOV [SI],BX HLT

3.19 设中断类型N=8,中断服务程序的起始地址为3000:0100H,它在中断向量表中如何存放?

参考答案:

N×4=8×4=32=20H DS:0020H存放00H; DS:0021H存放01H; DS:0022H存放00H; DS:0023H存放30H。

4.1 下列变量各占多少字节?

M1 DW 12,78A3H

M2 DB 3 DUP(?),0AH,0DH,‘$’ M3 DB ‘HOW DO YOU DO?’

参考答案:

变量M1占4个字节,变量M2占6个字节,变量M3占14个字节

4.2 某程序设置的数据区如下:

DATA SEGMENT ORG 1000H

D1 DB 11,2DH,56H D2 DW 32,0ABD3H,7634H D3 DW D1 D4 DB $-D1 D5 DB 4 DUP(?) D6 DB ‘34FS’

DATA ENDS

画出该数据段内容再内存中存放形式(要求用十六进制补码表示,按字节组织)。 参考答案:

D1 0B D2 D3 D4 D5 2D 56 20 00 D3 AB 34 76 00 10 0B ? ? ? ? 33 34 46 53 D6

4.3 下面的数据定义,各条MOV指令执行后,有关寄存器的内容是什么? DATA1 DB ? DATA2 DW 5 DUP(?) DATA3 DB ‘1234’ MOV AX,TYPE DATA1 MOV BX,SIZE DATA2 MOV CX,LENGTH DATA3 参考答案: (AX)=1,(BX)=10,(CX)=4

4.4 假设程序中的数据定义如下:

DATA1 DW ?

DATA2 DB 10 DUP(?) DATA3 DD ? DATA4 EQU $-DATA1

求DATA4的值为多少?表示什么意义? 参考答案:

DATA4的值为2+10+4=16,表示下一个内存单元距离DATA1有16个字节。

4.5 设平面上有一点P的直角坐标(x,y),编程实现:如果P点落在第I象限,则K=I;如果P点落在坐标轴上,则K=0。

参考答案: X DW ? Y DW ? K DB ? ? MOV BX,X MOV DX,Y CMP BX,0 JZ K0 CMP DX,0 JZ K0 JG K12 CMP BX,0 JG K4

MOV K,3 ;在第三象限 JMP EXIT

K0:MOV K,0 ;在坐标轴 JMP EXIT

K1:MOV K,1 ;在第一象限 JMP EXIT

K4:MOV K,4 ;在第四象限

JMP EXIT K12:CMP BX,0 JG K1

MOV K,2 ;在第二象限 JMP EXIT EXIT: MOV AH,4CH INT 21H

4.6 编程把字符串CHAR11中小写字母转换为对应的大写字母,并存放在CHAR22开始的内存单元。

CHAR11 DB ‘asdfghjkl’ COUNT DB $-CHAR11 CHAR22 DB COUNT DUP(?) 参考答案:

CHAR11 DB ‘asdfghjkl’ COUNT DB $-CHAR11 CHAR22 DB COUNT DUP(?) ? MOV CX,COUNT MOV BX,0

LOP:MOV DL,CHAR11[BX] SUB DL,20H MOV CHAR22[BX],DL INC BX LOOP LOP

4.7 字符串CHAR33存放有50个字节字符,设其中有字符M,编程查找第一个M字符相对字符串CHAR33起始地址的距离,并将其存放到LENTH11字节单元。

参考答案:

CHAR33 DB 50 DUP(?)

LENTH11 DW ? ? MOV CX,50 LEA DI,CHAR33 NN:MOV AL,[DI] CMP AL,‘M’ JZ FIND0 LOOP NN JMP EXIT

FIND0:LEA SI,CHAR33

SUB DI,SI MOV LENTH11,DI EXIT: MOV AH,4CH INT 21H

4.8 编程计算:(A*C-B)/B,其中A、B、C均为字节变量有符号数。 参考答案: A DB 20H B DB 93H C DB 45H D DW ? ? MOV AL,A MOV BL,C IMUL BL MOV BX,AX MOV AL,B CBW SUB BX,AX MOV AX,BX

MOV CL,B

IDIV CL ;结果在AX中,AL中为商,AH中为余数

4.9 编程查找出BUF数据区中带符号数的最大数和最小数,存放在MAX和MIN存储单元中。

参考答案:

BUF DB 12H,45H,0A2H,?,48H N EQU $-BUF MAX DB ? MIN DB ? ? LEA SI,BUF MOV CX,N-1 MOV BL,[SI] MOV AL,BL L1:INC SI MOV DL,[SI] CMP DL,BL JGE L2

MOV BL,DL ;BL中的值为两个数比较的小值 JMP NEXT L2:CMP DL,AL JLE NEXT

MOV AL,DL ;AL中的值为两个数比较的大值

NEXT:LOOP L1 MOV MAX,AL MOV MIN,BL

4.10 从自然数1开始累加,直到累加和大于2000为止,统计被累加的自然数的个数,并把统计的个数送入NUMBER单元,把累加和送入SUM单元。

参考答案: DATA SEGMENT NUMBER DW ? SUM DW ? DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,0 MOV BX,0 LP:INC BX ADD AX,BX CMP AX,2000 JBE LP MOV NUMBER,BX MOV SUM,AX MOV AH,4CH INT 21H CODE ENDS END START

4.11 编写一个子程序,功能是将一个字节的BCD码转换成二进制数。 参考答案: ;名称:BCD2BIN

;功能:将一个字节的BCD码转换成二进制 ;所用寄存器:CX

;入口参数:AL存放两位BCD码 ;出口参数:AL存放二进制数 ;调用其它子程序:无

BCD2BIN PROC NEAR(或FAR) PUSH CX MOV CH,AL

AND CH,OFH ;存低8位 MOV CL,4

SHR AL,CL ;高8位右移4位后乘10 MOV CL,10 MUL CL

ADD AL,CH ;高8位加低8位 POP CX RET BCD2BIN ENDP

4.12 设计一个软件延时子程序,延时时间约为1s,假设系统时钟为8MHz。 参考答案:

分析:软件延时可用指令执行消耗时间来达到,延时时间主要取决于循环体指令。从手册查得PUSHF和POPF指令分别为10和8个时钟节拍,LOOP 指令为3.4个时钟节拍,系统时钟为8MHz,每个节拍需要0.125μs,因此延时1ms计算循环次数:

X=

1ms≈374次

(10?8?3.4)*0.125?s延时1s再循环1000次。 ;名称:DELAY1S ;功能:延时1S子程序 ;所用寄存器:BX、CX

;入口参数:无, 出口参数:无 ;调用其它子程序:无 DELAY1S PROC NEAR PUSH BX PUSH CX MOV BX,1000

LP1:MOV CX,374 LP2:PUSHF POPF

LOOP LP2 ;延时1ms DEC BX JNZ LP1 POP CX POP BX

RET ;延时1S DELAY1S ENDP

4.13 编写程序,在屏幕上显示字符串“This is a sample program.”。 参考答案: DATA SEGMENT

DA1 DB ‘This is a sample program.’,0DH,OAH,‘$’ DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA MOV DS,AX MOV AH,9 LEA DX,DA1 INT 21H MOV AH,4CH INT 21H CODE ENDS END START

4.14 编程实现:从键盘中输入学生的姓名 XYZ,当按任意一个键时,屏幕上显示出:HELLO! XYZ

参考答案: CHAR1 DB 20 DB ?

DB 20 DUP(?) CHAR2 DB ‘HELLO!’,‘$’ ?

START: LEA SI,CHAR1 MOV AH,0AH

INT 21H ;输入姓名存CHAR1+2单元 MOV AH,8

INT 21H ;等待按键 LEA DX,CHAR2 MOV AH,9

INT 21H ;显示CHAR2开始的内容 LEA BX,CHAR1+2 ;显示姓名首地址 MOV CL,[BX-1]

MOV CH,0 ;CX中为输入姓名字符个数 LP: MOV AH,2 MOV DL,[BX] INT 21H INC BX

LOOP LP ;逐个显示名字的字符

5.1 DRAM 为什么要刷新?

参考答案:

动态随机存储器DRAM依靠电容来保存信息。为了不丢失信息,需要再电容放电丢失信息前,把数据读出来再写进去,相当于再次给电容充电,以维持所记忆的信息,这是动态刷新。

5.2 设有一个具有13位地址和8位字长的存储器,问: ⑴ 存储器能存储多少字节信息?

⑵ 如果存储器由1K×4位RAM芯片组成,共计需要多少片? ⑶ 需要用几位高位地址做片选译码来产生芯片选择信号? 参考答案:

⑴ 存储器能存储2 字节信息。

⑵ 13位地址和8位字长是8K×8位,如果存储器由1K×4位RAM芯片组成,共计需要16片。 ⑶ 需要用A10 、A11 、A12 位高位地址做片选3-8译码来产生芯片选择信号。

5.3 设有16 片256K×1 位的SRAM 芯片。 (1) 只采用位扩展方法可构成多大容量的存储器?

(2) 如果采用8 位的字节编址方式,该存储器需要多少地址线? 参考答案:

(1)256K×16位存储器;(2)构成的存储器是512K×8位,2=512K,则需要19根地址线。

5.4 设有若干片32K×8 位的SRAM 芯片,设计一个总容量为64K 的16 位存储器, 需要多少片32K×8 位的SRAM 芯片?

参考答案:(64K×16)/(32K×8)=4,需要4片

5.5 如果某存储器分别有8、12、16位地址线,对应的存储单元由多少? 参考答案:对于的存储单元分别是:256个、4K个、64K个。

5.6 已知ROM的容量为8K×8,设它的首地址为30000H,那么最后一个单元地址是多少? 参考答案:最后一个单元地址是: 30000H + 1FFFH = 31FFFH

5.7 设有若干片256KB 的SRAM 芯片,构成2048KB 存储器。

(1) 需要多少片256KB SRAM 芯片? (2) 构成2048KB 存储器需要多少地址线? 参考答案:

(1) 需要2048/256=8片256KB SRAM 芯片;

(2) 2048K=2,构成2048KB 存储器需要21地址线。

21

19

13

5.8 CPU有16根地址线,即A15 ~A0 ,计算图5.19所示的片选信号CS1和CS2指定的基地址范围。

A15 CPU A12 ≥1 & CS1 CS2

参考答案:

CS1CS2低电平有效需要A15 ~A12 全是低电平低电平有效需要A15 ~A12 全是高电平1值,0值。

A15 ~A12 :1111B=0FH,A11 ~A0变化范围:000H~FFFH。 因此CS1地址范围:F000H~FFFFH。

A15 ~A12 :000B=0H,A11 ~A0变化范围:000H~FFFH。 因此CS1地址范围:0000H~0FFFH。

6.1 为什么外设要通过接口电路和主机系统相连? 参考答案:

微机CPU和外设信号存在速度差异、信号电平差异及驱动能力差异、信号形式差异(CPU只能处理数字信号,而外设有数字量、模拟量、非电量等)、时序差异等问题,这些都需要通过在 CPU 与外设之间设置相应的 I/O 接口电路来予以解决。接口电路具有:速度协调、数据锁存、三态缓冲、数据转换、中断控制功能等。

6.2 什么叫端口?通常有哪几类端口?计算机对 I/O 端口编址时通常采用哪两种方法?在 8086/8088 系统中,用哪种方法对 I/O 端口进行编址?

参考答案:

端口是接口电路中能被 CPU 直接访问(读/写)的寄存器,每个端口都有一个地址。一般说来,I/O 接口电路中有 3 种端口:数据端口,状态端口和控制端口。

I/O 端口地址通常有两种编址方式:一种是将内存地址与 I/O 端口地址统一编在同一

地址空间中,称为存储器映像的 I/O 编址方式;另一种是将内存地址与 I/O 端口地址分别编在不同的地址空间中,称为 I/O 端口单独编址方式。在 8086/8088 系统中,采用I/O端口单独编址方式。

6.3 CPU与外设间数据传送的控制方式有哪几种?它们各自的优缺点是什么? 参考答案:

传送方式有:无条件传送方式、查询传送方式、中断传送方式、以及 DMA 方式等。 ⑴ 无条件传送是一种最简单的程序控制传送方式,CPU I/O 前不需要查询外设的工作状态,任何时候都可访问。优点是简单,缺点是只有像开关、发光二极管、继电器、步进电动机等外设在与 CPU 进行信息交换时才可以采用无条件传送方式。

⑵ 查询传送方式在执行 I/O 操作之前,需要通过程序对外设的状态进行检查。当所选定的外设已准备“就绪”后,才开始进行 I/O 操作。其优点是使CPU能和不同速度的外设传送数据,缺点是需要占用CPU资源。

⑶ 中断传送方式是指外设就绪时,主动向CPU发出中断请求,从而使CPU去执行相应的中断服务程序,完成与外设间的数据传送。采用中断方式传送,数据传送实时性好,另外在外设未准备就绪时,CPU还可以处理其他事务,工作效率高。

⑷ DMA方式又叫直接存储器存取方式,是在外设和存储器之间开辟直接的数据传送通路,在存储器和外设之间的通路上直接传送数据。DMA方式的实现主要是靠硬件(DMA 控制器)实现的,不必进行保护现场等一系列额外操作,优点是减轻了 CPU 的负担,特别适合于高速度大批量数据传送的场合。缺点是要增设 DMA 控制器,硬件电路比其它方式更为复杂。

6.4 结合指令简述下图CPU 与外设以查询方式输出数据的接口电路工作过程(设地址译码数据口地址为60H,状态口地址为61H)。

参考答案:工作过程:当输出装置把CPU输出的数据输出以后,发出一个ACK信号,使D触发器置0,即使BUSY线为0,当CPU输入这个状态信息后(经G3 至D7 ),知道外设为“空”,于是执行输出指令。待执行输出指令后,由地址信号和M/IO及WR相“与”,经G1 发出选通信号,把在数据总线上的输出数据送至锁存器;同时,触发D触发器为“1”状态,它一方面通知外设输出数据已准备好,可以执行输出操作,另一方面在数据由输出装置输出以前,一直保持为1,告知CPU(CPU通过读状态端口知道)外设BUSY,阻止CPU输出新的数据。

查询输出部分的程序如下:

POLL: IN AL, 61H ;查状态端口中的状态信息D7 TEST AL, 80H

JNE POLL ;D7 =1,即忙线=1,则循环再查 MOV AL, [SI] ;若外设空闲,则由内存读取数据 OUT 60H, AL ;输出到60H地址端口单元

6.5 什么是中断向量表?在8086/8088的中断向量表中有多少不同的中断向量?若已知中断类型号是10,说明如何在中断向量表中查找中断向量?

参考答案:

8086/8088的256个中断处理子程序的入口地址统一存放在内存的一个固定区域。每个中断处理子程序的入口地址占用4字节存储单元,低地址的两字节存放中断处理子程序入口地址的偏移量(IP),高地址的两字节存放段地址(CS)。这些中断处理子程序的入口地址,称

为中断向量。256个中断向量要使用256×4=1024个字节,这1024字节所占的内存区域,称中断向量表。

每个中断服务程序入口地址在中断向量表中的位置可由“中断类型码×4”计算出来。若中断类型码n=10,则其中断向量存放在中断向量表00028H(10×4=40=28H)开始的连续4个单元中。

6.6 8086/8088的内部中断的特点? 参考答案:

内部中断具有如下特点:

(1) 内部中断的除法出错中断、溢出中断、INT n中断优先级均高于外部中断,外部中断中NMI级别高于INTR,只有单步中断优先级最低且低于外中断。 (2) 除单步中断外其他内部中断均无法禁止。

(3) 由于中断类型码已确定,所以不用执行中断响应周期取中断类型码。 (4) 由于内部中断均处于程序的固定位置处,所以无随机性。

6.7 8086CPU响应可屏蔽中断的过程。 参考答案:

当8086CPU的INTR引脚有中断申请输入时,如果标志寄存器的IF=1,CPU响应可屏蔽硬件中断,并在INTA引脚输出2个低电平,时序如下图所示。

第1个INTA总线周期 空闲状态 第2个INTA总线周期 T1 T2 T3 T4 T1 T1 T1 T2 T3 T4 CLK ALE INTA AD7 ~AD0 中断类型号 8086的中断响应时序由两个连续的INTA中断响应总线周期组成,中间由空闲时钟周期隔开。在两个总线周期中,INTA输出为低电平,以响应这个中断。

第1个INTA总线周期表示有一个中断响应正在进行,这样可以使申请中断的设备有时间去准备在第2个INTA总线周期内发出中断类型号。在第2个INTA总线周期中,中断类型号必须在16位数据总线的低8位(AD0 ~AD7 )上传送给8086。因此,提供中断类型号的中断接口电路8259A的8位数据线是接在8086的16位数据线的低8位上。在中断响应总线周期期间,经DT/R和DEN的配合作用,使得8086可以从申请中断的接口电路中取得一个单字节的中断类型号。得到中断向量,进入中断服务子程序。

7.1 设8255A的控制口地址为83H,要求A口工作在方式0输出,B口工作在方式0输入,C口高4位输入,低4位输出,试编写8255A的初始化程序。 参考答案:

初始化程序:

MOV AL,10001010B OUT 83H,AL

7.2 下图当A7A6A5=111,A4A3A0=100时,Y4=0,选中8255A。求8255A四个端口的8位地址;电路功能为开关K7~K0随时控制LED7~LED0的亮灭,试编写程序实现功能。

参考答案:

4个端口地址:F0H、F2H、F4H和F6H,

初始化程序:

MOV AL,10010000B OUT 0F6H,AL HH:IN AL,0F0H OUT 0F2H,AL JMP HH

7.3 编一初始化程序,使8255A的PC2 端输出一个负跳变。如果要求PC6 端输出一个负脉冲,则初始化程序又是如何?设8255A控制口地址为63H。 参考答案:

8255A的PC2 端输出一个负跳变程序: MOV AL,00000101B

OUT 63H,AL ;PC2输出高电平 HH1: MOV CX,10

LOOP HH1 ;延时等待 MOV AL, 00000100B

OUT 63H,AL ;PC2输出低电平

PC6 端输出一个负脉冲程序: MOV AL,00001101B

OUT 63H,AL ;PC6输出高电平 HH2: MOV CX,10

LOOP HH2 ;延时等待 MOV AL, 00001100B

OUT 63H,AL PC6输出低电平 HH3: MOV CX,10

LOOP HH3 ;延时等待 MOV AL,00001101B

OUT 63H,AL ;PC6输出高电平

7.4 某系统中8253芯片的通道0~通道2和控制口端口地址分别为0F000H~0F003H,定义通道0工作在方式3,CLK0=5MHz,要求OUT0=1kHz方波;通道2工作在方式2,用

OUT0作为计数脉冲,计数值为1000。请编写初始化程序。 参考答案:

通道0的计数值:5MHz/1kHz=5000 MOV AL,00110110B MOV DX,0F003H

OUT DX,AL ;通道0初始化 MOV AX,5000 MOV DX,0F000H OUT DX,AL MOV AL,AH

OUT DX,AL ;通道0送计数值 MOV AL,10110100B ;通道2初始化 MOV DX,0F003H OUT DX,AL MOV AX,1000 MOV DX,0F002H OUT DX,AL MOV AL,AH

OUT DX,AL ;通道2送计数值

7.5 设8253的通道0~通道2和控制口端口地址分别为300H,302H,304H,306H,定义通道0工作在方式3,CLK0=2MHz。要求通道0输出1KHz的方波。试编写初始化程序,并画出硬件连线示意图。 参考答案:

计数初值:2MHz/1KHz=2000

初始化程序:

MOV DX,306H MOV AL,00110110B OUT DX,AL MOV AX,2000

MOV DX,300H OUT DX,AL MOV AL,AH OUT DX,AL 硬件连线示意图:

CLK0 GATE0 2MHz时钟输入 +5V

1KHz方波输出

8253 OUT0

7.6 8259A中断控制器的中断屏蔽寄存器(IMR)和8086/8088CPU的中断允许标志IF有什么差别?在中断响应过程中它们如何配合工作?

参考答案:IF是8086/8088CPU对外部可屏蔽中断申请的总开关,而IMR是8259A中断控制器对接入8259A的中断申请的开关;IMR中的8位对应8个中断申请,IMR i =0允许对应引脚中断申请输入,IF=1时CPU才会响应外部可屏蔽中断申请。

7.7 若已知8259A的初始化控制字ICW2设置为40H,请计算其IR5端口中断源的中断类型码及其对应的中断向量地址范围。

参考答案:IR5端口中断源的中断类型码是45H,其对应的中断向量地址范围:0114H~0117H。

7.8 试编写8259A的初始化程序:系统中仅有一片8259A,允许8个中断源边沿触发,不需要缓冲,一般全嵌套工作方式,中断向量为40H。(设地址8259A片选地址为60H、61H) 参考答案:

MOV AL,13H OUT 60H,AL MOV AL,40H OUT 61H,AL MOV AL,03H OUT 61H,AL

MOV AL,0 OUT 61H,AL

7.9 对于 8 位、12 位和 16 位的 A/D 转换器,当输入电压范围为 0~5V 时,其量化间隔分别为多少? 参考答案:

8位A/D 转换器的量化间隔:5V/256=0.01953V

12位A/D 转换器的量化间隔:5V/4096=0.01953V=0.00122V 16位A/D 转换器的量化间隔:5V/4096=0.01953V=0.000076V

7.10 要求某电子秤的称重范围为 0~500g,测量误差小于 0.05g,至少应该选用分辨率为多少位的 A/D 转换器?现有 8 位、10 位、12 位、14 位和 16 位可供选择。 参考答案:

应大于500g / 0.05g=10000,

28 =256,210 =1024,212 =4096,214 =16384,216=65536。 因此至少选用分辨率为14位的A/D转换器。

7.11 如果一个 8 位 D/A 转换器的满量程(对应于数字量 255)为 10V,分别确定模拟量为 2.0V 和 8.0V 所对应的数字量是多少? 参考答案:

(2 / 10)*255 = 51,2.0V对应的数字量是51; (8 / 10)*255 = 204,2.0V对应的数字量是204。

7.12 某 12 位 D/A 转换器,输出电压为 0~2.5V,当输入的数字量为 400H 时,对应的输出电压是多少? 参考答案: 212 = 4096 = 1000H,

(400H / 1000H)*2.5 = 0.625V,对应输出电压为0.625V。

7.13 设8251A工作于异步方式,波特率因子为16,数据位7位,奇校验,允许发送和接收

数据,其端口地址为80H,81H。试编写初始化程序。 参考答案:

MOV AL,40H ;内部复位(使D6 = 1) OUT 81H,AL

MOV AL,01101010B ;方式命令字(异步,1位停止位,字符长度为7位;

奇校验,波特率因子为16)

OUT 81H,AL

MOV AL,05H ;工作命令字(RTS、DTR置1) OUT 81H,AL

7.14 设8251A的控制和状态端口地址为51H,数据输入/输出口地址为50H,输入50个字符,将字符放在BUFFER所指的内存缓冲区中。请写出这段程序。 参考答案:

CODE SEGMENT

ASSUME CS:CODE

BEGIN: MOV AL,00H ;空操作,向命令口写任意数 OUT 51H,AL

MOV AL,40H ;内部复位(含D6 = 1) OUT 51H,AL NOP

MOV AL,0CFH ;方式字 OUT 51H,AL

MOV AL,05H ;工作命令字(RTS、DTR置1) OUT 51H,AL

MOV CX,50 ;接收字节数 MOV DI,OFFSET BUFFER ;接收区首址 L2: IN AL,51H

AND AL,02H ;查状态位D1(RxRDY)=1? JZ L2 ;接收未准备好,则等待 IN AL,50H ;接收准备好,则接收1字节

MOV [DI],AL ;并存入接收区 INC DI ;修改内存 LOOP L2 ;未接收完,继续

MOV AX,4C00H ;已接收完,程序结束,退出 INT 21H ;返回DOS CODE ENDS END BEGIN