第一篇:微机原理与接口技术(钱晓捷版)课后习题答案
“微机原理与接口技术”习题解答 第1章 微型计算机系统 〔习题1.1〕简答题 〔解答〕
① 处理器每个单位时间可以处理的二进制数据位数称计算机字长。② 总线信号分成三组,分别是数据总线、地址总线和控制总线。③ PC机主存采用DRAM组成。
④ 高速缓冲存储器Cache是处理器与主存之间速度很快但容量较小的存储器。⑤ ROM-BIOS是“基本输入输出系统”,操作系统通过对BIOS的调用驱动各硬件设备,用户也可以在应用程序中调用BIOS中的许多功能。
⑥ 中断是CPU正常执行程序的流程被某种原因打断、并暂时停止,转向执行事先安排好的一段处理程序,待该处理程序结束后仍返回被中断的指令继续执行的过程。⑦ 主板芯片组是主板的核心部件,它提供主板上的关键逻辑电路。⑧ MASM是微软开发的宏汇编程序。
⑨ 指令的处理过程。处理器的“取指—译码—执行周期” 是指处理器从主存储器读取指令(简称取指),翻译指令代码的功能(简称译码),然后执行指令所规定的操作(简称执行)的过程。⑩ 机器语言层,即指令集结构。
(学生很多认为是:汇编语言层。前4章主要涉及汇编语言,但本书还有很多处理器原理等内容)〔习题1.2〕判断题
① 错 ② 错 ③ 对 ④ 错 ⑤ 对
⑥ 错 ⑦ 错 ⑧ 对 ⑨ 错 ⑩ 错 〔
〔解答〕
① Central Processing Unit,中央处理单元,处理器 ② 1MB,4GB ③ 216,64KB ④ EXE,COM(BAT老师讲的)⑤ Instruction Set Architecture ⑥ 目录
⑦ MMX,SSE3 ⑧ 64 ⑨ IBM,DOS ⑩ PCI 〔习题1.4〕
说明微型计算机系统的硬件组成及各部分作用。〔解答〕
CPU:CPU也称处理器,是微机的核心。它采用大规模集成电路芯片,芯片内集成了控制器、运算器和若干高速存储单元(即寄存器)。处理器及其支持电路构成了微机系统的控制中心,对系统的各个部件进行统一的协调和控制。
存储器:存储器是存放程序和数据的部件。
外部设备:外部设备是指可与微机进行交互的输入(Input)设备和输出(Output)设备,也称I/O设备。I/O设备通过I/O接口与主机连接。
总线:互连各个部件的共用通道,主要含数据总线、地址总线和控制总线信号。〔习题1.5〕
什么是通用微处理器、单片机(微控制器)、DSP芯片、嵌入式系统? 〔解答〕
通用微处理器:适合较广的应用领域的微处理器,例如装在PC机、笔记本电脑、工作站、服务器上的微处理器。单片机:是指通常用于控制领域的微处理器芯片,其内部除CPU外还集成了计算机的其他一些主要部件,只需配上少量的外部电路和设备,就可以构成具体的应用系统。
DSP芯片:称数字信号处理器,也是一种微控制器,其更适合处理高速的数字信号,内部集成有高速乘法器,能够进行快速乘法和加法运算。
嵌入式系统:利用微控制器、数字信号处理器或通用微处理器,结合具体应用构成的控制系统。〔习题1.6〕
综述Intel 80x86系列处理器在指令集方面的发展。〔解答〕
8086奠定了基本的16位指令集,80286提供了保护方式的各种指令,80386将指令集全面提升为32位,80486融入了浮点数据处理指令,奔腾系列陆续增加了多媒体指令MMX、SSE、SSE2和SSE3,最新的奔腾4处理器还支持64位指令集。
题外话:大家可以通过阅读相关资料、查询互联网获得更加详细的发展情况。可以考虑组织成一篇或多篇论文。〔习题1.7〕
区别如下概念:助记符、汇编语言、汇编语言程序和汇编程序。〔解答〕
助记符:人们采用便于记忆、并能描述指令功能的符号来表示机器指令操作码,该符号称为指令助记符。
汇编语言:用助记符表示的指令以及使用它们编写程序的规则就形成汇编语言。汇编语言程序:用汇编语言书写的程序就是汇编语言程序,或称汇编语言源程序。
汇编程序:汇编语言源程序要翻译成机器语言程序才可以由处理器执行。这个翻译的过程称为“汇编”,完成汇编工作的程序就是汇编程序(Assembler)。〔习题1.8〕
区别如下概念:路径、绝对路径、相对路径、当前目录。系统磁盘上存在某个可执行文件,但在DOS环境输入其文件名却提示没有这个文件,是什么原因? 〔解答〕
路径:操作系统以目录形式管理磁盘上的文件,文件所在的分区和目录就是该文件的路径。绝对路径:从根目录到文件所在目录的完整路径称为“绝对路径”。是保证文件唯一性的标示方法。相对路径:从系统当前目录到文件所在目录的路径称为相对路径。当前目录:用户当前所在的目录就是当前目录。
指明的路径不正确,或者执行了另外一个同名的文件。〔习题1.9〕
什么是摩尔定律?它能永久成立吗? 〔解答〕
每18个月,集成电路的性能将提高一倍,而其价格将降低一半。(1965年,Intel公司的创始人之一摩尔预言:集成电路上的晶体管密度每年将翻倍。现在这个预言通常表达为:每隔18个月硅片密度(晶体管容量)将翻倍;也常被表达为:每18个月,集成电路的性能将提高一倍,而其价格将降低一半。)
不能。由于电子器件的物理极限在悄然逼近,摩尔定律不会永远持续。〔习题1.10〕
冯·诺依曼计算机的基本设计思想是什么? 〔解答〕
采用二进制形式表示数据和指令。指令由操作码和地址码组成。
将程序和数据存放在存储器中,计算机在工作时从存储器取出指令加以执行,自动完成计算任务。这就是“存储程序”和“程序控制”(简称存储程序控制)的概念。
指令的执行是顺序的,即一般按照指令在存储器中存放的顺序执行,程序分支由转移指令实现。计算机由存储器、运算器、控制器、输入设备和输出设备五大基本部件组成,并规定了5部分的基本功能。〔习题1.11〕
计算机系统通常划分为哪几个层次?普通计算机用户和软件开发人员对计算机系统的认识一样吗?
〔解答〕
最上层是用户层。
第5层是高级语言层。第4层是汇编语言层。第3层是操作系统层。第2层是机器语言层。第1层是控制层。
第0层是数字电路层。
普通计算机用户和软件人员对计算机系统的认识并不一样。普通计算机用户看到的计算机,也就是我们最熟悉的计算机,属于用户层,而软件人员看到的属于高级语言层或是汇编语言层。〔习题1.12〕
什么是系列机和兼容机?你怎样理解计算机中的“兼容”特性?例如,你可以用PC机为例,谈谈你对软件兼容(或兼容性)的认识,说明为什么PC机具有如此强大的生命力? 〔解答〕
系列机是指在一个厂家生产的具有相同计算机结构,但具有不同组成和实现的一系列(Family)不同档次、不同型号的机器。
兼容机是指不同厂家生产的具有相同计算机结构(不同的组成和实现)的计算机。
兼容是一个广泛的概念,包括软件兼容、硬件兼容、系统兼容等。其中软件兼容是指同一个软件可以不加修改地运行于体系结构相同的各档机器,结果一样但运行时间可能不同。软件兼容可从机器性能和推出时间分成向上(向下)和向前(向后)兼容。例如32位PC机就陆续增加了对浮点处理指令、多媒体指令等的支持。在保证向后兼容的前提下,不断改进其组成和实现,延续计算机结构的生命,才使得PC机具有如此强大的生命力。〔习题1.13〕
英特尔公司最新Intel 80x86处理器是什么?请通过查阅相关资料(如英特尔公司网站),说明其主要特点和采用的新技术。〔解答〕
酷睿2多核处理器。〔习题1.14〕
说明高级语言、汇编语言、机器语言三者的区别,谈谈你对汇编语言的认识。〔解答〕
高级语言与具体的计算机硬件无关,其表达方式接近于所描述的问题,易为人们接受和掌握,用高级语言编写程序要比低级语言容易得多,并大大简化了程序的编制和调试,使编程效率得到大幅度的提高。而汇编语言是为了便于理解与记忆,将机器指令用助记符代替而形成的一种语言。汇编语言的语句通常与机器指令对应,因此,汇编语言与具体的计算机有关,属于低级语言。它比机器语言直观,容易理解和记忆,用汇编语言编写的程序也比机器语言易阅读、易排错。机器语言的每一条机器指令都是二进制形式的指令代码,计算机硬件可以直接识别。高级语言程序通常也需要翻译成汇编语言程序,再进一步翻译成机器语言代码。〔习题1.15〕
为了更好地进行编程实践,请进入Windows操作系统下的控制台环境(或MS-DOS模拟环境),练习常用命令。第2章 处理器结构 〔习题2.1〕简答题 〔解答〕
① ALU是算术逻辑运算单元,负责处理器所能进行的各种运算,主要是算术运算和逻辑运算。② 取指是指从主存取出指令代码通过总线传输到处理器内部指令寄存器的过程。8086分成总线接口单元和指令执行单元,可以独立操作。在执行单元执行一条指令的同时,总线接口单元可以读取下一条指令,等到执行时不需要进行取指了,所以称为预取。
③ Pentium采用分离的Cache结构,一个用做指令Cache,一个用做数据Cache。④ 堆栈的存取原则是先进后出(也称为后进先出)操作方式存取数据。
⑤ 标志寄存器主要保存反映指令执行结果和控制指令执行形式的有关状态。⑥ 执行了一条加法指令后,发现ZF=1,表明运算结果为0。⑦ 没有。
⑧ 汇编语言的标识符大小写不敏感,即表示字母大小写不同、但表示同一个符号。⑨ 不会。
⑩ 指令的操作数需要通过存储器地址或I/O地址,才能查找到数据本身,故称数据寻址方式。〔习题2.2〕判断题
〔解答〕
① 错 ② 对 ③ 对 ④ 对 ⑤ 错 ⑥ 对 ⑦ 对 ⑧ 错 ⑨ 对 ⑩ 对 〔习题2.3〕填空题
〔解答〕
① 32,DX,DH ② 16 ③ 段地址,偏移地址,EIP,IP ④ 00100110,0 ⑤ 73C00H,73800H ⑥ EBX,ECX,ESI,EDI,EBP,ESP ⑦ 实地址,64KB ⑧ ASM,目标模块,FLAT ⑨ 立即数寻址、寄存器寻址和存储器寻址 ⑩ DS,SS 〔习题2.4〕
处理器内部具有哪3个基本部分?8086分为哪两大功能部件?其各自的主要功能是什么? 〔解答〕
处理器内部有ALU、寄存器和指令处理三个基本单元。8086有两大功能部件:总线接口单元和执行单元。
总线接口单元:管理着8086与系统总线的接口,负责处理器对存储器和外设进行访问。8086所有对外操作必须通过BIU和这些总线进行。
执行单元EU:负责指令译码、数据运算和指令执行。〔习题2.5〕
8086怎样实现了最简单的指令流水线? 〔解答〕
8086中,指令的读取是在BIU单元,而指令的执行是在EU单元。因为BIU和EU两个单元相互独立、分别完成各自操作,所以可以并行操作。也就是说,在EU单元对一个指令进行译码执行时,BIU单元可以同时对后续指令进行读取;这就是最简单的指令流水线技术。〔习题2.6〕
什么是标志?什么是IA-32处理器的状态标志、控制标志和系统标志?说明状态标志在标志寄存器EFLAGS的位置和含义。〔解答〕
标志:用于反映指令执行结果或控制指令执行形式的一个或多个二进制数位。例如,有些指令执行后会影响有关标志位;有些指令的执行要利用相关标志。状态标志:用来记录程序运行结果的状态信息。控制标志:DF标志,控制字符串操作的地址方向。系统标志:用于控制处理器执行指令的方式。
状态标志在标志寄存器EFLAGS中的位置和含义如下:
11 10 9 8 7 6 5 4 3 2 1 0 „„ OF
SF ZF AF PF CF
〔习题2.7〕
举例说明CF和OF标志的差异。〔解答〕
进位标志CF表示无符号数运算结果是否超出范围,超出范围后加上进位或借位,运算结果仍然正确;溢出标志OF表示有符号数运算结果是否超出范围,如果超出范围,运算结果已经不正确。例1:3AH + 7CH=B6H 无符号数运算:58+124=182,范围内,无进位。有符号数运算:58+124=182,范围外,有溢出。例2:AAH + 7CH=①26H 无符号数运算:170+124=294,范围外,有进位。有符号数运算:-86+124=28,范围内,无溢出。〔习题2.8〕
什么是8086中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?请将如下逻辑地址用物理地址表达(均为十六进制形式):
① FFFF∶0
② 40∶17
③ 2000∶4500
④ B821∶4567 〔解答〕
物理地址:在处理器地址总线上输出的地址称为物理地址。每个存储单元有一个唯一的物理地址。逻辑地址:在处理器内部、程序员编程时采用逻辑地址,采用“段地址:偏移地址“形式。某个存储单元可以有多个逻辑地址,即处于不同起点的逻辑段中,但其物理地址是唯一的。逻辑地址转换成物理地址:逻辑地址由处理器在输出之前转换为物理地址。将逻辑地址中的段地址左移二进制4位(对应16进制是一位,即乘以16),加上偏移地址就得到20位物理地址。① FFFFH:0=FFFF0H ② 40H:17H=00417H ③ 2000H:4500H=24500H ④ B821H:4567H=BC777H 〔习题2.9〕
IA-32处理器有哪三类基本段,各是什么用途? 〔解答〕
IA-32处理器有代码段、数据段、堆栈段三类基本段。
代码段:存放程序的指令代码。程序的指令代码必须安排在代码段,否则将无法正常执行。
数据段:存放当前运行程序所用的数据。程序中的数据默认是存放在数据段,也可以存放在其他逻辑段中。
堆栈段:主存中堆栈所在的区域。程序使用的堆栈一定在堆栈段。〔习题2.10〕
什么是平展存储模型、段式存储模型和实地址存储模型? 〔解答〕
平展存储模型下,对程序来说存储器是一个连续的地址空间,称为线性地址空间。程序需要的代码、数据和堆栈都包含在这个地址空间中。
段式存储模型下,对程序来说存储器由一组独立的地址空间组成,独立的地址空间称为段。通常,代码、数据和堆栈位于分开的段中。
实地址存储模型是8086处理器的存储模型。它是段式存储模型的特例,其线性地址空间最大为1MB容量,由最大为64KB的多个段组成。〔习题2.11〕
什么是实地址方式、保护方式和虚拟8086方式?它们分别使用什么存储模型? 〔解答〕
实地址方式:与8086具有相同的基本结构,只能寻址1MB物理存储器空间,逻辑段最大不超过64KB;但可以使用32位寄存器、32位操作数和32位寻址方式;相当于可以进行32位处理的快速8086。实地址工作方式只能支持实地址存储模型。
保护方式:具有强大的段页式存储管理和特权与保护能力,使用全部32条地址总线,可寻址4GB物理存储器。保护方式通过描述符实现分段存储管理,每个逻辑段可达4GB。处理器工作在保护方式时,可以使用平展或段式存储模型。
虚拟8086方式:在保护方式下运行的类似实方式的运行环境,只能在1MB存储空间下使用“16位段”。处理器工作在虚拟8086方式时,只能使用实地址存储模型。〔习题2.12〕
汇编语句有哪两种,每个语句由哪4个部分组成? 〔解答〕
汇编语句有两种:执行性语句(处理器指令)、说明性语句(伪指令)。每个语句有:标号、指令助记符、操作数或参数、注释4个部分组成。〔习题2.13〕
汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。〔解答〕
汇编语言程序的开发有4个步骤:
编辑:用文本编辑器形成一个以ASM为扩展名的源程序文件。汇编:用汇编程序将ASM文件转换为OBJ模块文件。
连接:用连接程序将一个或多个目标文件链接成一个EXE或COM可执行文件。调试:用调试程序排除错误,生成正确的可执行文件。〔习题2.14〕
MASM汇编语言中,下面哪些是程序员可以使用的正确的标识符。FFH,DS,0xvab,Again,next,@data,h_ascii,6364b,.exit,small 〔解答〕
FFH,Again,next,h_ascii 〔习题2.15〕
给出IA-32处理器的32位寻址方式和16位寻址方式的组成公式,并说明各部分作用。〔解答〕
① 32位存储器寻址方式的组成公式
32位有效地址 = 基址寄存器+(变址寄存器×比例)+位移量 其中的4个组成部分是:
·基址寄存器任何8个32位通用寄存器之一;
·变址寄存器除ESP之外的任何32位通用寄存器之一;
·比例可以是1,2,4或8(因为操作数的长度可以是1,2,4或8字节); ·位移量可以是8或32位有符号值。② 16位存储器寻址方式的组成公式
16位有效地址 = 基址寄存器+变址寄存器+位移量
其中基址寄存器只能是BX或BP,变址寄存器只能是SI或DI,位移量是8或16位有符号值。〔习题2.16〕
说明下列指令中源操作数的寻址方式?假设VARD是一个双字变量。(1)mov edx,1234h(2)mov edx,vard(3)mov edx,ebx(4)mov edx,[ebx](5)mov edx,[ebx+1234h](6)mov edx,vard[ebx](7)mov edx,[ebx+edi](8)mov edx,[ebx+edi+1234h](9)mov edx,vard[esi+edi](10)mov edx,[ebp*4] 〔解答〕 ① 立即数 ② 直接 ③ 寄存器
④ 寄存器间接 ⑤ 寄存器相对 ⑥ 寄存器相对 ⑦ 基址变址
⑧ 相对基址变址 ⑨ 相对基址变址 ⑩ 带比例寻址 〔习题2.17〕
使用本书配套的软件包(或者按照本书说明)创建MASM开发环境,通过编辑例题2-1和例题2-2程序、汇编连接生成可执行程序和列表文件,掌握汇编语言的开发。第3章 数据处理 〔习题3.1〕简答题 〔解答〕
① 没有。使用二进制8位表达无符号整数,257没有对应的编码。② 字符“'F'”的ASCII码就是数值46H,所以没有区别。
③ 汇编程序在汇编过程中对数值表达式计算,得到一个确定的数值,故称数值表达式为常量。
④ 不能。数值500大于一个字节所能表达的数据量,所以不能为字节变量赋值。⑤ 源、目标寄存器位数不同,不能用该指令进行数据交换。⑥ 前者在指令执行时获得偏移地址,是正确的;但后者的OFFSET只能在汇编阶段获得偏移地址,但此时寄存器内容是不可知的,所以无法获得偏移地址。
⑦ INC,DEC,NEG和NOT指令的操作数既是源操作数也是目的操作数。⑧ 大小写字母转换利用它们的ASCII码相差20H。⑨ 加减法不区别无符号数和有符号数,但根据运算结果分别设置标志寄存器的CF和OF标志,可利用CF和OF进行区别。
⑩ 逻辑与运算规则类似二进制的乘法,所以称其为逻辑乘。〔习题3.2〕判断题
〔解答〕
① 对 ② 对 ③ 对 ④ 错 ⑤ 错
⑥ 对 ⑦ 错 ⑧ 错 ⑨ 对 ⑩ 对 〔习题3.3〕填空题 〔解答〕
① BYTE,OFFSET ② 97,61,小写字母a ③ 0DH(13),0AH(10)④ 8843H ⑤ DWORD,4,WORD PTR XYZ ⑥ 3 ⑦ 78894111 ⑧ 0,0,0 ⑨ ***2H,83H ⑩ 4 〔习题3.4〕
下列十六进制数表示无符号整数,请转换为十进制形式的真值: ① FFH
② 0H
③ 5EH
④ EFH 〔解答〕 ① 255 ② 0 ③ 94 ④ 239 〔习题3.5〕
将下列十进制数真值转换为压缩BCD码: ① 12
② 24
③ 68
④ 99 〔解答〕 ① 12H ② 24H ③ 68H ④ 99H 〔习题3.6〕
将下列压缩BCD码转换为十进制数:
① 10010001
② 10001001
③ 00110110
④ 10010000 〔解答〕 ① 91 ② 89 ③ 36 ④ 90 〔习题3.7〕
将下列十进制数用8位二进制补码表示: ① 0
② 127
③-127
④ -57 〔解答〕 ① 00000000 ② 01111111 ③ 10000001 ④ 11000111 〔习题3.8〕
进行十六进制数据的加减运算,并说明是否有进位或借位: ① 1234H+7802H ② F034H+5AB0H ③ C051H-1234H ④ 9876H-ABCDH 〔解答〕
① 1234H+7802H=8A36H,无进位 ② F034H+5AB0H=4AF4H,有进位 ③ C051H-1234H=BE1DH,无借位 ④ 9876H-ABCDH=ECA9H,有借位 〔习题3.9〕
数码0~
9、大写字母A~Z、小写字母a~z对应的ASCII码分别是多少?ASCII码0DH和0AH分别对应什么字符? 〔解答〕
数码0~9对应的ASCII码依次是30H~39H。
大写字母A~Z对应的ASCII码依次是:41H~5AH。小写字母a~z对应的ASCII码依次是:61~7AH。ASCII码0DH和0AH分别对应的是回车和换行字符。〔习题3.10〕
设置一个数据段,按照如下要求定义变量或符号常量: ① my1b为字符串变量:Personal Computer ② my2b为用十进制数表示的字节变量:20 ③ my3b为用十六进制数表示的字节变量:20 ④ my4b为用二进制数表示的字节变量:20 ⑤ my5w为20个未赋值的字变量 ⑥ my6c为100的常量
⑦ my7c表示字符串:Personal Computer 〔解答〕
my1b byte 'Personal Computer' my2b byte 20 my3b byte 14h my4b byte 00010100b my5w word 20 dup(?)my6c = 100 my7c equ
〔习题3.11〕
定义常量NUM,其值为5;数据段中定义字数组变量DATALIST,它的头5个字单元中依次存放-10,2,5和4,最后1个单元初值不定。〔解答〕 num equ 5 datalist byte-10,2,5,4,? 〔习题3.12〕
从低地址开始以字节为单位,用十六进制形式给出下列语句依次分配的数值:
byte 'ABC',10,10h,'EF',3 dup(-1,?,3 dup(4))word 10h,-5,3 dup(?)〔解答〕
0A 10 45 46 FF 00 04 04 04 FF 00 04 04 04 FF 00 04 04 04 10 00 FB FF 00 00 00 00 00 00 〔习题3.13〕
设在某个程序中有如下片段,请写出每条传送指令执行后寄存器EAX的内容:
;数据段
org 100h varw word 1234h,5678h varb byte 3,4 vard dword 12345678h buff byte 10 dup(?)mess byte 'hello';代码段 mov eax,offset mess mov eax,type buff+type mess+type vard mov eax,sizeof varw+sizeof buff+sizeof mess mov eax,lengthof varw+lengthof vard 〔解答〕
①
EAX=0114H ②
EAX=0006H ③
EAX=0013H ④
EAX=0003H 〔习题3.14〕
按照如下输出格式,在屏幕上显示ASCII表:
| 0 1 2 3 4 5 6 7 8 9 A B C D E F---+-20 |
!“ #...30 | 0 1 2 3...40 | @ A B C...50 | P Q R S...60 | ‘ a b c...70 | p q r s...表格最上一行的数字是对应列ASCII代码值的低4位(用十六进制形式),而表格左边的数字对应行ASCII代码值的高4位(用十六进制形式)。编程在数据段直接构造这样的表格、填写相应ASCII代码值(不是字符本身),然后使用字符串显示子程序DISPMSG实现显示。〔解答〕
include io32.inc.data table byte '
|0 1 2 3 4 5 6 7 8 9 A B C D E F',13,10 byte '---+',13,10 byte '20 |',20h,20h,21h,20h,22h,20h,23h,20h,24h,20h,25h,20h,26h,20h,27h,20h,28h,20h,29h,20h byte 2ah,20h,2bh,20h,2ch,20h,2dh,20h,2eh,20h,2fh,20h,13,10 byte '30 |',30h,20h,31h,20h,32h,20h,33h,20h,34h,20h,35h,20h,36h,20h,37h,20h,38h,20h,39h,20h byte 3ah,20h,3bh,20h,3ch,20h,3dh,20h,3eh,20h,3fh,20h,13,10 byte '40 |',40h,20h,41h,20h,42h,20h,43h,20h,44h,20h,45h,20h,46h,20h,47h,20h,48h,20h,49h,20h byte 4ah,20h,4bh,20h,4ch,20h,4dh,20h,4eh,20h,4fh,20h,13,10 byte '50 |',50h,20h,51h,20h,52h,20h,53h,20h,54h,20h,55h,20h,56h,20h,57h,20h,58h,20h,59h,20h byte 5ah,20h,5bh,20h,5ch,20h,5dh,20h,5eh,20h,5fh,20h,13,10 byte '60 |',60h,20h,61h,20h,62h,20h,63h,20h,64h,20h,65h,20h,66h,20h,67h,20h,68h,20h,69h,20h byte 6ah,20h,6bh,20h,6ch,20h,6dh,20h,6eh,20h,6fh,20h,13,10 byte '70 |',70h,20h,71h,20h,72h,20h,73h,20h,74h,20h,75h,20h,76h,20h,77h,20h,78h,20h,79h,20h byte 7ah,20h,7bh,20h,7ch,20h,7dh,20h,7eh,20h,7fh,20h,13,10 byte 0.code start: mov eax,offset table call dispmsg exit 0 end start 〔习题3.15〕
数据段有如下定义,IA-32处理器将以小端方式保存在主存: var dword 12345678h 现以字节为单位按地址从低到高的顺序,写出这个变量内容。并说明如下指令的执行结果:
mov eax,var;EAX=__________ mov bx,var;BX=__________ mov cx,var+2;CX=__________ mov dl,var;DL=__________ mov dh,var+3;DH=__________ 可以编程使用十六进制字节显示子程序DSIPHB顺序显示各个字节进行验证,还可以使用十六进制双字显示子程序DSIPHD显示该数据进行对比。〔解答〕
小端方式采用“低对低、高对高”,即低字节数据存放在低地址存储单元、高字节数据存放在高地址存储单元。以字节为单位按地址从低到高的顺序,var变量的内容:78H、56H、34H、12H。
;EAX=12345678H;BX=5678H;CX=1234H;DL=78H;DH=12H 〔习题3.16〕
使用若干MOV指令实现交互指令“XCHG EBX,[EDI]”功能。〔解答〕
push eax;可以没有
mov eax,ebx mov ebx,[edi] mov [edi],eax pop eax;可以没有 〔习题3.17〕
假设当前ESP=0012FFB0H,说明下面每条指令后,ESP等于多少?
push eax push dx push dword ptr 0f79h pop eax pop word ptr [bx] pop ebx 〔解答〕
ESP=0012FFACH ESP=0012FFAAH ESP=0012FFA6H ESP=0012FFAAH ESP=0012FFACH ESP=0012FFB0H 〔习题3.18〕
已知数字0~9对应的格雷码依次为:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H;请为如下程序的每条指令加上注释,说明每条指令的功能和执行结果。
;数据段
table byte 18h,34h,05h,06h,09h,0ah,0ch,11h,12h,14h;代码段
mov ebx,offset table mov al,8 xlat 为了验证你的判断,不妨使用本书的I/O子程序库提供的子程序DISPHB显示换码后AL的值。如果不使用XLAT指令,应如何修改? 〔解答〕
;数据段
table byte 18h,34h,05h,06h,09h,0ah,0ch,11h,12h,14h;定义格雷码表
;代码段
mov ebx,offset table;EBX=格雷码表首地址
mov al,8;AL=8 xlat;AL=12H(8的格雷码)不使用XLAT指令:
mov ebx,offset table;EBX=格雷码表首地址
mov eax,0 mov al,8;AL=8 mov al,[eax+ebx];AL=12H(8的格雷码)〔习题3.19〕
请分别用一条汇编语言指令完成如下功能:
(1)把EBX寄存器和EDX寄存器的内容相加,结果存入EDX寄存器。
(2)用寄存器EBX和ESI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。
(3)用EBX和位移量0B2H的寄存器相对寻址方式把存储器中的一个双字和ECX寄存器的内容相加,并把结果送回存储器中。
(4)将32位变量VARD与数3412H相加,并把结果送回该存储单元中。(5)把数0A0H与EAX寄存器的内容相加,并把结果送回EAX中。〔解答〕
① add edx,ebx ② add al,[ebx+esi] ③ add [bx+0b2h],cx ④ add varw,3412h ⑤ add eax,0a0h 〔习题3.20〕
分别执行如下程序片断,说明每条指令的执行结果:(〔解答〕(1)
;EAX=80H;EAX=83H,CF=0,SF=0;EAX=103H,CF=0,OF=0;EAX=106H,CF=0,ZF=0(2)
;EAX=100;EAX=300,CF=0(3)
;EAX=100;EAX=44,CF=1(包含256的进位含义:256+44=300)(4)
mov al,7fh;AL=7FH sub al,8;AL=77H,CF=0,SF=0 sub al,80h;AL=F7H,CF=1,OF=1 sbb al,3;AL=F3H,CF=0,ZF=0 〔习题3.21〕
给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:
mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al inc al 〔解答〕
mov al,89h;AL=89H CF ZF SF OF PF add al,al;AL=12H 1 0 0 1 1 add al,9dh;AL=0AFH 0 0 1 0 1 cmp al,0bch;AL=0AFH 1 0 1 0 1 sub al,al;AL=00H 0 1 0 0 1 dec al;AL=0FFH 0 0 1 0 1 inc al;AL=00H 0 1 0 0 1 〔习题3.22〕
有两个64位无符号整数存放在变量buffer1和buffer2中,定义数据、编写代码完成EDX.EAX←buffer1-buffer2功能。〔解答〕
;数据段
buffer1 qword 67883000h buffer2 qword 67762000h;代码段
mov eax,dword ptr buffer1 mov edx,dword ptr buffer1+4 sub eax,dword ptr buffer2 sbb edx,dword ptr buffer2+4 〔习题3.23〕
分别执行如下程序片断,说明每条指令的执行结果: 〔解答〕(1)
;ESI=9CH;ESI=80H;ESI=FFH;ESI=01H(2)
;EAX=1010B(可以有前导0,下同)
;EAX=0010B,CF=1;EAX=0100B,CF=0;EAX=0000B,CF=0(3)
;EAX=1011B(可以有前导0,下同)
;EAX=101100B,CF=0;EAX=10110B,CF=0;EAX=10111B,CF=0(4)
;EAX=0,CF=0,OF=0;ZF=1,SF=0,PF=1 〔习题3.24〕
3.24 给出下列各条指令执行后AX的结果,以及状态标志CF、OF、SF、ZF、PF的状态。
mov ax,1470h and ax,ax or ax,ax xor ax,ax not ax test ax,0f0f0h 〔解答〕
mov ax,1470h;AX=1470H CF OF SF ZF PF and ax,ax;AX=1470H 0 0 0 0 0 or ax,ax;AX=1470H 0 0 0 0 0 xor ax,ax;AX=0000H 0 0 0 1 1 not ax;AX=FFFFH 0 0 0 1 1 test ax,0f0f0h;AX=0F0F0H 0 0 1 0 1 〔习题3.25〕
逻辑运算指令怎么实现复位、置位和求反功能? 〔解答〕
AND指令同“0”与实现复位,OR指令同“1”或实现置位,XOR同“1”异或实现求反。〔习题3.26〕
说明如下程序段的功能:
mov ecx,16 mov bx,ax next: shr ax,1 rcr edx,1 shr bx,1 rcr edx,1 loop next mov eax,edx 〔解答〕
将AX的每一位依次重复一次,所得的32位结果保存于EAX中。〔习题3.27〕
编程将一个64位数据逻辑左移3位,假设这个数据已经保存在EDX.EAX寄存器对中。〔解答〕
;代码段
mov ecx,3 again: shl eax,1 rcl edx,1 loop again 〔习题3.28〕
编程将一个压缩BCD码变量(例如92H)转换为对应的ASCII码,然后调用DISPC子程序(在输入输出子程序库中)显示。〔解答〕
;数据段 bcd byte 92h;代码段
mov al,bcd shr al,4 add al,30h call dispc mov al,bcd and al,0fh add al,30h call dispc 〔习题3.29〕
以MOVS指令为例,说明串操作指令的寻址特点,并用MOV和ADD等指令实现MOVSD的功能(假设DF=0)。〔解答〕
MOVS指令的功能是:
ES:[EDI]←DS:[ESI];ESI←ESI±1/2/4,EDI←EDI±1/2/4 由此可看出串操作指令的寻址特点:
源操作数用寄存器ESI间接寻址,默认在DS指向的数据段,但可以改变;目的操作数用寄存器EDI间接寻址,只能在ES指向的附加数据段;每执行一次串操作,源指针ESI和目的指针EDI将自动修改:±1(字节),±2(字)或±4(双字)。指针的增量和减量控制由DF标志确定,DF=0,进行增量;DF=1,进行减量。
push eax mov eax,[esi] mov es:[edi],eax add esi,4 add edi,4 〔习题3.30〕
说明如下程序执行后的显示结果:
;数据段
msg byte 'WELLDONE',0;代码段
mov ecx,(lengthof msg)-1 mov ebx,offset msg again: mov al,[ebx] add al,20h mov [ebx],al add ebx,1 loop again mov eax,offset msg call dispmsg 如果将其中语句“mov ebx,offset msg”改为“xor ebx,ebx”,则利用EBX间接寻址的两个语句如何修改成EBX寄存器相对寻址,就可以实现同样功能? 〔解答〕
显示结果:welldone EBX寄存器相对寻址:
mov al,msg[ebx] mov msg[ebx],al 〔习题3.31〕 下面程序的功能是将数组ARRAY1的每个元素加固定值(8000H),将和保存在数组ARRAY2。在空白处填入适当的语句或语句的一部分。
;数据段
array1 dword 1,2,3,4,5,6,7,8,9,10 array2 dword 10 dup(?);代码段
mov ecx,lengthof array1 mov ebx,0 again: mov eax,array1[ebx*4] add eax,8000h mov ______________ add ebx,__________ loop again 〔解答〕
mov array2[ebx*4],eax add ebx,1 〔习题3.32〕
上机实现本章的例题程序,编程实现本章的习题程序。第4章 汇编语言程序设计 〔习题4.1〕简答题 〔解答〕
① 当同一个程序被操作系统安排到不同的存储区域执行时,指令间的位移没有改变,目标地址采用相对寻址可方便操作系统的灵活调度。
② 数据通信时,数据的某一位用做传输数据的奇偶校验位,数据中包括校验位在内的“1”的个数恒为奇数,就是奇校验;恒为偶数,就是偶校验。
③ 无符号数和有符号数的操作影响两组不同的标志状态位,故判断两个无符号数和有符号数的大小关系要利用不同的标志位组合,所以有对应的两组指令。
④ 双分支结构中两个分支体之间的JMP指令,用于实现结束前一个分支回到共同的出口作用。⑤ 完整的子程序注释可方便程序员调用该子程序,子程序注释包括子程序名、子程序功能、入口参数和出口参数、调用注意事项和其他说明等。
⑥ 子程序保持堆栈平衡,才能保证执行RET指令时当前栈顶的内容是正确的返回地址。主程序也要保持堆栈平衡,这样才能释放传递参数占用的堆栈空间,否则多次调用该子程序可能就致使堆栈溢出。
⑦ “传值”是传递参数的一个拷贝,被调用程序改变这个参数不影响调用程序;“传址”时,被调用程序可能修改通过地址引用的变量内容。
⑧ INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含的是子程序库文件。⑨ 取长补短。
⑩ Windows程序在运行时需要加载其配套的动态链接库DLL文件,当其没有被搜索到时就会提示不存在。
〔习题4.2〕判断题 〔解答〕
① 对 ② 错 ③ 错 ④ 错 ⑤ 错 ⑥ 对 ⑦ 对 ⑧ 错 ⑨ 对 ⑩ 错 〔习题4.3〕填空题 〔解答〕
① 相对寻址,间接寻址,直接寻址,间接寻址 ② 1256H,3280H ③ 3721H,1 ④ EAH ⑤ 循环初始,循环控制 ⑥ REPT1标号的地址 ⑦ TEST ENDP,ENDM ⑧ EBP ⑨ PUBLIC,EXTERN ⑩ 38H 0DH 0AH 〔习题4.4〕
为了验证例题4-1程序的执行路径,可以在每个标号前后增加显示功能。例如使得程序运行后显示数码1234。〔解答〕
jmp labl1;相对寻址
nop mov eax,'?' call dispc labl1: mov eax,'1' call dispc jmp near ptr labl2;相对近转移
nop mov eax,'?' call dispc labl2: mov eax,'2' call dispc mov eax,offset labl3
jmp eax;寄存器间接寻址
nop mov eax,'?' call dispc labl3: mov eax,'3' call dispc mov eax,offset labl4 mov nvar,eax jmp nvar;存储器间接寻址
nop mov eax,'?' call dispc labl4: mov eax,'4' call dispc 〔习题4.5〕
使用“SHR EAX,2”将EAX中的D1位移入CF标志,然后用JC/JNC指令替代JZ/JNZ指令完成例题4-3的功能。〔解答〕
mov eax,56h;假设一个数据
shr eax,2;D1位移入CF标志
jnc nom;D1=0条件成立,转移
...;余同原程序 〔习题4.6〕 执行如下程序片断后,CMP指令分别使得5个状态标志CF、ZF、SF、OF和PF为0还是为1?它会使得哪些条件转移指令指令Jcc的条件成立、发生转移?
mov eax,20h cmp eax,80h 〔解答〕
CF=1 ZF=0 SF=1 OF=0 PF=1 可以使得条件成立、发生转移的指令有:JC JS JP JNZ JNO 〔习题4.7〕
将例题4-4程序修改为实现偶校验。建议进一步增加显示有关提示信息的功能,使得程序具有更加良好的交互性。〔解答〕
include io32.inc.data msg1 byte 'Please input a character: ',0 msg2 byte 'The ASCII code of the charater you entered is: ',0 msg3 byte 'The code with even parity is: ',0.code start: mov eax,offset msg1 call dispmsg call readc call dispcrlf mov ebx,eax mov eax,offset msg2 call dispmsg mov eax,ebx call dispbb call dispcrlf and al,7fh jp next or al,80h next: mov ebx,eax mov eax,offset msg3 call dispmsg mov eax,ebx call dispbb exit 0 end start 〔习题4.8〕
在采用奇偶校验传输数据的接收端应该验证数据传输的正确性。例如,如果采用偶校验,那么在接收到的数据中,其包含“1”的个数应该为0或偶数个,否则说明出现传输错误。现在,在接收端编写一个这样的程序,如果偶校验不正确显示错误信息,传输正确则继续。假设传送字节数据、最高位作为校验位,接收到的数据已经保存在Rdata变量中。〔解答〕
;数据段 Rdata byte 57h;保存接收的数据 error byte 'Error!',0;代码段 mov al,Rdata and al,0ffh;标志PF反映“1”的个数
jp done;个数为偶数,正确继续
mov eax,offset error;个数为奇数,显示出错
call dispmsg done:
〔习题4.9〕
指令CDQ将EAX符号扩展到EDX,即:EAX最高为0,则EDX=0;EAX最高为1,则EDX=FFFFFFFFH。请编程实现该指令功能。〔解答1〕
test eax,8000h;测试最高位
jz next1;最高位为0(ZF=1),转移到标号NEXT1 mov edx,0ffffffffh;最高位为1,顺序执行:设置EDX=FFFFFFFFH jmp done;无条件转移,跳过另一个分支
next1: mov dx,0;最高位为0转移到此执行:设置EDX=0 done: 〔解答2〕
使用移位指令更好。
rol eax,1 rcr edx,1 sar edx,31 ror eax,1 〔习题4.10〕
编程,首先测试双字变量DVAR的最高位,如果为1,则显示字母“L”;如果最高位不为1,则继续测试最低位,如果最低位为1,则显示字母“R”;如果最低位也不为1,则显示字母“M”。〔解答〕
;数据段 dvar dword 57h;代码段
mov eax,dvar test eax,80000000h jnz nextl test eax,1 jnz nextr mov al,'M' jmp done nextl: mov al,'L' jmp done nextr: mov al,'R' done: call dispc 〔习题4.11〕编写一个程序,先提示输入数字“Input Number:0~9”,然后在下一行显示输入的数字,结束;如果不是键入了0~9数字,就提示错误“Error!”,继续等待输入数字。〔解答〕
;数据段
inmsg byte 'Input number(0~9): ',0 ermsg byte 0dh,0ah,'Error!Input again: ',0;代码段
mov eax,offset inmsg;提示输入数字 call dispmsg again: call readc;等待按键
cmp al,'0';数字 < 0?
jb erdisp cmp al,'9';数字 > 9?
ja erdisp call dispcrlf call dispc jmp done erdisp: mov eax,offset ermsg call dispmsg jmp again done:
〔习题4.12〕
有一个首地址为ARRAY的20个双字的数组,说明下列程序段的功能。
mov ecx,20 mov eax,0 mov esi,eax sumlp: add eax,array[esi] add esi,4 loop sumlp mov total,eax 〔解答〕
求这20个双字的和,保存在TOTAL变量,不关进心进位和溢出。〔习题4.13〕
编程中经常要记录某个字符出现的次数。现编程记录某个字符串中空格出现的次数,结果保存在SPACE单元。〔解答〕
;数据段
string byte 'Do you have fun with Assembly ?',0;以0结尾的字符串 space dword ?;代码段
mov esi,offset string xor ebx,ebx;EBX用于记录空格数 again: mov al,[esi] cmp al,0 jz done cmp al,20h;空格的ASCII码是20H jne next;不相等、不是空格,转移
inc bx;相等、是空格,空格个数加1 next: inc esi jmp again;继续循环
done: mov space,ebx;保存结果 〔习题4.14〕
编写计算100个16位正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到WORDSUM,如超过则显示‘Overflow!’。〔解答〕
;数据段 array word 2005,2008,98 dup(1394);假设100个16位正整数 wordsum word ? error byte 'Overflow!',0;代码段
and ebx,0 mov ecx,100 xor ax,ax again: add ax,array[ebx*2] jc over inc ebx loop again mov wordsum,ax over: mov eax,offset error call dispmsg 〔习题4.15〕
在一个已知长度的字符串中查找是否包含“BUG”子字符串。如果存在,显示“Y”,否则显示“N”。〔解答〕
;数据段
string byte 'If you find any error in the program, you can DEBUG it.' count = sizeof string bug byte 'BUG';代码段
mov ecx,count mov edi,offset string L1: mov esi,offset bug push edi mov edx,sizeof bug LN: mov al,[esi] cmp [edi],al jne L2 inc esi inc edi dec edx jne LN pop edi mov al,'Y' jmp L3 L2: pop edi inc edi loop L1 mov al,'N' L3: call dispc 〔习题4.16〕
主存中有一个8位压缩BCD码数据,保存在一个双字变量中。现在需要进行显示,但要求不显示前导0。由于位数较多,需要利用循环实现,但如何处理前导0和数据中间的0呢?不妨设置一个标记。编程实现。〔解答〕
;数据段 bcd dword 00371002h;代码段
mov esi,bcd cmp esi,0 jnz goon mov al,'0' call dispc jmp done goon: mov ecx,8 xor ebx,ebx;EBX=0,表示可能是前导0 again: rol esi,4 mov eax,esi and eax,0fh;EAX低4位保存当前要显示的BCD码
cmp ebx,0;EBX≠0,说明不是前导0,要显示
jnz disp;EBX=0,说明可能是前导0 cmp eax,0
jz next;EAX=0,说明是前导0,不显示
mov ebx,1;EAX≠0,没有前导0了,令EBX=1≠0 disp: add al,30h call dispc next: loop again done:
〔习题4.17〕
已知一个字符串的长度,剔除其中所有的空格字符。请从字符串最后一个字符开始逐个向前判断、并进行处理。〔解答〕
;数据段
string byte 'Let us have a try!',0dh,0ah,0;代码段
mov ecx,sizeof string cmp ecx,2 jb done lea eax,string;显示处理前的字符串
call dispmsg mov esi,ecx dec esi outlp: cmp string[esi],' ';检测是否是空格
jnz next;不是空格继续循环
mov edi,esi;是空格,进入剔除空格分支
dec ecx inlp: inc edi mov al,string[edi];前移一个位置
mov string[edi-1],al cmp edi,ecx jb inlp next: dec esi;继续进行
cmp esi,0 jnz outlp;为0结束 lea eax,string;显示处理后的字符串
call dispmsg done:
〔习题4.18〕
第3章习题3.14在屏幕上显示ASCII表,现仅在数据段设置表格缓冲区,编程将ASCII代码值填入留出位置的表格,然后调用显示功能实现(需要利用双重循环)。〔解答〕
include io32.inc.data table byte '
|0 1 2 3 4 5 6 7 8 9 A B C D E F',13,10 byte '---+',13,10 tab1byte 6 dup(36 dup(?),13,10)
byte 0.code start: mov ebx,offset tab1 mov edx,'| 02' mov ax,2020h mov esi,6 again0: mov [ebx],edx add ebx,4 mov ecx,16 again1: mov word ptr [ebx],ax add ebx,2 inc al loop again1
add ebx,2 add edx,1 dec esi jnz again0
mov eax,offset table call dispmsg exit 0 end start 〔习题4.19〕
请按如下说明编写子程序:
子程序功能:把用ASCII码表示的两位十进制数转换为压缩BCD码 入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码 出口参数:AL=对应BCD码 〔解答〕 asctob proc shl dh,4 mov al,dh and dl,0fh or al,dl ret asctob endp 〔习题4.20〕
乘法的非压缩BCD码调整指令AAM执行的操作是:AH←AL÷10的商,AL←AL÷10的余数。利用AAM可以实现将AL中的100内数据转换为ASCII码,程序如下:
xor ah,ah aam add ax,3030h 利用这段程序,编写一个显示AL中数值(0~99)的子程序。〔解答〕 disp99 proc xor ah,ah aam add ax,3030h push ax mov al,ah call dispc pop ax call dispc ret disp99 endp 〔习题4.21〕
编写一个源程序,在键盘上按一个键,将其返回的ASCII码值显示出来,如果按下ESC键(对应ASCII码是1BH)则程序退出。请调用书中的HTOASC子程序。〔解答〕
;代码段,主程序 again: call readc cmp al,1bh jz done mov bl,al mov al,':' call dispc mov al,bl rol al,4 call htoasc;调用子程序
call dispc;显示一个字符
mov al,bl call htoasc;调用子程序
call dispc;显示一个字符
call dispcrlf jmp again done:
〔习题4.22〕
编写一个子程序,它以二进制形式显示EAX中32位数据,并设计一个主程序验证。〔解答〕
;代码段,主程序
mov eax,8F98FF00H call dispbd;调用子程序;代码段,子程序 dispbd proc;32位二进制数的输出
push ecx push edx mov ecx,32;要输出的字符个数 dbd: rol eax,1;AL循环左移一位
push eax and al,01h;取AL最低位
add al,30h;转化成相应的ASCLL码值
call dispc;以二进制的形式显示
pop eax loop dbd pop edx pop ecx ret dispbd endp 〔习题4.23〕
将例题4-16的32位寄存器改用16位寄存器,仅实现输出-215~+215-1之间的数据。〔解答〕
;数据段
array word 12345,-1234,32767,-32768,0,667 writebuf byte 6 dup(0);代码段,主程序
mov ecx,lengthof array mov ebx,0 again:
mov ax,array[ebx*2]
call write
call dispcrlf
inc ebx
;此时ebx代表array中的第几个数
dec ecx
;此时ecx代表循环的次数
jnz again;代码段,子程序
write proc
;子程序开始
push ebx
push ecx
push edx
mov ebx,offset writebuf
;ebx指向显示缓冲区
test ax,ax
jnz write1
mov byte ptr [ebx],30h
inc ebx
jmp write5 write1:
;若不为0则首先判断是正是负
jns write2
;若为正则跳过下面两步到write2
mov byte ptr [ebx],'-'
inc ebx
neg ax write2:
mov cx,10
push cx
;将cx=10压入栈,作为退出标志
write3:
;write3是让eax循环除以10并把余数的ASCII码压入栈
cmp ax,0
jz write4
xor dx,dx
div cx
add dx,30h
push dx
jmp write3 write4:
;余数的ASCII码出栈,遇到10终止并转到write5显示结果
pop dx
cmp dx,cx
jz write5
mov byte ptr [ebx],dl
inc ebx
jmp write4 write5:
;显示结果
mov byte ptr [ebx],0
mov eax,offset writebuf
call dispmsg
pop edx
pop ecx
pop ebx
ret write endp 〔习题4.24〕
参考例题4-17,编写实现32位无符号整数输入的子程序,并设计一个主程序验证。〔解答〕
;数据段 count =10 array dword count dup(0)temp dword ? readbuf byte 30 dup(0)errmsg byte 'Input error,enter again!',13,10,0 msg1 byte 'Input ten unsigned numbers,each number ends with enter key:',13,10,0 msg2 byte 'Check the numbers your inputted:',13,10,0;代码段,主程序
mov eax,offset msg1
call dispmsg
mov ecx,count
mov ebx,offset array again:
call read
mov eax,temp
mov [ebx],eax
add ebx,4
dec ecx
jnz again
mov eax,offset msg2
call dispmsg
mov edx,offset array
mov ecx,count next:
mov eax,[edx]
call dispuid
call dispcrlf
add edx,4
dec ecx
jnz next;代码段,子程序 read
proc
push eax
push ecx
push ebx
push edx read0:
mov eax,offset readbuf
call readmsg
test eax,eax
jz readerr
cmp eax,12
ja readerr
mov edx,offset readbuf
xor ebx,ebx
xor ecx,ecx
mov al,[edx]
cmp al,'+'
jz read1
cmp al,'-'
jnz read2
jmp readerr read1:
inc edx
mov al,[edx]
test al,al
jz read3
;如果为0,则说明该字符串已结束 read2:
cmp al,'0'
jb readerr
cmp al,'9'
ja readerr
sub al,30h
imul ebx,10
;ebx用来存储处理过的数据
jc readerr
movzx eax,al
add ebx,eax
jnc read1 readerr:
mov eax,offset errmsg
call dispmsg
jmp read0 read3:
mov temp,ebx
pop edx
pop ebx
pop ecx
pop eax
ret read
endp 〔习题4.25〕
编写一个计算字节校验和的子程序。所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。主程序提供入口参数,有数据个数和数据缓冲区的首地址。子程序回送求和结果这个出口参数。〔解答〕
;计算字节校验和的通用过程
;入口参数:DS:EBX=数组的段地址:偏移地址,ECX=元素个数
;出口参数:AL=校验和
;说明:除EAX/EBX/ECX外,不影响其他寄存器 checksum proc xor al,al;累加器清0 sum: add al,[ebx];求和
inc ebx;指向下一个字节
loop sum ret checksum endp 〔习题4.26〕
编制3个子程序把一个32位二进制数用8位十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。(1)采用EAX寄存器传递这个32位二进制数(2)采用temp变量传递这个32位二进制数(3)采用堆栈方法传递这个32位二进制数 〔解答〕(1)
;数据段
wvar word 307281AFH;代码段,主程序
mov eax,wvar call disp mov al,'H' call dispc;代码段,子程序 disp proc push ebx push ecx mov ecx,8;8位 dhw1: rol eax,4 mov ebx,eax and al,0fh;转换为ASCII码
add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc mov eax,ebx loop dhw1 pop ecx pop ebx ret disp endp
(2)
;数据段
wvar word 307281AFH temp word ?;代码段,主程序
mov eax,wvar mov temp,eax call disp mov al,'H' call dispc;代码段,子程序 disp proc push ebx push ecx mov ecx,8;8位
mov eax,temp dhw1: rol eax,4 mov ebx,eax and al,0fh;转换为ASCII码
add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc
;显示一个字符
mov eax,ebx loop dhw1 pop ecx pop ebx ret disp endp(3)
;数据段
wvar word 307281AFH;代码段,主程序
push wvar call disp add esp,4 mov al,'H' call dispc;代码段,子程序 disp proc push ebp mov ebp,esp push ebx push ecx mov ecx,8;8位
mov eax,[ebp+8] dhw1: rol eax,4 mov ebx,eax and al,0fh;转换为ASCII码
add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc mov eax,ebx loop dhw1 pop ecx pop ebx pop ebp ret disp endp 〔习题4.27〕
配合例题4-11的简单加密解密程序,设计一个输入密码的程序,将输入的若干字符经过适当算法得到一个字节量密码。〔解答〕;ex0427.asm include io32.inc.data key byte ? msg0 byte 'Enter your password:',0 passw byte 50 dup(0)errormsg byte 'Password error, input again!',13,10,0 bufnum = 255 buffer byte bufnum+1 dup(0);定义键盘输入需要的缓冲区 msg1 byte 'Enter messge: ',0 msg2 byte 'Encrypted message: ',0 msg3 byte 'Original messge: ',0.code start: mov eax,offset msg0;提示输入加密密码
call dispmsg mov eax,offset passw;设置入口参数EAX call readmsg;调用输入字符串子程序输入密码
mov ecx,eax dec ecx xor ebx,ebx mov al,passw[ebx] again0: inc ebx xor al,passw[ebx];使用简单的异或方法得到加密关键字
loop again0 mov key,al;保存加密关键字
mov eax,offset msg1;提示输入字符串
call dispmsg mov eax,offset buffer;设置入口参数EAX call readmsg;调用输入字符串子程序
push eax;字符个数保存进入堆栈
mov ecx,eax;ECX=实际输入的字符个数,作为循环的次数
xor ebx,ebx;EBX指向输入字符 encrypt: mov al,key;AL=加密关键字
xor buffer[ebx],al;异或加密
inc ebx dec ecx;等同于指令:loop encrypt jnz encrypt;处理下一个字符
mov eax,offset msg2 call dispmsg mov eax,offset buffer;显示加密后的密文
call dispmsg call dispcrlf;again: mov eax,offset msg0;提示输入解密密码
call dispmsg mov eax,offset passw;设置入口参数EAX call readmsg;调用输入字符串子程序输入密码
mov ecx,eax dec ecx xor ebx,ebx mov al,passw[ebx] again1: inc ebx xor al,passw[ebx];使用简单的异或方法得到加密关键字
loop again1 cmp key,al;与原加密关键字比较
jz next;密码相同,则进行解密
mov eax,offset errormsg;提示输入解密密码错误 call dispmsg jmp again
next: pop ecx;从堆栈弹出字符个数,作为循环的次数
xor ebx,ebx;EBX指向输入字符 decrypt: mov al,key;AL=解密关键字
xor buffer[ebx],al;异或解密
inc ebx dec ecx jnz decrypt;处理下一个字符
mov eax,offset msg3 call dispmsg mov eax,offset buffer;显示解密后的明文
call dispmsg 〔习题4.28〕
设计一个简单的两个整数的加法器程序。〔解答〕;ex0428.asm include io32.inc.data msg1 byte 'Enter the integers:',13,10,0 msg2 byte 13,10,'Enter space to continue!Enter any other key to exit!',13,10,0
.code start: mov eax,offset msg1 call dispmsg call readsid
mov ebx,eax mov al,'+' call dispc call dispcrlf
call readsid add ebx,eax mov al,'=' call dispc mov eax,ebx call dispsid call dispcrlf
mov eax,offset msg2 call dispmsg call readc cmp al,20h je start
exit 0 end start 〔习题4.29〕
利用十六进制字节显示子程序DISPHB设计一个从低地址到高地址逐个字节显示某个主存区域内容的子程序DISPMEM。其入口参数:EAX=主存偏移地址,ECX=字节个数(主存区域的长度)。同时编写一个主程序进行验证。〔解答〕
;ex0429.asm in Windows Console include io32.inc.data var byte 'This is a test!'.code start:;主程序
mov eax,offset var mov ecx,sizeof var call dispmem exit 0;子程序 dispmem proc push ebx mov ebx,eax dispm1: mov al,[ebx] call disphb mov al,' ' call dispc inc ebx loop dispm1 pop ebx ret dispmem endp end start 〔习题4.30〕
将例题4-19分别使用子程序模块、子程序库和子程序库包含方法生成最终可执行文件。〔习题4.31〕
区别如下概念:宏定义、宏调用、宏指令、宏展开、宏汇编。〔解答〕
宏定义:就是对宏进行说明,由一对宏汇编伪指令MACRO和ENDM来完成。宏调用:宏定义之后的使用。在使用宏指令的位置写下宏名,后跟实体参数。宏指令:使用宏时,其形式很像指令,所以称为宏指令。
宏展开:在汇编时,汇编程序用对应的代码序列替代宏指令。宏汇编:指使用宏的方法进行汇编语言程序设计。〔习题4.32〕
直接使用控制台输入和输出函数实现例题4-21的功能(不使用READMSG和DISPMSG子程序)。〔解答〕
〔习题4.33〕
直接使用控制台输出函数实现某个主存区域内容的显示(习题4.29的功能)。可以改进显示形式,例如每行显示16个字节(128位),每行开始先显示首个主存单元的偏移地址,然后用冒号分隔主存内容。〔解答〕
〔习题4.34〕
如何进行很简单的修改,使得例题4-22程序的消息窗有“OK”和“Cancel”两个按钮。〔解答〕
将MB_OK常量定义为1,即: MB_OK equ 1 〔习题4.35〕
上机实践例题4-23和例题4-24,并在创建可执行文件的过程中生成汇编语言列表文件。〔习题4.36〕
Pentium处理器含有一个64位的时间标记计数器(Time-Stamp Counter)。该计数器每个时钟周期递增(加1);在上电和复位后,该计数器清0。指令“RDTSC”执行后将在EDX(高32位)和EAX(低32位)返回当前的64位时间标记计数器值。利用RDTSC指令在某个函数运行前获得时间标记计数器值,然后运行该函数后,立即再次执行RDTSC指令,并将再次获得的时间标记计数器值与之前的计数值相减,得到的差值就是运行该函数需要的时钟周期数(乘以时钟周期,等于运行时间)。请利用混合编程方法显示某个函数的运行时钟周期数。〔解答〕
第5章 微机总线 〔习题5.1〕简答题 〔解答〕
① 数据总线承担着处理器与存储器、外设之间的数据交换,既可以输入也可以输出,故其是双向的。
② 为减少引脚个数,8086采用了地址总线和数据总线分时复用。即数据总线在不同时刻还具有地址总线的功能。
③ 具有三态能力的引脚当输出呈现高阻状态时,相当于连接了一个阻抗很高的外部器件,信号无法正常输出;即放弃对该引脚的控制,与其他部件断开连接。
④ 处理器的运行速度远远快于存储器和I/O端口。处理器检测到存储器或I/O端口不能按基本的总线周期进行数据交换时,插入一个等待状态Tw。等待状态实际上是一个保持总线信号状态不变的时钟周期。
⑤ 猝发传送是处理器只提供首地址、但可以从后续连续的存储单元中读写多个数据。
⑥ 总线上可能连接多个需要控制总线的主设备,需要确定当前需要控制总线的主设备,所以需要总线仲裁。
⑦ 异步时序是由总线握手(Handshake)联络(应答)信号控制,不是由总线时钟控制。故总线时钟信号可有可无。
⑧ 单总线结构限制了许多需要高速传输速度的部件。32位PC机采用多种总线并存的系统结构。各种专用局部总线源于处理器芯片总线,以接近处理器芯片引脚的速度传输数据,它为高速外设提供速度快、性能高的共用通道。⑨ 4个。
⑩ 即插即用技术是指32位PC机的主板、操作系统和总线设备配合,实现自动配置功能。〔习题5.2〕判断题 〔解答〕
① 对 ② 对 ③ 错 ④ 对 ⑤ 对 ⑥ 错 ⑦ 对 ⑧ 对 ⑨ 对 ⑩ 错 〔习题5.3〕填空题 〔解答〕 ① 0 ② 读,写 ③ 存储器读,存储器读,存储器写 ④ 4,2,10ns ⑤ 低有效,0010 ⑥ 寻址,数据传送
⑦ 127,1.5Mb/s,12Mb/s ⑧ 地址,数据 ⑨,⑩,I/O CH RDY 〔习题5.4〕
处理器有哪4种最基本的总线操作(周期)? 〔解答〕
存储器读、存储器写,I/O读、I/O写。〔习题5.5〕
8086处理器的输入控制信号有RESET,HOLD,NMI和INTR,其含义各是什么?当它们有效时,8086 CPU将出现何种反应? 〔解答〕
RESET:复位输入信号,高电平有效。该引脚有效时,将迫使处理器回到其初始状态;转为无效时,CPU重新开始工作。
HOLD:总线请求,是一个高电平有效的输入信号。该引脚有效时,表示其他总线主控设备向处理器申请使用原来由处理器控制的总线。
NMI:不可屏蔽中断请求,是一个利用上升沿有效的输入信号。该引脚信号有效时,表示外界向CPU申请不可屏蔽中断。
INTR:可屏蔽中断请求,是一个高电平有效的输入信号。该引脚信号有效时,表示中断请求设备向处理器申请可屏蔽中断。〔习题5.6〕
区别概念:指令周期、总线周期(机器周期)、时钟周期、T状态。〔解答〕
指令周期:一条指令从取指、译码到最终执行完成的过程。总线周期(机器周期):有数据交换的总线操作。
时钟周期:处理器的基本工作节拍,由时钟信号产生,一个高电平和一个低电平为一个周期。T状态:完成特定操作的一个时钟周期。由于时间上一个T状态等于一个时钟周期,所以常常将两者混为一谈。〔习题5.7〕
总结8086各个T状态的主要功能。〔解答〕
T1状态:总线周期的第一个时钟周期主要用于输出存储器地址或I/O地址; T2状态:输出读/写控制信号。
T3状态:锁存地址、处理器提供的控制信号和数据在总线上继续维持有效,且T3时钟的前沿(下降沿)对READY引脚进行检测。READY信号有效,进入T4周期。
T4状态:总线周期的最后一个时钟周期,处理器和存储器或I/O端口继续进行数据传送,直到完成,并为下一个总线周期做好准备。
Tw状态:等待状态。处理器在T3前沿发现READY信号无效后,插入Tw。Tw状态的引脚信号延续T3时的状态、维持不变。〔习题5.8〕
请解释8086(最小组态)以下引脚信号的含义:CLK,A19/S6~A16/S3,AD15~AD0,ALE,和。默画它们在具有一个等待状态的存储器读总线周期中的波形示意。〔解答〕
CLK:时钟输入。时钟信号是一个频率稳定的数字信号,其频率就是处理器的工作频率,工作频率的倒数就是时钟周期的时间长度。
A19/S6~A16/S3:地址/状态分时复用引脚,是一组4个具有三态能力的输出信号。这些引脚在访问存储器的第一个时钟周期输出高4位地址A19~A16,在访问外设的第一个时钟周期输出低电平无效;其他时间输出状态信号S6~S3。
AD15~AD0:地址/数据分时复用引脚,共16个引脚,用作地址总线时是单向输出信号;用作数据总线时是双向信号,具有三态输出能力。
ALE:地址锁存允许,是一个三态、输出、高电平有效的信号。有效时,表示复用引脚(AD15~AD0和A19/S6~A16/S3)上正在传送地址信号。
:访问存储器或者I/O,是一个三态输出信号,该引脚高电平时,表示处理器将访问存储器,此时地址总线A19~A0提供20位的存储器物理地址。该引脚低电平时,表示处理器将访问I/O端口,此时地址总线A15~A0提供16位的I/O地址。
:读控制,也是一个三态、输出低电平有效信号。有效时,表示处理器正在从存储单元或I/O端口读取数据。
:写控制,是一个三态、输出低电平有效信号。有效时,表示处理器正将数据写到存储单元或I/O端口。
〔习题5.9〕
区别如下总线概念:芯片总线、局部总线、系统总线;并行总线、串行总线;地址总线、数据总线、控制总线;ISA总线、PCI总线。〔解答〕
芯片总线:是指大规模集成电路芯片内部,或系统中各种不同器件连接在一起的总线;用于芯片级互连。
局部总线:位于处理器附件的器件相互连接的总线,相对于芯片总线。系统总线:通常是指微机系统的主要总线。并行总线:采用并行传输方式的总线。
串行总线:将多位数据按二进制位的顺序在数据线上逐位传送的总线。地址总线:实现地址信息互连和交换的一组导线。数据总线:实现数据信息互连和交换的一组导线。
控制总线:控制协调处理器和内存、外设交互信息的一组导线。
ISA总线:即IBM PC/AT总线,以处理器80286引脚形成的总线,分成支持8位操作的前62信号和扩展16位操作的后36信号。
PCI总线:外设部件互连总线,不仅适用于IA-32处理器,也适用其它处理器,支持32位和64位操作,广泛用于32位通用微型计算机中。〔习题5.10〕
什么是同步时序、半同步时序和异步时序? 〔解答〕
同步时序:总线操作的各个过程由共用的总线时钟信号控制。半同步时序:总线操作仍由共用的总线时钟信号控制,但慢速模块可以通过等待信号让快速模块等待。
异步时序:总线操作需要握手(Handshake)联络(应答)信号控制,总线时钟信号可有可无。〔习题5.11〕
EISA总线的时钟频率是8MHz,每2个时钟可以传送一个32位数据,计算其总线带宽。〔解答〕
(32×8)÷(2×8)=16MBps 〔习题5.12〕
PCI总线有什么特点? 〔解答〕
PCI总线与处理器无关,具有32位和64位数据总线,有+5V和+3.3V两种设计,采用集中式总线仲裁、支持多处理器系统,通过桥(Bridge)电路兼容ISA/EISA总线,具有即插即用的自动配置能力等一系列优势。〔习题5.13〕
PCI总线操作如何插入等待状态? 〔解答〕
主设备利用IRDY#信号无效、从设备利用TRDY#信号无效要求对方等待,即插入等待状态。〔习题5.14〕
什么是USB总线支持的“热插拔”,这个特性有什么意义? 〔解答〕
“热插拔”是在PC机正常工作状态进行插入或拔出。这个特性可以使用户随时连接USB设备。〔习题5.15〕
简述USB总线的主要特征?
〔解答〕
使用方便、扩充能力强。
支持多种传输速度、适用面广。
低功耗、低成本、占用系统资源少。〔习题5.16〕
USB总线的集线器有什么作用?主机上是否需要集线器? 〔解答〕
集线器是专门用于提供额外USB接入点的USB设备。主机需要集线器,被称为根集线器。〔习题5.17〕
USB总线协议支持哪几种数据传输方式?简述之。〔解答〕
USB的数据传输有4种:
控制传输——在USB设备初次安装时,USB系统软件使用控制传输方式设置USB设备参数、发送控制指令、查询状态等。批量传输——对于打印机、扫描仪等设备需要传输大量数据,可以使用批量传输方式连续传输一批数据。
中断传输——该方式传输的数据量很小,但需要及时处理,以保证实时性,主要用于键盘、鼠标等设备上。
同步传输——该方式以稳定的速率发送和接收信息,保证数据的连续和及时,用于数据传输正确性要求不高而对实时性要求高的外设,例如麦克风、喇叭、电话等。第6章 存储系统 〔习题6.1〕简答题 〔解答〕
① 因为各种存储器件在容量、速度和价格方面存在矛盾。速度快,则单位价格高;容量大,单位价格低,但存取速度慢。故存储系统不能采用一种存储器件。
② Cache中复制着主存的部分内容。当处理器试图读取主存的某个字时,Cache控制器首先检查Cache中是否已包含有这个字。若有,则处理器直接读取Cache,这种情况称为高速命中;若无,则称为高速缺失。
③ 标签存储器保存着该数据所在主存的地址信息。④ 主存块与Cache行之间的对应关系称“地址映射”,Cache通过地址映射确定一个主存块应放到哪个Cache行组中。
⑤ 写入策略用于解决写入Cache时引起主存和Cache内容不一致性的问题。
⑥ 存取时间是指从读/写命令发出,到数据传输操作完成所经历的时间;存取周期表示两次存储器访问所允许的最小时间间隔。存取周期大于等于存取时间。
⑦ 虚拟存储器是由操作系统利用辅助存储器、以磁盘文件形式建立的、在主存储器与辅助存储器之间的一个存储器。⑧ DRAM芯片容量大、芯片小,高集成度,引脚数量少。故DRAM芯片将地址引脚分时复用,即用一组地址引脚传送两批地址。第一批地址称行地址,第二批地址称列地址。
⑨ 译码电路中只有部分地址线参与译码会造成地址重复,也就是一个存储单元占有多个存储器地址。
⑩页表项的P位称为存在位(Present),表示该页面是否在物理存储器中。〔习题6.2〕判断题。
〔解答〕
① 错 ② 对 ③ 对 ④ 对 ⑤ 对 ⑥ 错 ⑦ 错 ⑧ 对 ⑨ 错 ⑩ 对 〔习题6.3〕填空题 〔解答〕
① 8,1024,1024,1024,1024,240 ② 8KB,4 ③ 随机存取存储器,丢失,只读存储器,读取,不会丢失 ④ 8,13,8 ⑤ 2 ⑥(UV-)EPROM,Flash Memory ⑦ 58000H,5FFFFH,32KB ⑧ 32,4,64,8 ⑨ 直接映射,组合相关映射,全相关映射,2路组合相关映射 ⑩ 00820000H,02000H 〔习题6.4〕
举例说明存储访问的局部性原理。〔解答〕
处理器访问存储器时,无论是读取指令还是存取数据,所访问的存储单元在一段时间内都趋向于一个较小的连续区域中,这就是存储访问的局部性原理。例如,求平均值的函数。long mean(long d[], long num){
long i,temp=0;
for(i=0;i temp=temp/num; return(temp);} 函数中的变量temp体现了时间局部,因为每次循环都要使用它。顺序访问数组d[]的各个元素(相邻存放在主存),体现了空间局部。循环体内的指令顺序存放,依次读取执行体现了空间局部;同时重复执行循环体,又体现了时间局部。〔习题6.5〕 简述存储系统的层次结构及各层存储部件特点。〔解答〕 为解决容量、速度和价格的矛盾,存储系统采用金字塔型层次结构,单位价格和速度自上而下逐层减少,容量自上而下逐层增加。 存储系统的各层存储部件自上而下依次是:CPU寄存器、高速缓存、主存存储器(RAM/ROM),辅助存储器如磁盘、光盘等。CPU寄存器、高速缓存器集成在CPU芯片上,对用户来说,是透明的,它们用于暂存主存和处理器交互的数据,以减少频繁读取主存而影响处理器速度;主存储器则可和处理器直接交换数据,而辅助存储器必须经过主存存储器,才可与处理器进行数据交换。〔习题6.6〕 在半导体存储器件中,什么是SRAM、DRAM和NVRAM? 〔解答〕 SRAM是静态读写存储器芯片,它以触发器为基本存储单元,以其两种稳定状态表示逻辑0和逻辑1。 DRAM是动态读写存储器芯片,它以单个MOS管为基本存储单元,以极间电容充放电表示两种逻辑状态,需要不断刷新保持信息正确。 NVRAM多指带有后备电池的SRAM芯片,这种芯片采用CMOS制造工艺设计以减少用电。〔习题6.7〕 SRAM芯片的片选信号有什么用途?对应读写控制的信号是什么? 〔解答〕 片选信号:片选有效时,才可以对该芯片进行读/写操作;无效时,数据引脚呈现高阻状态、与系统数据总线隔离,并可降低内部功耗。 读控制信号:在芯片被选中的前提下,若有效,则芯片将允许地址信号选择的存储单元内的数据输出到数据引脚上。 写控制信号:在芯片被选中的前提下,若有效,则芯片将数据引脚上的数据写入地址信号选择的存储单元内。〔习题6.8〕 DRAM为什么要刷新,存储系统如何进行刷新? 〔解答〕 DRAM以单个MOS管为基本存储单元,以极间电容充放电表示两种逻辑状态。由于极间电容的容量很小,充电电荷自然泄漏会很快导致信息丢失,所以要不断对它进行刷新操作、即读取原内容、放大再写入。 存储系统的刷新控制电路提供刷新行地址,将存储DRAM芯片中的某一行选中刷新。实际上,刷新控制电路是将刷新行地址同时送达存储系统中所有DRAM芯片,所有DRAM芯片都在同时进行一行的刷新操作。 刷新控制电路设置每次行地址增量,并在一定时间间隔内启动一次刷新操作,就能够保证所有DRAM芯片的所有存储单元得到及时刷新。〔习题6.9〕 什么是掩摸ROM、OTP-ROM、EPROM、EEPROM和Flash ROM? 〔解答〕 掩膜ROM:通过掩膜工艺、将要保存的信息直接制作在芯片当中,以后再也不能更改。OTP-ROM:该类芯片出厂时存储的信息为全“1”,允许用户进行一次性编程,此后便不能更改。EPROM:一般指可用紫外光擦除、并可重复编程的ROM。 EEPROM:也常表达为E2PROM,其擦除和编程(即擦写)通过加电的方法来进行,可实现“在线编程”和“在应用编程” Flash ROM:是一种新型的电擦除可编程ROM芯片,能够很快擦除整个芯片内容。〔习题6.10〕 请给出教材图6-7中138译码器的所有译码输出引脚对应的地址范围。〔解答〕 ~的地址范围依次是: E0000H~E3FFFH,E4000H~E7FFFH,E8000H~EBFFFH,EC000H~EFFFFH,F0000H~F3FFFH,F4000H~F7FFFH,F8000H~FBFFFH,FC000H~FFFFFH。〔习题6.11〕 什么是存储器芯片的全译码和部分译码?各有什么特点? 〔解答〕 全译码:使用全部系统地址总线进行译码。特点是地址唯一,一个存储单元只对应一个存储器地址(反之亦然),组成的存储系统其地址空间连续。 部分译码:只使用部分系统地址总线进行译码。其特点:有一个没有被使用的地址信号就有两种编码,这两个编码指向同一个存储单元,出现地址重复。〔习题6.12〕 区别如下各个主存名称的含义:常规主存,扩展主存,扩充主存;上位主存区UMA和上位主存块UMB,高端主存区HMA,影子主存。〔解答〕 常规主存:8088和8086提供20个地址线A19~A0,寻址1MB的存贮空间,其中,最低640KB的系统RAM区被称为常规主存或基本主存。 扩展主存:IA-32处理器在1MB之后的主存空间都作为RAM区域使用,被称为扩展主存。扩充主存:处理器不可以直接访问,利用“体交换技术”实现处理器访问。 上位主存区UMA:在常规主存其后384KB(A0000H~FFFFFH)主存称为上位主存区UMA。上位主存块UMB:上位主存区UMA没有被使用部分,被开辟为上位主存块UMB。 高端主存区HMA:在实方式下,通过控制A20开放,程序可以访问的1MB之后的64KB区域。影子主存:PC机启动后可以将ROM-BIOS映射到RAM中,这部分用作ROM-BIOS、并被操作系统设置为只读的RAM区域。〔习题6.13〕 开机后,微机系统常需要检测主存储器是否正常。例如,可以先向所有存储单元写入数据55H(或00H)、然后读出看是否还是55H(或00H);接着再向所有存储单元写入数据AAH(或FFH)、然后读出看是否还是AAH(或FFH)。利用两个二进制各位互反的“花样”数据的反复写入、读出和比较就能够识别出有故障的存储单元。利用获得的有故障存储单元所在的物理地址,如果能够分析出该存储单元所在的存储器芯片,就可以实现芯片级的维修。试利用汇编语言编写一个检测常规主存最高64KB(逻辑地址从9000H∶0000H到9000H∶FFFFH)的程序,如果发现错误请显示其逻辑地址。〔解答〕 ;代码段 mov ax,9000h mov ds,ax mov ah,55h;先用55H push ax again: mov bx,0 mov al,ah again1: mov [bx],al;写入 dec bx jnz again1 again2: mov al,[bx];读出 cmp al,ah;检测 jz next2 dispcrlf push ax mov ax,ds call disphw;显示段地址 mov al,':' call dispc mov ax,bx call disphw;显示偏移地址 pop ax next2: dec bx jnz again2 pop ax cmp ah,0aah;后用0AAH jz done mov ah,0aah jmp again done: 〔习题6.14〕 什么是LRU替换算法?80486片内Cache中,如果3个替换算法位B2B1B0=010,则将替换哪个Cache行,并给出你的判断过程。〔解答〕 LRU算法是近期最少使用、即选择最长时间未被使用的数据块进行替换的算法。 B0=0,说明最近访问了L2/L3行,所以应该替换L0或L1行。B1=1,说明最近访问了L0行,所以应该替换L1。因为LRU算法是选择最长时间未被访问的Cache行进行替换。〔习题6.15〕 高速缓冲存储器Cache的写入策略是解决什么问题的?有哪两种写入策略,各自的写入策略是怎样的? 〔解答〕 写入策略用于在写命中时Cache与主存内容保持一致。 直写式写入策略指处理器对Cache写入的同时,将数据也写入到主存,这样来保证主存和Cache内容一致。它简单可靠。 回写Cache只有在行替换时才可能写入主存,写入主存的次数,会少于处理器实际执行的写入操作数。回写Cache的性能要高于直写Cache,但实现结构略为复杂。〔习题6.16〕 80486片上8KB Cache的标签存储器为什么只需要21位? 〔解答〕 80486片上Cache共有8KB容量,采用4路组合地址映射方式。对于4GB容量的主存来说,以Cache路为单位,可以分成4GB÷2KB=232÷211=221个Cache路。这样每个Cache行只要设计一个21位的标签存储器,记录该Cache行映射到哪个主存的Cache路。再结合直接映射的组号就可以明确该Cache行对应哪个主存块。〔习题6.17〕 高速缓存的写入操作有几个很近似的英文词汇,它们分别表示什么含义?(1)Write Through(2)Write Back(3)Write Around(4)Fetch on Write 〔解答〕 (1)Write Through:写命中时的直写策略。(2)Write Back:写命中时的回写策略。 (3)Write Around:写未命中时的不写分配法,即绕写法。(4)Fetch on Write:写未命中时的写分配法,即写时取法。〔习题6.18〕 区别如下高速缓存中的概念: (1)主存数据块Block(2)高速缓存行Line(3)高速缓存组Set(4)高速缓存路Way 〔解答〕 (1)主存数据块Block:高速缓存与主存间的数据传送以数据块(Block)为单位,例如B个字。主存数据块Block是主存中连续的B个字数据。 (2)高速缓存行Line:指高速缓存中包含B个字的一个单元。 (3)高速缓存组Set:组合相关映射将多个Cache行作为一个组(Set)。 (4)高速缓存路Way:组合相关映射将所有组中同位置Cache行称为一路(Way)。〔习题6.19〕 什么是段选择器、描述符、描述符表和描述符表寄存器? 〔解答〕 段选择器:保护方式下的16位段寄存器就是段选择器。 描述符:是保护方式引入的数据结构,有8个字节64位,具有段基地址、访问权限、段界限等字段。IA-32处理器利用它来实现存储管理、特权与保护。描述符表:描述符表是存放描述符的一个特殊区域段。描述符表寄存器:指明描述符表所在主存地址的寄存器。〔习题6.20〕 IA-32处理器在保护方式下,段寄存器是什么内容?若DS=78H,说明在保护方式其具体的含义。〔解答〕 段寄存器是段选择器,包含3个域,指向一个段描述符。 DS=78H,说明当前数据段描述符是全局描述符表中的第0FH个描述符。本次访问数据的特权级别为0,最高。〔习题6.21〕 采用4KB分页,说明IA-32处理器将线性地址转换为物理地址的过程。〔解答〕 通过2级查表来实现线性地址转换为位物理地址。 (1)在CR3中包含着当前任务的页目录的起始地址,将其加上线性地址最高10位A31~A22确定的页目录项的偏移量,便访问到指定的页目录项。 (2)在此页目录项中包含着指向的页表的起始地址,将其加上线性地址中间的10位A21~A12确定的页表项的偏移量,便访问到指定的页表项。 (3)在此页表项中包含着要访问的页面的起始地址,将其加上线性地址最低12位A11~A0的偏移量,就从这一页中访问到所寻址的物理单元。第7章 输入输出接口 〔习题7.1〕简答题 〔解答〕 ① 外部设备,在工作原理、驱动方式、信息格式、以及工作速度等方面彼此差别很大,与处理器的工作方式也大相径庭。所以,外设不能像存储器芯片那样直接与处理器相连,必须经过一个中间电路。 ② 数据缓冲用于匹配快速的处理器与相对慢速的外设或两个功能部件速度不匹配的数据交换。③ 处理器向接口芯片相应端口写入特定的数据,用于选择I/O芯片的工作方式或控制外设工作,该数据称命令字或控制字。 ④ PC机中CMOS RAM不属于主存空间,CMOS RAM有64个字节容量,以8位I/O接口形式与处理器连接,通过两个I/O地址访问。 ⑤ 在输入接口中,为避免多个设备同时向总线发送数据,需要安排一个三态缓冲器。只有当处理器选通时,才允许被选中设备将数据送到系统总线,此时其他输入设备与数据总线隔离。 ⑥ 透明锁存器的控制端为有效电平时,输出随输入变化,常称为直通或透明。非透明锁存器不论其控制端为低或为高电平,输出状态都不随输入变化。 ⑦ 如发光二极管、按键和开关等简单设备,它们的工作方式十分简单;相对处理器而言,其状态很少发生变化或变化很慢。这些设备与处理器交换数据时,可采用无条件传送。⑧ 在查询程序中,当查询超过了规定的时间,设备仍未就绪时,就引发超时错误。 ⑨ 远调用CALL指令利用直接或间接寻址调用另一个代码段的子程序;INT n指令利用中断向量表(地址表)的方法调用另一个代码段的中断服务程序,还有保存标志寄存器的功能。 ⑩ 外部中断是由处理器外部提出中断请求引起的程序中断。相对于处理器来说,外部中断是随机产生的,所以是真正意义上的中断。〔习题7.2〕判断题 〔解答〕 ① 对 ② 对 ③ 对 ④ 错 ⑤ 错 ⑥ 错 ⑦ 对 ⑧ 错 ⑨ 对 ⑩ 错 〔习题7.3〕填空题 〔解答〕 ① 数字量、开关量、脉冲量 ② I/O独立,输入输出(I/O)指令,直接寻址,DX寄存器间接寻址 ③ I/O端口(接口,外设),处理器(主机),I/O读 ④ 寄存器,I/O地址的直接寻址 ⑤ I/O地址的间接寻址,寄存器 ⑥ 直接存储器存取,DMA请求,总线请求,总线响应,高阻,DMAC(DMA控制器)⑦ 除法错,2 ⑧ 1,STI,CLI,0 ⑨ 1KB,20H,4,F010H∶2300H ⑩ IR3,IR3请求的 〔习题7.4〕 一般的I/O接口电路安排有哪三类寄存器?它们各自的作用是什么? 〔解答〕 ① 数据寄存器 保存处理器与外设之间交换的数据。 ② 状态寄存器 保存外设当前的工作状态信息。处理器通过该寄存器掌握外设状态,进行数据交换。③ 控制寄存器 保存处理器控制接口电路和外设操作的有关信息。处理器向控制寄存器写入控制信息,选择接口电路的不同工作方式和与外设交换数据形式。〔习题7.5〕 什么是I/O独立编址和统一编址,各有什么特点? 〔解答〕 独立编址是将I/O端口单独编排地址,独立于存储器地址。 统一编址是将I/O端口与存储器地址统一编排,共享一个地址空间。 端口独立编址方式,处理器除要具有存储器访问的指令和引脚外,还需要设计I/O访问的I/O指令和I/O引脚,其优点是:不占用存储器空间;I/O指令使程序中I/O操作一目了然;较小的I/O地址空间使地址译码简单。但I/O指令功能简单,寻址方式没有存储器指令丰富。 统一编址方式,处理器不再区分I/O口访问和存储器访问。其优点是:处理器不用设计I/O指令和引脚,丰富的存储器访问方法同样能够运用于I/O访问。缺点是:I/O端口会占用存储器的部分地址空间,通过指令不易辨认I/O操作。〔习题7.6〕 简述主机与外设进行数据交换的几种常用方式。〔解答〕 主机与外设进行数据交换的几种常用方式: ① 无条件传送方式,常用于简单设备,处理器认为它们总是处于就绪状态,随时进行数据传送。② 程序查询方式:处理器首先查询外设工作状态,在外设就绪时进行数据传送。 ③ 中断方式:外设在准备就绪的条件下通过请求引脚信号,主动向处理器提出交换数据的请求。处理器无其他更紧迫任务,则执行中断服务程序完成一次数据传送。 ④ DMA传送: DMA控制器可接管总线,作为总线的主控设备,通过系统总线来控制存储器和外设直接进行数据交换。此种方式适用于需要大量数据高速传送的场合。〔习题7.7〕 参看图7-5,编程实现以下功能:当K0键单独按下时,发光二极管L0~L7将依次点亮(L0,L1,L2,„„L7),每个维持200ms;当K1键单独按下时,发光二极管L0~L7将反向依次点亮(L7,L6,L5,„„L0),每个也维持200ms;在其他情况下各发光二极管均不点亮。假定有延时200ms的子程序DELAY可直接调用。〔解答〕 again: mov dx,8000h in al,dx cmp al,0feh;D7~D0=11111110B ? jz next1;单独按下K0,转移到next1 cmp al,0fdh;D7~D0=11111101B ? jz next2;单独按下K1,转移到next2 jmp again;其它情况不点亮 next1: mov cx,8 mov al,1;从K0开始 next11: out dx,al;某个LED电亮 call delay;延时200ms shl al,1;rol al,1 loop next11 jmp again next2: mov cx,8 mov al,80h;从K7开始 next21: out dx,al;某个LED电亮 call delay;延时200ms shr al,1;ror al,1 loop next21 jmp again 〔习题7.8〕 现有一个输入设备,其数据端口地址为FFE0H,状态端口地址为FFE2H。当状态标志D0=1时,表明一个字节的输入数据就绪。请编写利用查询方式进行数据传送的程序段,要求从该设备读取100个字节保存到BUFFER缓冲区。〔解答〕 mov bx, offset buffer mov cx,100 again: mov dx,0ffe2h status: in al,dx;查询一次 test al,01h jz status mov dx,0ffe0h in al,dx;输入一个字节 mov [bx],al inc bx loop again;循环,输入100个字节 〔习题7.9〕 某个字符输出设备,其数据端口和状态端口的地址均为80H。在读取状态时,当标志位D7=0时,表明该设备闲,可以接收一个字符。请编写利用查询方式进行数据传送的程序段,要求将存放于缓冲区ADDR处的一串字符(以0为结束标志)输出给该设备。〔解答〕 mov bx,offset addr again: cmp byte ptr [bx],0 jz done status: in al,80h;查询 test al,80h jnz status mov al,[bx] out 80h,al;输出一个字节 inc bx jmp again;循环 done: 〔习题7.10〕 以可屏蔽中断为例,说明一次完整的中断过程主要包括哪些环节? 〔解答〕 中断请求:外设通过硬件信号的形式、向处理器引脚发送有效请求信号。中断响应:在满足一定条件时,处理器进入中断响应总线周期。关中断:处理器在响应中断后会自动关闭中断。 断点保护:处理器在响应中断后将自动保护断点地址。中断源识别:处理器识别出当前究竟是哪个中断源提出了请求,并明确与之相应的中断服务程序所在主存位置。 现场保护:对处理器执行程序有影响的工作环境(主要是寄存器)进行保护。中断服务:处理器执行相应的中断服务程序,进行数据传送等处理工作。恢复现场:完成中断服务后,恢复处理器原来的工作环境。开中断:处理器允许新的可屏蔽中断。 中断返回:处理器执行中断返回指令,程序返回断点继续执行原来的程序。〔习题7.11〕 什么是中断源?为什么要安排中断优先级?什么是中断嵌套?什么情况下程序会发生中断嵌套? 〔解答〕 计算机系统中,凡是能引起中断的事件或原因,被称为中断源。 处理器随时可能会收到多个中断源提出的中断请求,因此,为每个中断源分配一级中断优先权,根据它们的高低顺序决定响应的先后。 一个中断处理过程中又有一个中断请求、并被响应处理,被称为中断嵌套。必须在中断服务程序中打开中断,程序才会发生中断嵌套。〔习题7.12〕 明确如下中断有关的概念:中断源、中断请求、中断响应、关中断、开中断、中断返回、中断识别、中断优先权、中断嵌套、中断处理、中断服务。〔解答〕 中断源:能引起中断的事件或原因。 中断请求:是外设通过硬件信号的形式、向处理器引脚发送有效请求信号。中断响应:中断响应是在满足一定条件时,处理器进入中断响应总线周期。关中断:禁止处理器响应可屏蔽中断。开中断:允许处理器响应可屏蔽中断。 中断返回:处理器执行中断返回指令,将断点地址从堆栈中弹出,程序返回断点继续执行原来的程序。 中断识别:处理器识别出当前究竟是哪个中断源提出了请求,并明确与之相应的中断服务程序所在主存位置。中断优先权:为每个中断源分配一级中断优先权,即系统设计者事先为每个中断源确定处理器响应他们的先后顺序。 中断嵌套:在一个中断处理过程中又有一个中断请求被响应处理,称为中断嵌套。中断处理:接到中断请求信号后,随之产生的整个工作过程,称中断处理。中断服务:指处理器执行相应的中断服务程序,进行数据传送等处理工作。〔习题7.13〕 按照图7-10所示的中断查询接口与相应的流程图,编写用于中断服务的程序段。具体要求是,当程序查到中断设备0有中断请求(对应数据线D0),它将调用名为PROC0的子程序;如此,依次去查中断设备1~中断设备3,并分别调用名为PROC1~PROC3的子程序。〔解答〕 sti push ax push dx „ mov dx,4000h status: in al,dx test al,01h jnz service0 test al,02h jnz service1 test al,04h jnz service2 test al,08h jnz service3 „ service0: call proc0 jmp done service1: call proc1 jmp done service2: call proc2 jmp done service3: call proc3 jmp done „„ done: pop dx pop ax iret 〔习题7.14〕 什么是DMA读和DMA写?什么是DMA控制器8237A的单字节传送、数据块传送和请求传送? 〔解答〕 DMA读:存储器的数据在DMA控制器控制下被读出传送给外设。DMA写:外设的数据在DMA控制器控制下被写入存储器。 单字节传送方式:每次DMA传送时仅传送一个字节。传送一个字节之后,DMA控制器释放系统总线,将控制权还给处理器。 数据块传送: DMA传送启动后就连续地传送数据,直到规定的字节数传送完。 请求传送:DMA传送由请求信号控制。如果请求信号一直有效,就连续传送数据;但当请求信号无效时,DMA传送被暂时中止。〔习题7.15〕 IA-32处理器何时处于开中断状态、何时处于关中断状态? 〔解答〕 在IA-32处理器中,若IF=1,则处理器处于开中断状态。 若IF=0,则处理器处于关中断状态。IF=0关中断的情况有:系统复位后,任何一个中断(包括外部中断和内部中断)被响应后,执行关中断指令CLI后。〔习题7.16〕 简述IA-32处理器的中断工作过程。〔解答〕 IA-32处理器获得向量号识别出中断源后,中断或异常接着的工作过程如下: (1)将标志寄存器EFLAGS压入堆栈,保护各个标志位;将被中断指令的逻辑地址(代码段寄存器和指令指针寄存器内容)压入堆栈,保护断点。 (2)如果有错误代码,将其压入堆栈(有些异常产生错误代码,更具体地表明产生异常的原因)。实地址方式的异常不返回错误代码。 (3)根据向量号获得中断服务程序(中断或异常的处理程序)的段选择器和指令指针,分别传送给代码段寄存器CS和指令指针寄存器EIP。 (4)对于中断,要设置中断允许标志IF为0,即禁止进一步的可屏蔽中断。(5)控制转移至中断服务程序入口地址(首地址),开始执行中断或异常处理程序。 中断服务程序最后是中断返回指令IRET。中断返回指令IRET将断点地址和标志寄存器出栈恢复,如果压入了错误代码还需要相应增量堆栈指针,于是控制又返回到断点指令继续执行。〔习题7.17〕 IA-32处理器的中断向量表和中断描述符表的作用是什么? 〔解答〕 IA-32处理器的中断向量表和中断描述符表的作用都是获取中断服务程序的入口地址(称为中断向量),进而控制转移到中断服务程序中。〔习题7.18〕 说明如下程序段的功能: cli mov ax,0 mov es,ax mov di,80h*4 mov ax,offset intproc;intproc是一个过程名 cld mov es:[di],ax mov ax,seg intproc mov es:[di+2],ax sti 〔解答〕 设置80H号中断向量。〔习题7.19〕 中断控制器8259A中IRR,IMR和ISR三个寄存器的作用是什么? 〔解答〕 中断请求寄存器IRR:保存8条外界中断请求信号IR0~IR7的请求状态。Di位为1表示IRi引脚有中断请求;为0表示该引脚无请求。中断屏蔽寄存器IMR:保存对中断请求信号IR的屏蔽状态。Di位为1表示IRi中断被屏蔽(禁止);为0表示允许该中断。 中断服务寄存器ISR:保存正在被8259A服务着的中断状态。Di位为1表示IRi中断正在服务中;为0表示没有被服务。〔习题7.20〕 下面是IBM PC/XT机ROM-BIOS中的08号中断服务程序,请说明各个指令的作用。int08h proc sti push ds push ax push dx „„;日时钟计时 „„;控制软驱马达 int 1ch mov al,20h out 20h,al pop ax pop dx pop ds iret int08h endp 〔解答〕 int08h proc far;远过程 sti;开中断 push ds;保护现场 push ax push dx „„;日时钟计时 „„;控制软驱马达 int 1ch;调用1CH号中断 mov al,20h;发送EOI中断结束命令 out 20h,al pop ax;恢复现场 pop dx pop ds iret;中断返回 int08h endp 〔习题7.21〕 编写一个程序,将例题7-5的INT 80H内部中断服务程序驻留内存。然后在调试程序中或其他程序中执行INT 80H,看能否实现其显示功能。〔解答〕 ;代码段 jmp start;80H内部中断服务程序:显示字符串(以0结尾);DS∶DX=缓冲区首地址 new80h proc;过程定义 sti;开中断 push ax;保护寄存器 push bx push si mov si,offset intmsg new1: mov al,cs:[si];获取欲显示字符 cmp al,0;为“0”结束 jz new2 mov bx,0;采用ROM-BIOS调用显示一个字符 mov ah,0eh int 10h inc si;显示下一个字符 jmp new1 new2: pop si;恢复寄存器 pop bx pop ax iret;中断返回 intmsg db 'A Instruction Interrupt!',0dh,0ah,0;字符串(以0结尾)new80h endp;中断服务程序结束 ;主程序 start: mov ax,cs mov ds,ax;设置04H中断向量 mov dx,offset new80h cli mov ax,2580h int 21h sti mov eax,offset tsrmsg;显示安装信息 call dispmsg mov dx,offset start;计算驻留内存程序的长度 add dx,15 shr dx,4;调整为以“节”(16个字节)为单位 mov ax,3100h;程序驻留,返回DOS int 21h tsrmsg db 'INT 80H Program Installed!',0dh,0ah,0 〔习题7.22〕 完成例题7-2显示当前日期同样的功能,请获得日期数据后转换成ASCII码,保存在缓冲区、利用DISPMSG子程序显示。〔解答〕 ;ex0722.asm in DOS include io16.inc.data date byte 'Today is 20xx-yy-zz',0.code start: mov ebx,11 mov al,9;AL=9(准备从9号单元获取年代数据) out 70h,al;从70H的I/O地址输出,选择CMOS RAM的9号单元 in al,71h;从71H的I/O地址输入,获取9号单元的内容,保存在AL mov dl,al shr al,4;转换高位BCD码为ASCII码 add al,30h mov date[ebx],al;保存到缓冲区 add ebx,1 and dl,0fh;转换低位BCD码为ASCII码 add dl,30h mov date[ebx],dl;保存到缓冲 add ebx,2 mov al,8;AL=8(从8号单元获取月份数据) out 70h,al in al,71h mov dl,al shr al,4;转换高位BCD码为ASCII码 add al,30h mov date[ebx],al;保存到缓冲区 add ebx,1 and dl,0fh;转换低位BCD码为ASCII码 add dl,30h mov date[ebx],dl;保存到缓冲 add ebx,2 mov al,7;AL=7(从7号单元获取日期数据) out 70h,al in al,71h mov dl,al shr al,4;转换高位BCD码为ASCII码 add al,30h mov date[ebx],al;保存到缓冲区 add ebx,1 and dl,0fh;转换低位BCD码为ASCII码 add dl,30h mov date[ebx],dl;保存到缓冲 mov eax,offset date;显示 call dispmsg exit 0 end start 第8章 常用接口技术 〔习题8.1〕简答题 〔解答〕 ① 方式1可以通过编程产生一个确定宽度的单稳脉冲,故称工作方式1为可编程单稳脉冲工作方式。 ② 因为计数器是先减1,再判断是否为0,所以写入0实际代表最大计数值。 ③ 通过控制字的D7位来区别:D7=1,该控制字为方式控制字;否则为位控制字。 ④ 8255的三种工作方式均可实现输出数据锁存,即数据输出后被保存在8255内部,可以读取出来,只有当8255再输出新一组数据时才改变。 ⑤ Modem,称为调制解调器,将数字信号转换为适合在电话线路上传送的模拟信号(调制)以及将电话线路的模拟信号转换为数字信号(解调)。 ⑥ 因绝大多数设备只使用RS-232C标准的其中9个信号,所以PC机上就配置9针连接器。⑦ 两台微机进行短距离通信,可以不使用调制解调器,直接利用232C接口连接,被称为零调制解调器(Null Modem)连接。 ⑧ UART表示通用异步接收发送器,主要功能是将并行数据转换为串行数据发送,以及实现串行数据转换为并行传送给处理器。 ⑨ 采用多路开关,通过微型机控制,把多个现场信号分时地接通到A/D转换器上转换,达到共用A/D转换器以节省硬件的目的。 ⑩ 处理器输出数据都只在输出指令OUT执行的极短时间内出现在数据总线上,慢速的外设不能及时获取,所以主机与DAC之间必须连接数据锁存器。〔习题8.2〕判断题 〔解答〕 “微机原理与接口技术”习题解答 第1章 微型计算机系统 〔习题1.1〕简答题 〔解答〕 ① 处理器每个单位时间可以处理的二进制数据位数称计算机字长。② 总线信号分成三组,分别是数据总线、地址总线和控制总线。③ PC机主存采用DRAM组成。 ④ 高速缓冲存储器Cache是处理器与主存之间速度很快但容量较小的存储器。⑤ ROM-BIOS是“基本输入输出系统”,操作系统通过对BIOS的调用驱动各硬件设备,用户也可以在应用程序中调用BIOS中的许多功能。⑥ 中断是CPU正常执行程序的流程被某种原因打断、并暂时停止,转向执行事先安排好的一段处理程序,待该处理程序结束后仍返回被中断的指令继续执行的过程。⑦ 主板芯片组是主板的核心部件,它提供主板上的关键逻辑电路。⑧ MASM是微软开发的宏汇编程序。 ⑨ 指令的处理过程。处理器的“取指―译码―执行周期” 是指处理器从主存储器读取指令(简称取指),翻译指令代码的功能(简称译码),然后执行指令所规定的操作(简称执行)的过程。 ⑩ 机器语言层,即指令集结构。 (学生很多认为是:汇编语言层。前4章主要涉及汇编语言,但本书还有很多处理器原理等内容) 〔习题1.2〕判断题 ① 错 ② 错 ③ 对 ④ 错 ⑤ 对 ⑥ 错 ⑦ 错 ⑧ 对 ⑨ 错 ⑩ 错 〔 〔解答〕 ① Central Processing Unit,中央处理单元,处理器 ② 1MB,4GB ③ 216,64KB ④ EXE,COM(BAT老师讲的)⑤ Instruction Set Architecture ⑥ 目录 ⑦ MMX,SSE3 ⑧ 64 ⑨ IBM,DOS ⑩ PCI 〔习题1.4〕 说明微型计算机系统的硬件组成及各部分作用。〔解答〕 CPU:CPU也称处理器,是微机的核心。它采用大规模集成电路芯片,芯片内集成了控制器、运算器和若干高速存储单元(即寄存器)。处理器及其支持电路构成了微机系统的控制中心,对系统的各个部件进行统一的协调和控制。存储器:存储器是存放程序和数据的部件。 外部设备:外部设备是指可与微机进行交互的输入(Input)设备和输出(Output)设备,也称I/O设备。I/O设备通过I/O接口与主机连接。总线:互连各个部件的共用通道,主要含数据总线、地址总线和控制总线信号。〔习题1.5〕 什么是通用微处理器、单片机(微控制器)、DSP芯片、嵌入式系统? 〔解答〕 通用微处理器:适合较广的应用领域的微处理器,例如装在PC机、笔记本电脑、工作站、服务器上的微处理器。 单片机:是指通常用于控制领域的微处理器芯片,其内部除CPU外还集成了计算机的其他一些主要部件,只需配上少量的外部电路和设备,就可以构成具体的应用系统。 DSP芯片:称数字信号处理器,也是一种微控制器,其更适合处理高速的数字信号,内部集成有高速乘法器,能够进行快速乘法和加法运算。 嵌入式系统:利用微控制器、数字信号处理器或通用微处理器,结合具体应用构成的控制系统。 〔习题1.6〕 综述Intel 80x86系列处理器在指令集方面的发展。〔解答〕 8086奠定了基本的16位指令集,80286提供了保护方式的各种指令,80386将指令集全面提升为32位,80486融入了浮点数据处理指令,奔腾系列陆续增加了多媒体指令MMX、SSE、SSE2和SSE3,最新的奔腾4处理器还支持64位指令集。 题外话:大家可以通过阅读相关资料、查询互联网获得更加详细的发展情况。可以考虑组织成一篇或多篇论文。〔习题1.7〕 区别如下概念:助记符、汇编语言、汇编语言程序和汇编程序。〔解答〕 助记符:人们采用便于记忆、并能描述指令功能的符号来表示机器指令操作码,该符号称为指令助记符。 汇编语言:用助记符表示的指令以及使用它们编写程序的规则就形成汇编语言。汇编语言程序:用汇编语言书写的程序就是汇编语言程序,或称汇编语言源程序。汇编程序:汇编语言源程序要翻译成机器语言程序才可以由处理器执行。这个翻译的过程称为“汇编”,完成汇编工作的程序就是汇编程序(Assembler)。〔习题1.8〕 区别如下概念:路径、绝对路径、相对路径、当前目录。系统磁盘上存在某个可执行文件,但在DOS环境输入其文件名却提示没有这个文件,是什么原因? 〔解答〕 路径:操作系统以目录形式管理磁盘上的文件,文件所在的分区和目录就是该文件的路径。绝对路径:从根目录到文件所在目录的完整路径称为“绝对路径”。是保证文件唯一性的标示方法。 相对路径:从系统当前目录到文件所在目录的路径称为相对路径。当前目录:用户当前所在的目录就是当前目录。 指明的路径不正确,或者执行了另外一个同名的文件。〔习题1.9〕 什么是摩尔定律?它能永久成立吗? 〔解答〕 每18个月,集成电路的性能将提高一倍,而其价格将降低一半。(1965年,Intel公司的创始人之一摩尔预言:集成电路上的晶体管密度每年将翻倍。现在这个预言通常表达为:每隔18个月硅片密度(晶体管容量)将翻倍;也常被表达为:每18个月,集成电路的性能将提高一倍,而其价格将降低一半。) 不能。由于电子器件的物理极限在悄然逼近,摩尔定律不会永远持续。〔习题1.10〕 冯?诺依曼计算机的基本设计思想是什么? 〔解答〕 采用二进制形式表示数据和指令。指令由操作码和地址码组成。将程序和数据存放在存储器中,计算机在工作时从存储器取出指令加以执行,自动完成计算任务。这就是“存储程序”和“程序控制”(简称存储程序控制)的概念。指令的执行是顺序的,即一般按照指令在存储器中存放的顺序执行,程序分支由转移指令实现。 计算机由存储器、运算器、控制器、输入设备和输出设备五大基本部件组成,并规定了5部分的基本功能。〔习题1.11〕 计算机系统通常划分为哪几个层次?普通计算机用户和软件开发人员对计算机系统的认识一样吗? 〔解答〕 最上层是用户层。第5层是高级语言层。第4层是汇编语言层。第3层是操作系统层。第2层是机器语言层。第1层是控制层。第0层是数字电路层。 普通计算机用户和软件人员对计算机系统的认识并不一样。普通计算机用户看到的计算机,也就是我们最熟悉的计算机,属于用户层,而软件人员看到的属于高级语言层或是汇编语言层。 〔习题1.12〕 什么是系列机和兼容机?你怎样理解计算机中的“兼容”特性?例如,你可以用PC机为例,谈谈你对软件兼容(或兼容性)的认识,说明为什么PC机具有如此强大的生命力? 〔解答〕 系列机是指在一个厂家生产的具有相同计算机结构,但具有不同组成和实现的一系列(Family)不同档次、不同型号的机器。 兼容机是指不同厂家生产的具有相同计算机结构(不同的组成和实现)的计算机。 兼容是一个广泛的概念,包括软件兼容、硬件兼容、系统兼容等。其中软件兼容是指同一个软件可以不加修改地运行于体系结构相同的各档机器,结果一样但运行时间可能不同。软件兼容可从机器性能和推出时间分成向上(向下)和向前(向后)兼容。例如32位PC机就陆续增加了对浮点处理指令、多媒体指令等的支持。在保证向后兼容的前提下,不断改进其组成和实现,延续计算机结构的生命,才使得PC机具有如此强大的生命力。〔习题1.13〕 英特尔公司最新Intel 80x86处理器是什么?请通过查阅相关资料(如英特尔公司网站),说明其主要特点和采用的新技术。〔解答〕 酷睿2多核处理器。〔习题1.14〕 说明高级语言、汇编语言、机器语言三者的区别,谈谈你对汇编语言的认识。〔解答〕 高级语言与具体的计算机硬件无关,其表达方式接近于所描述的问题,易为人们接受和掌握,用高级语言编写程序要比低级语言容易得多,并大大简化了程序的编制和调试,使编程效率得到大幅度的提高。而汇编语言是为了便于理解与记忆,将机器指令用助记符代替而形成的一种语言。汇编语言的语句通常与机器指令对应,因此,汇编语言与具体的计算机有关,属于低级语言。它比机器语言直观,容易理解和记忆,用汇编语言编写的程序也比机器语言易阅读、易排错。机器语言的每一条机器指令都是二进制形式的指令代码,计算机硬件可以直接识别。高级语言程序通常也需要翻译成汇编语言程序,再进一步翻译成机器语言代码。〔习题1.15〕 为了更好地进行编程实践,请进入Windows操作系统下的控制台环境(或MS-DOS模拟环境),练习常用命令。第2章 处理器结构 〔习题2.1〕简答题 〔解答〕 ① ALU是算术逻辑运算单元,负责处理器所能进行的各种运算,主要是算术运算和逻辑运算。 ② 取指是指从主存取出指令代码通过总线传输到处理器内部指令寄存器的过程。8086分成总线接口单元和指令执行单元,可以独立操作。在执行单元执行一条指令的同时,总线接口单元可以读取下一条指令,等到执行时不需要进行取指了,所以称为预取。 ③ Pentium采用分离的Cache结构,一个用做指令Cache,一个用做数据Cache。④ 堆栈的存取原则是先进后出(也称为后进先出)操作方式存取数据。⑤ 标志寄存器主要保存反映指令执行结果和控制指令执行形式的有关状态。⑥ 执行了一条加法指令后,发现ZF=1,表明运算结果为0。⑦ 没有。 ⑧ 汇编语言的标识符大小写不敏感,即表示字母大小写不同、但表示同一个符号。⑨ 不会。 ⑩ 指令的操作数需要通过存储器地址或I/O地址,才能查找到数据本身,故称数据寻址方式。 〔习题2.2〕判断题 〔解答〕 ① 错 ② 对 ③ 对 ④ 对 ⑤ 错 ⑥ 对 ⑦ 对 ⑧ 错 ⑨ 对 ⑩ 对 〔习题2.3〕填空题 〔解答〕 ① 32,DX,DH ② 16 ③ 段地址,偏移地址,EIP,IP ④ 00100110,0 ⑤ 73C00H,73800H ⑥ EBX,ECX,ESI,EDI,EBP,ESP ⑦ 实地址,64KB ⑧ ASM,目标模块,FLAT ⑨ 立即数寻址、寄存器寻址和存储器寻址 ⑩ DS,SS 〔习题2.4〕 处理器内部具有哪3个基本部分?8086分为哪两大功能部件?其各自的主要功能是什么? 〔解答〕 处理器内部有ALU、寄存器和指令处理三个基本单元。8086有两大功能部件:总线接口单元和执行单元。总线接口单元:管理着8086与系统总线的接口,负责处理器对存储器和外设进行访问。8086所有对外操作必须通过BIU和这些总线进行。 执行单元EU:负责指令译码、数据运算和指令执行。〔习题2.5〕 8086怎样实现了最简单的指令流水线? 〔解答〕 8086中,指令的读取是在BIU单元,而指令的执行是在EU单元。因为BIU和EU两个单元相互独立、分别完成各自操作,所以可以并行操作。也就是说,在EU单元对一个指令进行译码执行时,BIU单元可以同时对后续指令进行读取;这就是最简单的指令流水线技术。〔习题2.6〕 什么是标志?什么是IA-32处理器的状态标志、控制标志和系统标志?说明状态标志在标志寄存器EFLAGS的位置和含义。〔解答〕 标志:用于反映指令执行结果或控制指令执行形式的一个或多个二进制数位。例如,有些指令执行后会影响有关标志位;有些指令的执行要利用相关标志。状态标志:用来记录程序运行结果的状态信息。控制标志:DF标志,控制字符串操作的地址方向。系统标志:用于控制处理器执行指令的方式。 状态标志在标志寄存器EFLAGS中的位置和含义如下: 11 10 9 8 7 6 5 4 3 2 1 0 „„ OF SF ZF AF PF CF 〔习题2.7〕 举例说明CF和OF标志的差异。〔解答〕 进位标志CF表示无符号数运算结果是否超出范围,超出范围后加上进位或借位,运算结果仍然正确;溢出标志OF表示有符号数运算结果是否超出范围,如果超出范围,运算结果已经不正确。 例1:3AH + 7CH=B6H 无符号数运算:58+124=182,范围内,无进位。有符号数运算:58+124=182,范围外,有溢出。例2:AAH + 7CH=①26H 无符号数运算:170+124=294,范围外,有进位。有符号数运算:-86+124=28,范围内,无溢出。〔习题2.8〕 什么是8086中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?请将如下逻辑地址用物理地址表达(均为十六进制形式): ① FFFF∶0 ② 40∶17 ③ 2000∶4500 ④ B821∶4567 〔解答〕 物理地址:在处理器地址总线上输出的地址称为物理地址。每个存储单元有一个唯一的物理地址。 逻辑地址:在处理器内部、程序员编程时采用逻辑地址,采用“段地址:偏移地址“形式。某个存储单元可以有多个逻辑地址,即处于不同起点的逻辑段中,但其物理地址是唯一的。逻辑地址转换成物理地址:逻辑地址由处理器在输出之前转换为物理地址。将逻辑地址中的段地址左移二进制4位(对应16进制是一位,即乘以16),加上偏移地址就得到20位物理地址。 ① FFFFH:0=FFFF0H ② 40H:17H=00417H ③ 2000H:4500H=24500H ④ B821H:4567H=BC777H 〔习题2.9〕 IA-32处理器有哪三类基本段,各是什么用途? 〔解答〕 IA-32处理器有代码段、数据段、堆栈段三类基本段。 代码段:存放程序的指令代码。程序的指令代码必须安排在代码段,否则将无法正常执行。数据段:存放当前运行程序所用的数据。程序中的数据默认是存放在数据段,也可以存放在其他逻辑段中。 堆栈段:主存中堆栈所在的区域。程序使用的堆栈一定在堆栈段。〔习题2.10〕 什么是平展存储模型、段式存储模型和实地址存储模型? 〔解答〕 平展存储模型下,对程序来说存储器是一个连续的地址空间,称为线性地址空间。程序需要的代码、数据和堆栈都包含在这个地址空间中。 段式存储模型下,对程序来说存储器由一组独立的地址空间组成,独立的地址空间称为段。通常,代码、数据和堆栈位于分开的段中。 实地址存储模型是8086处理器的存储模型。它是段式存储模型的特例,其线性地址空间最大为1MB容量,由最大为64KB的多个段组成。〔习题2.11〕 什么是实地址方式、保护方式和虚拟8086方式?它们分别使用什么存储模型? 〔解答〕 实地址方式:与8086具有相同的基本结构,只能寻址1MB物理存储器空间,逻辑段最大不超过64KB;但可以使用32位寄存器、32位操作数和32位寻址方式;相当于可以进行32位处理的快速8086。实地址工作方式只能支持实地址存储模型。 保护方式:具有强大的段页式存储管理和特权与保护能力,使用全部32条地址总线,可寻址4GB物理存储器。保护方式通过描述符实现分段存储管理,每个逻辑段可达4GB。处理器工作在保护方式时,可以使用平展或段式存储模型。 虚拟8086方式:在保护方式下运行的类似实方式的运行环境,只能在1MB存储空间下使用“16位段”。处理器工作在虚拟8086方式时,只能使用实地址存储模型。〔习题2.12〕 汇编语句有哪两种,每个语句由哪4个部分组成? 〔解答〕 汇编语句有两种:执行性语句(处理器指令)、说明性语句(伪指令)。每个语句有:标号、指令助记符、操作数或参数、注释4个部分组成。〔习题2.13〕 汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。〔解答〕 汇编语言程序的开发有4个步骤: 编辑:用文本编辑器形成一个以ASM为扩展名的源程序文件。汇编:用汇编程序将ASM文件转换为OBJ模块文件。 连接:用连接程序将一个或多个目标文件链接成一个EXE或COM可执行文件。调试:用调试程序排除错误,生成正确的可执行文件。〔习题2.14〕 MASM汇编语言中,下面哪些是程序员可以使用的正确的标识符。FFH,DS,0xvab,Again,next,@data,h_ascii,6364b,.exit,small 〔解答〕 FFH,Again,next,h_ascii 〔习题2.15〕 给出IA-32处理器的32位寻址方式和16位寻址方式的组成公式,并说明各部分作用。〔解答〕 ① 32位存储器寻址方式的组成公式 32位有效地址 = 基址寄存器+(变址寄存器×比例)+位移量 其中的4个组成部分是: ?基址寄存器??任何8个32位通用寄存器之一; ?变址寄存器??除ESP之外的任何32位通用寄存器之一; ?比例??可以是1,2,4或8(因为操作数的长度可以是1,2,4或8字节); ?位移量??可以是8或32位有符号值。② 16位存储器寻址方式的组成公式 16位有效地址 = 基址寄存器+变址寄存器+位移量 其中基址寄存器只能是BX或BP,变址寄存器只能是SI或DI,位移量是8或16位有符号值。 〔习题2.16〕 说明下列指令中源操作数的寻址方式?假设VARD是一个双字变量。(1)mov edx,1234h(2)mov edx,vard(3)mov edx,ebx(4)mov edx,[ebx](5)mov edx,[ebx+1234h](6)mov edx,vard[ebx](7)mov edx,[ebx+edi](8)mov edx,[ebx+edi+1234h](9)mov edx,vard[esi+edi](10)mov edx,[ebp*4] 〔解答〕 ① 立即数 ② 直接 ③ 寄存器 ④ 寄存器间接 ⑤ 寄存器相对 ⑥ 寄存器相对 ⑦ 基址变址 ⑧ 相对基址变址 ⑨ 相对基址变址 ⑩ 带比例寻址 〔习题2.17〕 使用本书配套的软件包(或者按照本书说明)创建MASM开发环境,通过编辑例题2-1和例题2-2程序、汇编连接生成可执行程序和列表文件,掌握汇编语言的开发。第3章 数据处理 〔习题3.1〕简答题 〔解答〕 ① 没有。使用二进制8位表达无符号整数,257没有对应的编码。② 字符“'F'”的ASCII码就是数值46H,所以没有区别。 ③ 汇编程序在汇编过程中对数值表达式计算,得到一个确定的数值,故称数值表达式为常量。 ④ 不能。数值500大于一个字节所能表达的数据量,所以不能为字节变量赋值。⑤ 源、目标寄存器位数不同,不能用该指令进行数据交换。 ⑥ 前者在指令执行时获得偏移地址,是正确的;但后者的OFFSET只能在汇编阶段获得偏移地址,但此时寄存器内容是不可知的,所以无法获得偏移地址。 ⑦ INC,DEC,NEG和NOT指令的操作数既是源操作数也是目的操作数。⑧ 大小写字母转换利用它们的ASCII码相差20H。 ⑨ 加减法不区别无符号数和有符号数,但根据运算结果分别设置标志寄存器的CF和OF标志,可利用CF和OF进行区别。 ⑩ 逻辑与运算规则类似二进制的乘法,所以称其为逻辑乘。〔习题3.2〕判断题 〔解答〕 ① 对 ② 对 ③ 对 ④ 错 ⑤ 错 ⑥ 对 ⑦ 错 ⑧ 错 ⑨ 对 ⑩ 对 〔习题3.3〕填空题 〔解答〕 ① BYTE,OFFSET ② 97,61,小写字母a ③ 0DH(13),0AH(10)④ 8843H ⑤ DWORD,4,WORD PTR XYZ ⑥ 3 ⑦ 78894111 ⑧ 0,0,0 ⑨ ***2H,83H ⑩ 4 〔习题3.4〕 下列十六进制数表示无符号整数,请转换为十进制形式的真值: ① FFH ② 0H ③ 5EH ④ EFH 〔解答〕 ① 255 ② 0 ③ 94 ④ 239 〔习题3.5〕 将下列十进制数真值转换为压缩BCD码: ① 12 ② 24 ③ 68 ④ 99 〔解答〕 ① 12H ② 24H ③ 68H ④ 99H 〔习题3.6〕 将下列压缩BCD码转换为十进制数: ① 10010001 ② 10001001 ③ 00110110 ④ 10010000 〔解答〕 ① 91 ② 89 ③ 36 ④ 90 〔习题3.7〕 将下列十进制数用8位二进制补码表示: ① 0 ② 127 ③-127 ④ -57 〔解答〕 ① 00000000 ② 01111111 ③ 10000001 ④ 11000111 〔习题3.8〕 进行十六进制数据的加减运算,并说明是否有进位或借位: ① 1234H+7802H ② F034H+5AB0H ③ C051H-1234H ④ 9876H-ABCDH 〔解答〕 ① 1234H+7802H=8A36H,无进位 ② F034H+5AB0H=4AF4H,有进位 ③ C051H-1234H=BE1DH,无借位 ④ 9876H-ABCDH=ECA9H,有借位 〔习题3.9〕 数码0~ 9、大写字母A~Z、小写字母a~z对应的ASCII码分别是多少?ASCII码0DH和0AH分别对应什么字符? 〔解答〕 数码0~9对应的ASCII码依次是30H~39H。 大写字母A~Z对应的ASCII码依次是:41H~5AH。小写字母a~z对应的ASCII码依次是:61~7AH。ASCII码0DH和0AH分别对应的是回车和换行字符。〔习题3.10〕 设置一个数据段,按照如下要求定义变量或符号常量: ① my1b为字符串变量:Personal Computer ② my2b为用十进制数表示的字节变量:20 ③ my3b为用十六进制数表示的字节变量:20 ④ my4b为用二进制数表示的字节变量:20 ⑤ my5w为20个未赋值的字变量 ⑥ my6c为100的常量 ⑦ my7c表示字符串:Personal Computer 〔解答〕 my1b byte 'Personal Computer' my2b byte 20 my3b byte 14h my4b byte 00010100b my5w word 20 dup(?)my6c = 100 my7c equ 〔习题3.11〕 定义常量NUM,其值为5;数据段中定义字数组变量DATALIST,它的头5个字单元中依次存放-10,2,5和4,最后1个单元初值不定。〔解答〕 num equ 5 datalist byte-10,2,5,4,? 〔习题3.12〕 从低地址开始以字节为单位,用十六进制形式给出下列语句依次分配的数值: byte 'ABC',10,10h,'EF',3 dup(-1,?,3 dup(4))word 10h,-5,3 dup(?)〔解答〕 0A 10 45 46 FF 00 04 04 04 FF 00 04 04 04 FF 00 04 04 04 10 00 FB FF 00 00 00 00 00 00 〔习题3.13〕 设在某个程序中有如下片段,请写出每条传送指令执行后寄存器EAX的内容: ;数据段 org 100h varwword 1234h,5678h varb byte 3,4 vard dword 12345678h buff byte 10 dup(?)mess byte 'hello';代码段 mov eax,offset mess mov eax,type buff+type mess+type vard mov eax,sizeof varw+sizeof buff+sizeof mess mov eax,lengthof varw+lengthof vard 〔解答〕 ① EAX=0114H ② EAX=0006H ③ EAX=0013H ④ EAX=0003H 〔习题3.14〕 按照如下输出格式,在屏幕上显示ASCII表: | 0 1 2 3 4 5 6 7 8 9 A B C D E F---+-20 | !“ #...30 | 0 1 2 3...40 | @ A B C...50 | P Q R S...60 | ‘ a b c...70 | p q r s...表格最上一行的数字是对应列ASCII代码值的低4位(用十六进制形式),而表格左边的数字对应行ASCII代码值的高4位(用十六进制形式)。编程在数据段直接构造这样的表格、填写相应ASCII代码值(不是字符本身),然后使用字符串显示子程序DISPMSG实现显示。〔解答〕 include io32.inc.data table byte ' |0 1 2 3 4 5 6 7 8 9 A B C D E F',13,10 byte '---+',13,10 byte '20 |',20h,20h,21h,20h,22h,20h,23h,20h,24h,20h,25h,20h,26h,20h,27h,20h,28h,20h,29h,20h byte 2ah,20h,2bh,20h,2ch,20h,2dh,20h,2eh,20h,2fh,20h,13,10 byte '30 |',30h,20h,31h,20h,32h,20h,33h,20h,34h,20h,35h,20h,36h,20h,37h,20h,38h,20h,39h,20h byte 3ah,20h,3bh,20h,3ch,20h,3dh,20h,3eh,20h,3fh,20h,13,10 byte '40 |',40h,20h,41h,20h,42h,20h,43h,20h,44h,20h,45h,20h,46h,20h,47h,20h,48h,20h,49h,20h byte 4ah,20h,4bh,20h,4ch,20h,4dh,20h,4eh,20h,4fh,20h,13,10 byte '50 |',50h,20h,51h,20h,52h,20h,53h,20h,54h,20h,55h,20h,56h,20h,57h,20h,58h,20h,59h,20h byte 5ah,20h,5bh,20h,5ch,20h,5dh,20h,5eh,20h,5fh,20h,13,10 byte '60 |',60h,20h,61h,20h,62h,20h,63h,20h,64h,20h,65h,20h,66h,20h,67h,20h,68h,20h,69h,20h byte 6ah,20h,6bh,20h,6ch,20h,6dh,20h,6eh,20h,6fh,20h,13,10 byte '70 |',70h,20h,71h,20h,72h,20h,73h,20h,74h,20h,75h,20h,76h,20h,77h,20h,78h,20h,79h,20h byte 7ah,20h,7bh,20h,7ch,20h,7dh,20h,7eh,20h,7fh,20h,13,10 byte 0.code start: mov eax,offset table call dispmsg exit 0 end start 〔习题3.15〕 数据段有如下定义,IA-32处理器将以小端方式保存在主存: var dword 12345678h 现以字节为单位按地址从低到高的顺序,写出这个变量内容。并说明如下指令的执行结果: mov eax,var;EAX=__________ mov bx,var;BX=__________ mov cx,var+2;CX=__________ mov dl,var;DL=__________ mov dh,var+3;DH=__________ 可以编程使用十六进制字节显示子程序DSIPHB顺序显示各个字节进行验证,还可以使用十六进制双字显示子程序DSIPHD显示该数据进行对比。〔解答〕 小端方式采用“低对低、高对高”,即低字节数据存放在低地址存储单元、高字节数据存放在高地址存储单元。以字节为单位按地址从低到高的顺序,var变量的内容:78H、56H、34H、12H。 ;EAX=12345678H;BX=5678H;CX=1234H;DL=78H;DH=12H 〔习题3.16〕 使用若干MOV指令实现交互指令“XCHG EBX,[EDI]”功能。〔解答〕 push eax;可以没有 mov eax,ebx mov ebx,[edi] mov [edi],eax pop eax;可以没有 〔习题3.17〕 假设当前ESP=0012FFB0H,说明下面每条指令后,ESP等于多少? push eax push dx push dword ptr 0f79h pop eax pop word ptr [bx] pop ebx 〔解答〕 ESP=0012FFACH ESP=0012FFAAH ESP=0012FFA6H ESP=0012FFAAH ESP=0012FFACH ESP=0012FFB0H 〔习题3.18〕 已知数字0~9对应的格雷码依次为:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H;请为如下程序的每条指令加上注释,说明每条指令的功能和执行结果。 ;数据段 table byte 18h,34h,05h,06h,09h,0ah,0ch,11h,12h,14h;代码段 mov ebx,offset table mov al,8 xlat 为了验证你的判断,不妨使用本书的I/O子程序库提供的子程序DISPHB显示换码后AL的值。如果不使用XLAT指令,应如何修改? 〔解答〕 ;数据段 table byte 18h,34h,05h,06h,09h,0ah,0ch,11h,12h,14h;定义格雷码表 ;代码段 mov ebx,offset table;EBX=格雷码表首地址 mov al,8;AL=8 xlat;AL=12H(8的格雷码)不使用XLAT指令: mov ebx,offset table;EBX=格雷码表首地址 mov eax,0 mov al,8;AL=8 mov al,[eax+ebx];AL=12H(8的格雷码)〔习题3.19〕 请分别用一条汇编语言指令完成如下功能: (1)把EBX寄存器和EDX寄存器的内容相加,结果存入EDX寄存器。(2)用寄存器EBX和ESI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。 (3)用EBX和位移量0B2H的寄存器相对寻址方式把存储器中的一个双字和ECX寄存器的内容相加,并把结果送回存储器中。 (4)将32位变量VARD与数3412H相加,并把结果送回该存储单元中。(5)把数0A0H与EAX寄存器的内容相加,并把结果送回EAX中。〔解答〕 ① add edx,ebx ② add al,[ebx+esi] ③ add [bx+0b2h],cx ④ add varw,3412h ⑤ add eax,0a0h 〔习题3.20〕 分别执行如下程序片断,说明每条指令的执行结果:(〔解答〕(1) ;EAX=80H;EAX=83H,CF=0,SF=0;EAX=103H,CF=0,OF=0;EAX=106H,CF=0,ZF=0(2) ;EAX=100;EAX=300,CF=0(3) ;EAX=100;EAX=44,CF=1(包含256的进位含义:256+44=300)(4) mov al,7fh;AL=7FH sub al,8;AL=77H,CF=0,SF=0 sub al,80h;AL=F7H,CF=1,OF=1 sbb al,3;AL=F3H,CF=0,ZF=0 〔习题3.21〕 给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态: mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al inc al 〔解答〕 mov al,89h;AL=89H CF ZF SF OF PF add al,al;AL=12H 1 0 0 1 1 add al,9dh;AL=0AFH 0 0 1 0 1 cmp al,0bch;AL=0AFH 1 0 1 0 1 sub al,al;AL=00H 0 1 0 0 1 dec al;AL=0FFH 0 0 1 0 1 inc al;AL=00H 0 1 0 0 1 〔习题3.22〕 有两个64位无符号整数存放在变量buffer1和buffer2中,定义数据、编写代码完成EDX.EAX←buffer1-buffer2功能。〔解答〕 ;数据段 buffer1 qword 67883000h buffer2 qword 67762000h;代码段 mov eax,dword ptr buffer1 mov edx,dword ptr buffer1+4 sub eax,dword ptr buffer2 sbb edx,dword ptr buffer2+4 〔习题3.23〕 分别执行如下程序片断,说明每条指令的执行结果: 〔解答〕(1) ;ESI=9CH;ESI=80H;ESI=FFH;ESI=01H(2) ;EAX=1010B(可以有前导0,下同) ;EAX=0010B,CF=1;EAX=0100B,CF=0;EAX=0000B,CF=0(3) ;EAX=1011B(可以有前导0,下同) ;EAX=101100B,CF=0;EAX=10110B,CF=0;EAX=10111B,CF=0(4) ;EAX=0,CF=0,OF=0;ZF=1,SF=0,PF=1 〔习题3.24〕 3.24 给出下列各条指令执行后AX的结果,以及状态标志CF、OF、SF、ZF、PF的状态。 mov ax,1470h and ax,ax or ax,ax xor ax,ax not ax test ax,0f0f0h 〔解答〕 mov ax,1470h;AX=1470H CF OF SF ZF PF and ax,ax;AX=1470H 0 0 0 0 0 or ax,ax;AX=1470H 0 0 0 0 0 xor ax,ax;AX=0000H 0 0 0 1 1 not ax;AX=FFFFH 0 0 0 1 1 test ax,0f0f0h;AX=0F0F0H 0 0 1 0 1 〔习题3.25〕 逻辑运算指令怎么实现复位、置位和求反功能? 〔解答〕 AND指令同“0”与实现复位,OR指令同“1”或实现置位,XOR同“1”异或实现求反。〔习题3.26〕 说明如下程序段的功能: mov ecx,16 mov bx,ax next:shr ax,1 rcr edx,1 shr bx,1 rcr edx,1 loop next mov eax,edx 〔解答〕 将AX的每一位依次重复一次,所得的32位结果保存于EAX中。〔习题3.27〕 编程将一个64位数据逻辑左移3位,假设这个数据已经保存在EDX.EAX寄存器对中。〔解答〕 ;代码段 mov ecx,3 again: shl eax,1 rcl edx,1 loop again 〔习题3.28〕 编程将一个压缩BCD码变量(例如92H)转换为对应的ASCII码,然后调用DISPC子程序(在输入输出子程序库中)显示。〔解答〕 ;数据段 bcd byte 92h;代码段 mov al,bcd shr al,4 add al,30h call dispc mov al,bcd and al,0fh add al,30h call dispc 〔习题3.29〕 以MOVS指令为例,说明串操作指令的寻址特点,并用MOV和ADD等指令实现MOVSD的功能(假设DF=0)。〔解答〕 MOVS指令的功能是: ES:[EDI]←DS:[ESI];ESI←ESI±1/2/4,EDI←EDI±1/2/4 由此可看出串操作指令的寻址特点: 源操作数用寄存器ESI间接寻址,默认在DS指向的数据段,但可以改变;目的操作数用寄存器EDI间接寻址,只能在ES指向的附加数据段;每执行一次串操作,源指针ESI和目的指针EDI将自动修改:±1(字节),±2(字)或±4(双字)。指针的增量和减量控制由DF标志确定,DF=0,进行增量;DF=1,进行减量。 push eax mov eax,[esi] mov es:[edi],eax add esi,4 add edi,4 〔习题3.30〕 说明如下程序执行后的显示结果: ;数据段 msg byte 'WELLDONE',0;代码段 mov ecx,(lengthof msg)-1 mov ebx,offset msg again: mov al,[ebx] add al,20h mov [ebx],al add ebx,1 loop again mov eax,offset msg call dispmsg 如果将其中语句“mov ebx,offset msg”改为“xor ebx,ebx”,则利用EBX间接寻址的两个语句如何修改成EBX寄存器相对寻址,就可以实现同样功能? 〔解答〕 显示结果:welldone EBX寄存器相对寻址: mov al,msg[ebx] mov msg[ebx],al 〔习题3.31〕 下面程序的功能是将数组ARRAY1的每个元素加固定值(8000H),将和保存在数组ARRAY2。在空白处填入适当的语句或语句的一部分。 ;数据段 array1 dword 1,2,3,4,5,6,7,8,9,10 array2 dword 10 dup(?);代码段 mov ecx,lengthof array1 mov ebx,0 again: mov eax,array1[ebx*4] add eax,8000h mov ______________ add ebx,__________ loop again 〔解答〕 mov array2[ebx*4],eax add ebx,1 〔习题3.32〕 上机实现本章的例题程序,编程实现本章的习题程序。第4章 汇编语言程序设计 〔习题4.1〕简答题 〔解答〕 ① 当同一个程序被操作系统安排到不同的存储区域执行时,指令间的位移没有改变,目标地址采用相对寻址可方便操作系统的灵活调度。 ② 数据通信时,数据的某一位用做传输数据的奇偶校验位,数据中包括校验位在内的“1”的个数恒为奇数,就是奇校验;恒为偶数,就是偶校验。 ③ 无符号数和有符号数的操作影响两组不同的标志状态位,故判断两个无符号数和有符号数的大小关系要利用不同的标志位组合,所以有对应的两组指令。 ④ 双分支结构中两个分支体之间的JMP指令,用于实现结束前一个分支回到共同的出口作用。 ⑤ 完整的子程序注释可方便程序员调用该子程序,子程序注释包括子程序名、子程序功能、入口参数和出口参数、调用注意事项和其他说明等。 ⑥ 子程序保持堆栈平衡,才能保证执行RET指令时当前栈顶的内容是正确的返回地址。主程序也要保持堆栈平衡,这样才能释放传递参数占用的堆栈空间,否则多次调用该子程序可能就致使堆栈溢出。 ⑦ “传值”是传递参数的一个拷贝,被调用程序改变这个参数不影响调用程序;“传址”时,被调用程序可能修改通过地址引用的变量内容。 ⑧ INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含的是子程序库文件。⑨ 取长补短。 ⑩ Windows程序在运行时需要加载其配套的动态链接库DLL文件,当其没有被搜索到时就会提示不存在。〔习题4.2〕判断题 〔解答〕 ① 对 ② 错 ③ 错 ④ 错 ⑤ 错 ⑥ 对 ⑦ 对 ⑧ 错 ⑨ 对 ⑩ 错 〔习题4.3〕填空题 〔解答〕 ① 相对寻址,间接寻址,直接寻址,间接寻址 ② 1256H,3280H ③ 3721H,1 ④ EAH ⑤ 循环初始,循环控制 ⑥ REPT1标号的地址 ⑦ TEST ENDP,ENDM ⑧ EBP ⑨ PUBLIC,EXTERN ⑩ 38H 0DH 0AH 〔习题4.4〕 为了验证例题4-1程序的执行路径,可以在每个标号前后增加显示功能。例如使得程序运行后显示数码1234。〔解答〕 jmp labl1;相对寻址 nop mov eax,'?' call dispc labl1: mov eax,'1' call dispc jmp near ptr labl2;相对近转移 nop mov eax,'?' call dispc labl2: mov eax,'2' call dispc mov eax,offset labl3 jmp eax;寄存器间接寻址 nop mov eax,'?' call dispc labl3: mov eax,'3' call dispc mov eax,offset labl4 mov nvar,eax jmp nvar;存储器间接寻址 nop mov eax,'?' call dispc labl4: mov eax,'4' call dispc 〔习题4.5〕 使用“SHR EAX,2”将EAX中的D1位移入CF标志,然后用JC/JNC指令替代JZ/JNZ指令完成例题4-3的功能。〔解答〕 mov eax,56h;假设一个数据 shr eax,2;D1位移入CF标志 jnc nom;D1=0条件成立,转移 ...;余同原程序 〔习题4.6〕 执行如下程序片断后,CMP指令分别使得5个状态标志CF、ZF、SF、OF和PF为0还是为1?它会使得哪些条件转移指令指令Jcc的条件成立、发生转移? mov eax,20h cmp eax,80h 〔解答〕 CF=1 ZF=0 SF=1 OF=0 PF=1 可以使得条件成立、发生转移的指令有:JC JS JP JNZ JNO 〔习题4.7〕 将例题4-4程序修改为实现偶校验。建议进一步增加显示有关提示信息的功能,使得程序具有更加良好的交互性。〔解答〕 include io32.inc.data msg1 byte 'Please input a character: ',0 msg2 byte 'The ASCII code of the charater you entered is: ',0 msg3 byte 'The code with even parity is: ',0.code start: mov eax,offset msg1 call dispmsg call readc call dispcrlf mov ebx,eax mov eax,offset msg2 call dispmsg mov eax,ebx call dispbb call dispcrlf and al,7fh jp next or al,80h next:mov ebx,eax mov eax,offset msg3 call dispmsg mov eax,ebx call dispbb exit 0 end start 〔习题4.8〕 在采用奇偶校验传输数据的接收端应该验证数据传输的正确性。例如,如果采用偶校验,那么在接收到的数据中,其包含“1”的个数应该为0或偶数个,否则说明出现传输错误。现在,在接收端编写一个这样的程序,如果偶校验不正确显示错误信息,传输正确则继续。假设传送字节数据、最高位作为校验位,接收到的数据已经保存在Rdata变量中。〔解答〕 ;数据段 Rdata byte 57h;保存接收的数据 error byte 'Error!',0;代码段 mov al,Rdata and al,0ffh;标志PF反映“1”的个数 jp done;个数为偶数,正确继续 mov eax,offset error;个数为奇数,显示出错 call dispmsg done: 〔习题4.9〕 指令CDQ将EAX符号扩展到EDX,即:EAX最高为0,则EDX=0;EAX最高为1,则EDX=FFFFFFFFH。请编程实现该指令功能。〔解答1〕 test eax,8000h;测试最高位 jz next1;最高位为0(ZF=1),转移到标号NEXT1 mov edx,0ffffffffh;最高位为1,顺序执行:设置EDX=FFFFFFFFH jmp done;无条件转移,跳过另一个分支 next1: mov dx,0;最高位为0转移到此执行:设置EDX=0 done: 〔解答2〕 使用移位指令更好。 rol eax,1 rcr edx,1 sar edx,31 ror eax,1 〔习题4.10〕 编程,首先测试双字变量DVAR的最高位,如果为1,则显示字母“L”;如果最高位不为1,则继续测试最低位,如果最低位为1,则显示字母“R”;如果最低位也不为1,则显示字母“M”。〔解答〕 ;数据段 dvar dword 57h;代码段 mov eax,dvar test eax,80000000h jnz nextl test eax,1 jnz nextr mov al,'M' jmp done nextl: mov al,'L' jmp done nextr: mov al,'R' done: call dispc 〔习题4.11〕编写一个程序,先提示输入数字“Input Number:0~9”,然后在下一行显示输入的数字,结束;如果不是键入了0~9数字,就提示错误“Error!”,继续等待输入数字。〔解答〕 ;数据段 inmsg byte 'Input number(0~9): ',0 ermsg byte 0dh,0ah,'Error!Input again: ',0;代码段 mov eax,offset inmsg;提示输入数字 call dispmsg again: call readc;等待按键 cmp al,'0';数字 < 0? jb erdisp cmp al,'9';数字 > 9? ja erdisp call dispcrlf call dispc jmp done erdisp: mov eax,offset ermsg call dispmsg jmp again done: 〔习题4.12〕 有一个首地址为ARRAY的20个双字的数组,说明下列程序段的功能。 mov ecx,20 mov eax,0 mov esi,eax sumlp: add eax,array[esi] add esi,4 loop sumlp mov total,eax 〔解答〕 求这20个双字的和,保存在TOTAL变量,不关进心进位和溢出。〔习题4.13〕 编程中经常要记录某个字符出现的次数。现编程记录某个字符串中空格出现的次数,结果保存在SPACE单元。〔解答〕 ;数据段 string byte 'Do you have fun with Assembly ?',0;以0结尾的字符串 space dword ?;代码段 mov esi,offset string xor ebx,ebx;EBX用于记录空格数 again: mov al,[esi] cmp al,0 jz done cmp al,20h;空格的ASCII码是20H jne next;不相等、不是空格,转移 inc bx;相等、是空格,空格个数加1 next:inc esi jmp again;继续循环 done: mov space,ebx;保存结果 〔习题4.14〕 编写计算100个16位正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到WORDSUM,如超过则显示‘Overflow!’。〔解答〕 ;数据段 array word 2005,2008,98 dup(1394);假设100个16位正整数 wordsum word ? error byte 'Overflow!',0;代码段 and ebx,0 mov ecx,100 xor ax,ax again: add ax,array[ebx*2] jc over inc ebx loop again mov wordsum,ax over: mov eax,offset error call dispmsg 〔习题4.15〕 在一个已知长度的字符串中查找是否包含“BUG”子字符串。如果存在,显示“Y”,否则显示“N”。〔解答〕 ;数据段 string byte 'If you find any error in the program, you can DEBUG it.' count = sizeof string bug byte 'BUG';代码段 mov ecx,count mov edi,offset string L1: mov esi,offset bug push edi mov edx,sizeof bug LN: mov al,[esi] cmp [edi],al jne L2 inc esi inc edi dec edx jne LN pop edi mov al,'Y' jmp L3 L2: pop edi inc edi loop L1 mov al,'N' L3: call dispc 〔习题4.16〕 主存中有一个8位压缩BCD码数据,保存在一个双字变量中。现在需要进行显示,但要求不显示前导0。由于位数较多,需要利用循环实现,但如何处理前导0和数据中间的0呢?不妨设置一个标记。编程实现。〔解答〕 ;数据段 bcd dword 00371002h;代码段 mov esi,bcd cmp esi,0 jnz goon mov al,'0' call dispc jmp done goon: mov ecx,8 xor ebx,ebx;EBX=0,表示可能是前导0 again: rol esi,4 mov eax,esi and eax,0fh;EAX低4位保存当前要显示的BCD码 cmp ebx,0;EBX≠0,说明不是前导0,要显示 jnz disp;EBX=0,说明可能是前导0 cmp eax,0 jz next;EAX=0,说明是前导0,不显示 mov ebx,1;EAX≠0,没有前导0了,令EBX=1≠0 disp: add al,30h call dispc next:loop again done: 〔习题4.17〕 已知一个字符串的长度,剔除其中所有的空格字符。请从字符串最后一个字符开始逐个向前判断、并进行处理。〔解答〕 ;数据段 string byte 'Let us have a try!',0dh,0ah,0;代码段 mov ecx,sizeof string cmp ecx,2 jb done lea eax,string;显示处理前的字符串 call dispmsg mov esi,ecx dec esi outlp: cmp string[esi],' ';检测是否是空格 jnz next;不是空格继续循环 mov edi,esi;是空格,进入剔除空格分支 dec ecx inlp: inc edi mov al,string[edi];前移一个位置 mov string[edi-1],al cmp edi,ecx jb inlp next:dec esi;继续进行 cmp esi,0 jnz outlp;为0结束 lea eax,string;显示处理后的字符串 call dispmsg done: 〔习题4.18〕 第3章习题3.14在屏幕上显示ASCII表,现仅在数据段设置表格缓冲区,编程将ASCII代码值填入留出位置的表格,然后调用显示功能实现(需要利用双重循环)。〔解答〕 include io32.inc.data table byte ' |0 1 2 3 4 5 6 7 8 9 A B C D E F',13,10 byte '---+',13,10 tab1 byte 6 dup(36 dup(?),13,10) byte 0.code start: mov ebx,offset tab1 mov edx,'| 02' mov ax,2020h mov esi,6 again0: mov [ebx],edx add ebx,4 mov ecx,16 again1: mov word ptr [ebx],ax add ebx,2 inc al loop again1 add ebx,2 add edx,1 dec esi jnz again0 mov eax,offset table call dispmsg exit 0 end start 〔习题4.19〕 请按如下说明编写子程序: 子程序功能:把用ASCII码表示的两位十进制数转换为压缩BCD码 入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码 出口参数:AL=对应BCD码 〔解答〕 asctob proc shl dh,4 mov al,dh and dl,0fh or al,dl ret asctob endp 〔习题4.20〕 乘法的非压缩BCD码调整指令AAM执行的操作是:AH←AL÷10的商,AL←AL÷10的余数。利用AAM可以实现将AL中的100内数据转换为ASCII码,程序如下: xor ah,ah aam add ax,3030h 利用这段程序,编写一个显示AL中数值(0~99)的子程序。〔解答〕 disp99 proc xor ah,ah aam add ax,3030h push ax mov al,ah call dispc pop ax call dispc ret disp99 endp 〔习题4.21〕 编写一个源程序,在键盘上按一个键,将其返回的ASCII码值显示出来,如果按下ESC键(对应ASCII码是1BH)则程序退出。请调用书中的HTOASC子程序。〔解答〕 ;代码段,主程序 again: call readc cmp al,1bh jz done mov bl,al mov al,':' call dispc mov al,bl rol al,4 call htoasc;调用子程序 call dispc;显示一个字符 mov al,bl call htoasc;调用子程序 call dispc;显示一个字符 call dispcrlf jmp again done: 〔习题4.22〕 编写一个子程序,它以二进制形式显示EAX中32位数据,并设计一个主程序验证。〔解答〕 ;代码段,主程序 mov eax,8F98FF00H call dispbd;调用子程序 ;代码段,子程序 dispbd proc;32位二进制数的输出 push ecx push edx mov ecx,32;要输出的字符个数 dbd: rol eax,1;AL循环左移一位 push eax and al,01h;取AL最低位 add al,30h;转化成相应的ASCLL码值 call dispc;以二进制的形式显示 pop eax loop dbd pop edx pop ecx ret dispbd endp 〔习题4.23〕 将例题4-16的32位寄存器改用16位寄存器,仅实现输出-215~+215-1之间的数据。〔解答〕 ;数据段 array word 12345,-1234,32767,-32768,0,667 writebuf byte 6 dup(0);代码段,主程序 mov ecx,lengthof array mov ebx,0 again: mov ax,array[ebx*2] call write call dispcrlf inc ebx ;此时ebx代表array中的第几个数 dec ecx ;此时ecx代表循环的次数 jnz again;代码段,子程序 write proc ;子程序开始 push ebx push ecx push edx mov ebx,offset writebuf ;ebx指向显示缓冲区 test ax,ax jnz write1 mov byte ptr [ebx],30h inc ebx jmp write5 write1: ;若不为0则首先判断是正是负 jns write2 ;若为正则跳过下面两步到write2 mov byte ptr [ebx],'-' inc ebx neg ax write2: mov cx,10 push cx ;将cx=10压入栈,作为退出标志 write3: ;write3是让eax循环除以10并把余数的ASCII码压入栈 cmp ax,0 jz write4 xor dx,dx div cx add dx,30h push dx jmp write3 write4: ;余数的ASCII码出栈,遇到10终止并转到write5显示结果 pop dx cmp dx,cx jz write5 mov byte ptr [ebx],dl inc ebx jmp write4 write5: ;显示结果 mov byte ptr [ebx],0 mov eax,offset writebuf call dispmsg pop edx pop ecx pop ebx ret write endp 〔习题4.24〕 参考例题4-17,编写实现32位无符号整数输入的子程序,并设计一个主程序验证。〔解答〕 ;数据段 count =10 array dword count dup(0)tempdword ? readbuf byte 30 dup(0)errmsg byte 'Input error,enter again!',13,10,0 msg1 byte 'Input ten unsigned numbers,each number ends with enter key:',13,10,0 msg2 byte 'Check the numbers your inputted:',13,10,0;代码段,主程序 mov eax,offset msg1 call dispmsg mov ecx,count mov ebx,offset array again: call read mov eax,temp mov [ebx],eax add ebx,4 dec ecx jnz again mov eax,offset msg2 call dispmsg mov edx,offset array mov ecx,count next: mov eax,[edx] call dispuid call dispcrlf add edx,4 dec ecx jnz next;代码段,子程序 read proc push eax push ecx push ebx push edx read0: mov eax,offset readbuf call readmsg test eax,eax jz readerr cmp eax,12 ja readerr mov edx,offset readbuf xor ebx,ebx xor ecx,ecx mov al,[edx] cmp al,'+' jz read1 cmp al,'-' jnz read2 jmp readerr read1: inc edx mov al,[edx] test al,al jz read3 ;如果为0,则说明该字符串已结束 read2: cmp al,'0' jb readerr cmp al,'9' ja readerr sub al,30h imul ebx,10 ;ebx用来存储处理过的数据 jc readerr movzx eax,al add ebx,eax jnc read1 readerr: mov eax,offset errmsg call dispmsg jmp read0 read3: mov temp,ebx pop edx pop ebx pop ecx pop eax ret read endp 〔习题4.25〕 编写一个计算字节校验和的子程序。所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。主程序提供入口参数,有数据个数和数据缓冲区的首地址。子程序回送求和结果这个出口参数。〔解答〕 ;计算字节校验和的通用过程 ;入口参数:DS:EBX=数组的段地址:偏移地址,ECX=元素个数 ;出口参数:AL=校验和 ;说明:除EAX/EBX/ECX外,不影响其他寄存器 checksumproc xor al,al;累加器清0 sum: add al,[ebx];求和 inc ebx;指向下一个字节 loop sum ret checksumendp 〔习题4.26〕 编制3个子程序把一个32位二进制数用8位十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。(1)采用EAX寄存器传递这个32位二进制数(2)采用temp变量传递这个32位二进制数(3)采用堆栈方法传递这个32位二进制数 〔解答〕(1) ;数据段 wvarword 307281AFH;代码段,主程序 mov eax,wvar call disp mov al,'H' call dispc;代码段,子程序 disp proc push ebx push ecx mov ecx,8;8位 dhw1: rol eax,4 mov ebx,eax and al,0fh;转换为ASCII码 add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc mov eax,ebx loop dhw1 pop ecx pop ebx ret disp endp (2) ;数据段 wvarword 307281AFH tempword ?;代码段,主程序 mov eax,wvar mov temp,eax call disp mov al,'H' call dispc;代码段,子程序 disp proc push ebx push ecx mov ecx,8;8位 mov eax,temp dhw1: rol eax,4 mov ebx,eax and al,0fh;转换为ASCII码 add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc ;显示一个字符 mov eax,ebx loop dhw1 pop ecx pop ebx ret disp endp(3) ;数据段 wvarword 307281AFH;代码段,主程序 push wvar call disp add esp,4 mov al,'H' call dispc;代码段,子程序 disp proc push ebp mov ebp,esp push ebx push ecx mov ecx,8;8位 mov eax,[ebp+8] dhw1: rol eax,4 mov ebx,eax and al,0fh;转换为ASCII码 add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc mov eax,ebx loop dhw1 pop ecx pop ebx pop ebp ret disp endp 〔习题4.27〕 配合例题4-11的简单加密解密程序,设计一个输入密码的程序,将输入的若干字符经过适当算法得到一个字节量密码。〔解答〕;ex0427.asm include io32.inc.data key byte ? msg0 byte 'Enter your password:',0 passw byte 50 dup(0)errormsg byte 'Password error, input again!',13,10,0 bufnum = 255 buffer byte bufnum+1 dup(0);定义键盘输入需要的缓冲区 msg1 byte 'Enter messge: ',0 msg2 byte 'Encrypted message: ',0 msg3 byte 'Original messge: ',0.code start: mov eax,offset msg0;提示输入加密密码 call dispmsg mov eax,offset passw;设置入口参数EAX call readmsg;调用输入字符串子程序输入密码 mov ecx,eax dec ecx xor ebx,ebx mov al,passw[ebx] again0: inc ebx xor al,passw[ebx];使用简单的异或方法得到加密关键字 loop again0 mov key,al;保存加密关键字 mov eax,offset msg1;提示输入字符串 call dispmsg mov eax,offset buffer;设置入口参数EAX call readmsg;调用输入字符串子程序 push eax;字符个数保存进入堆栈 mov ecx,eax;ECX=实际输入的字符个数,作为循环的次数 xor ebx,ebx;EBX指向输入字符 encrypt: mov al,key;AL=加密关键字 xor buffer[ebx],al;异或加密 inc ebx dec ecx;等同于指令:loop encrypt jnz encrypt;处理下一个字符 mov eax,offset msg2 call dispmsg mov eax,offset buffer;显示加密后的密文 call dispmsg call dispcrlf;again: mov eax,offset msg0;提示输入解密密码 call dispmsg mov eax,offset passw;设置入口参数EAX call readmsg;调用输入字符串子程序输入密码 mov ecx,eax dec ecx xor ebx,ebx mov al,passw[ebx] again1: inc ebx xor al,passw[ebx];使用简单的异或方法得到加密关键字 loop again1 cmp key,al;与原加密关键字比较 jz next;密码相同,则进行解密 mov eax,offset errormsg;提示输入解密密码错误 call dispmsg jmp again next:pop ecx;从堆栈弹出字符个数,作为循环的次数 xor ebx,ebx;EBX指向输入字符 decrypt: mov al,key;AL=解密关键字 xor buffer[ebx],al;异或解密 inc ebx dec ecx jnz decrypt;处理下一个字符 mov eax,offset msg3 call dispmsg mov eax,offset buffer;显示解密后的明文 call dispmsg 〔习题4.28〕 设计一个简单的两个整数的加法器程序。〔解答〕;ex0428.asm include io32.inc.data msg1 byte 'Enter the integers:',13,10,0 msg2 byte 13,10,'Enter space to continue!Enter any other key to exit!',13,10,0.code start: mov eax,offset msg1 call dispmsg call readsid mov ebx,eax mov al,'+' call dispc call dispcrlf call readsid add ebx,eax mov al,'=' call dispc mov eax,ebx call dispsid call dispcrlf mov eax,offset msg2 call dispmsg call readc cmp al,20h je start exit 0 end start 〔习题4.29〕 利用十六进制字节显示子程序DISPHB设计一个从低地址到高地址逐个字节显示某个主存区域内容的子程序DISPMEM。其入口参数:EAX=主存偏移地址,ECX=字节个数(主存区域的长度)。同时编写一个主程序进行验证。〔解答〕 ;ex0429.asm in Windows Console include io32.inc.data var byte 'This is a test!'.code start:;主程序 mov eax,offset var mov ecx,sizeof var call dispmem exit 0;子程序 dispmem proc push ebx mov ebx,eax dispm1: mov al,[ebx] call disphb mov al,' ' call dispc inc ebx loop dispm1 pop ebx ret dispmem endp end start 〔习题4.30〕 将例题4-19分别使用子程序模块、子程序库和子程序库包含方法生成最终可执行文件。〔习题4.31〕 区别如下概念:宏定义、宏调用、宏指令、宏展开、宏汇编。〔解答〕 宏定义:就是对宏进行说明,由一对宏汇编伪指令MACRO和ENDM来完成。宏调用:宏定义之后的使用。在使用宏指令的位置写下宏名,后跟实体参数。宏指令:使用宏时,其形式很像指令,所以称为宏指令。宏展开:在汇编时,汇编程序用对应的代码序列替代宏指令。宏汇编:指使用宏的方法进行汇编语言程序设计。〔习题4.32〕 直接使用控制台输入和输出函数实现例题4-21的功能(不使用READMSG和DISPMSG子程序)。〔解答〕 〔习题4.33〕 直接使用控制台输出函数实现某个主存区域内容的显示(习题4.29的功能)。可以改进显示形式,例如每行显示16个字节(128位),每行开始先显示首个主存单元的偏移地址,然后用冒号分隔主存内容。〔解答〕 〔习题4.34〕 如何进行很简单的修改,使得例题4-22程序的消息窗有“OK”和“Cancel”两个按钮。〔解答〕 将MB_OK常量定义为1,即: MB_OK equ 1 〔习题4.35〕 上机实践例题4-23和例题4-24,并在创建可执行文件的过程中生成汇编语言列表文件。〔习题4.36〕 Pentium处理器含有一个64位的时间标记计数器(Time-Stamp Counter)。该计数器每个时钟周期递增(加1);在上电和复位后,该计数器清0。指令“RDTSC”执行后将在EDX(高32位)和EAX(低32位)返回当前的64位时间标记计数器值。利用RDTSC指令在某个函数运行前获得时间标记计数器值,然后运行该函数后,立即再次执行RDTSC指令,并将再次获得的时间标记计数器值与之前的计数值相减,得到的差值就是运行该函数需要的时钟周期数(乘以时钟周期,等于运行时间)。请利用混合编程方法显示某个函数的运行时钟周期数。〔解答〕 第5章 微机总线 〔习题5.1〕简答题 〔解答〕 ① 数据总线承担着处理器与存储器、外设之间的数据交换,既可以输入也可以输出,故其是双向的。 ② 为减少引脚个数,8086采用了地址总线和数据总线分时复用。即数据总线在不同时刻还具有地址总线的功能。 ③ 具有三态能力的引脚当输出呈现高阻状态时,相当于连接了一个阻抗很高的外部器件,信号无法正常输出;即放弃对该引脚的控制,与其他部件断开连接。 ④ 处理器的运行速度远远快于存储器和I/O端口。处理器检测到存储器或I/O端口不能按基本的总线周期进行数据交换时,插入一个等待状态Tw。等待状态实际上是一个保持总线信号状态不变的时钟周期。 ⑤ 猝发传送是处理器只提供首地址、但可以从后续连续的存储单元中读写多个数据。⑥ 总线上可能连接多个需要控制总线的主设备,需要确定当前需要控制总线的主设备,所以需要总线仲裁。 ⑦ 异步时序是由总线握手(Handshake)联络(应答)信号控制,不是由总线时钟控制。故总线时钟信号可有可无。 ⑧ 单总线结构限制了许多需要高速传输速度的部件。32位PC机采用多种总线并存的系统结构。各种专用局部总线源于处理器芯片总线,以接近处理器芯片引脚的速度传输数据,它为高速外设提供速度快、性能高的共用通道。⑨ 4个。 ⑩ 即插即用技术是指32位PC机的主板、操作系统和总线设备配合,实现自动配置功能。〔习题5.2〕判断题 〔解答〕 ① 对 ② 对 ③ 错 ④ 对 ⑤ 对 ⑥ 错 ⑦ 对 ⑧ 对 ⑨ 对 ⑩ 错 〔习题5.3〕填空题 〔解答〕 ① 0 ② 读,写 ③ 存储器读,存储器读,存储器写 ④ 4,2,10ns ⑤ 低有效,0010 ⑥ 寻址,数据传送 ⑦ 127,1.5Mb/s,12Mb/s ⑧ 地址,数据 ⑨,⑩,I/O CH RDY 〔习题5.4〕 处理器有哪4种最基本的总线操作(周期)? 〔解答〕 存储器读、存储器写,I/O读、I/O写。〔习题5.5〕 8086处理器的输入控制信号有RESET,HOLD,NMI和INTR,其含义各是什么?当它们有效时,8086 CPU将出现何种反应? 〔解答〕 RESET:复位输入信号,高电平有效。该引脚有效时,将迫使处理器回到其初始状态;转为无效时,CPU重新开始工作。 HOLD:总线请求,是一个高电平有效的输入信号。该引脚有效时,表示其他总线主控设备向处理器申请使用原来由处理器控制的总线。 NMI:不可屏蔽中断请求,是一个利用上升沿有效的输入信号。该引脚信号有效时,表示外界向CPU申请不可屏蔽中断。 INTR:可屏蔽中断请求,是一个高电平有效的输入信号。该引脚信号有效时,表示中断请求设备向处理器申请可屏蔽中断。〔习题5.6〕 区别概念:指令周期、总线周期(机器周期)、时钟周期、T状态。〔解答〕 指令周期:一条指令从取指、译码到最终执行完成的过程。总线周期(机器周期):有数据交换的总线操作。时钟周期:处理器的基本工作节拍,由时钟信号产生,一个高电平和一个低电平为一个周期。T状态:完成特定操作的一个时钟周期。由于时间上一个T状态等于一个时钟周期,所以常常将两者混为一谈。〔习题5.7〕 总结8086各个T状态的主要功能。〔解答〕 T1状态:总线周期的第一个时钟周期主要用于输出存储器地址或I/O地址; T2状态:输出读/写控制信号。 T3状态:锁存地址、处理器提供的控制信号和数据在总线上继续维持有效,且T3时钟的前沿(下降沿)对READY引脚进行检测。READY信号有效,进入T4周期。 T4状态:总线周期的最后一个时钟周期,处理器和存储器或I/O端口继续进行数据传送,直到完成,并为下一个总线周期做好准备。 Tw状态:等待状态。处理器在T3前沿发现READY信号无效后,插入Tw。Tw状态的引脚信号延续T3时的状态、维持不变。〔习题5.8〕 请解释8086(最小组态)以下引脚信号的含义:CLK,A19/S6~A16/S3,AD15~AD0,ALE,和。默画它们在具有一个等待状态的存储器读总线周期中的波形示意。〔解答〕 CLK:时钟输入。时钟信号是一个频率稳定的数字信号,其频率就是处理器的工作频率,工作频率的倒数就是时钟周期的时间长度。 A19/S6~A16/S3:地址/状态分时复用引脚,是一组4个具有三态能力的输出信号。这些引脚在访问存储器的第一个时钟周期输出高4位地址A19~A16,在访问外设的第一个时钟周期输出低电平无效;其他时间输出状态信号S6~S3。 AD15~AD0:地址/数据分时复用引脚,共16个引脚,用作地址总线时是单向输出信号;用作数据总线时是双向信号,具有三态输出能力。ALE:地址锁存允许,是一个三态、输出、高电平有效的信号。有效时,表示复用引脚(AD15~AD0和A19/S6~A16/S3)上正在传送地址信号。 :访问存储器或者I/O,是一个三态输出信号,该引脚高电平时,表示处理器将访问存储器,此时地址总线A19~A0提供20位的存储器物理地址。该引脚低电平时,表示处理器将访问I/O端口,此时地址总线A15~A0提供16位的I/O地址。 :读控制,也是一个三态、输出低电平有效信号。有效时,表示处理器正在从存储单元或I/O端口读取数据。 :写控制,是一个三态、输出低电平有效信号。有效时,表示处理器正将数据写到存储单元或I/O端口。〔习题5.9〕 区别如下总线概念:芯片总线、局部总线、系统总线;并行总线、串行总线;地址总线、数据总线、控制总线;ISA总线、PCI总线。〔解答〕 芯片总线:是指大规模集成电路芯片内部,或系统中各种不同器件连接在一起的总线;用于芯片级互连。 局部总线:位于处理器附件的器件相互连接的总线,相对于芯片总线。系统总线:通常是指微机系统的主要总线。并行总线:采用并行传输方式的总线。 串行总线:将多位数据按二进制位的顺序在数据线上逐位传送的总线。地址总线:实现地址信息互连和交换的一组导线。数据总线:实现数据信息互连和交换的一组导线。 控制总线:控制协调处理器和内存、外设交互信息的一组导线。 ISA总线:即IBM PC/AT总线,以处理器80286引脚形成的总线,分成支持8位操作的前62信号和扩展16位操作的后36信号。 PCI总线:外设部件互连总线,不仅适用于IA-32处理器,也适用其它处理器,支持32位和64位操作,广泛用于32位通用微型计算机中。〔习题5.10〕 什么是同步时序、半同步时序和异步时序? 〔解答〕 同步时序:总线操作的各个过程由共用的总线时钟信号控制。半同步时序:总线操作仍由共用的总线时钟信号控制,但慢速模块可以通过等待信号让快速模块等待。 异步时序:总线操作需要握手(Handshake)联络(应答)信号控制,总线时钟信号可有可无。 〔习题5.11〕 EISA总线的时钟频率是8MHz,每2个时钟可以传送一个32位数据,计算其总线带宽。〔解答〕 (32×8)÷(2×8)=16MBps 〔习题5.12〕 PCI总线有什么特点? 〔解答〕 PCI总线与处理器无关,具有32位和64位数据总线,有+5V和+3.3V两种设计,采用集中式总线仲裁、支持多处理器系统,通过桥(Bridge)电路兼容ISA/EISA总线,具有即插即用的自动配置能力等一系列优势。〔习题5.13〕 PCI总线操作如何插入等待状态? 〔解答〕 主设备利用IRDY#信号无效、从设备利用TRDY#信号无效要求对方等待,即插入等待状态。〔习题5.14〕 什么是USB总线支持的“热插拔”,这个特性有什么意义? 〔解答〕 “热插拔”是在PC机正常工作状态进行插入或拔出。这个特性可以使用户随时连接USB设备。 〔习题5.15〕 简述USB总线的主要特征? 〔解答〕 使用方便、扩充能力强。 支持多种传输速度、适用面广。低功耗、低成本、占用系统资源少。〔习题5.16〕 USB总线的集线器有什么作用?主机上是否需要集线器? 〔解答〕 集线器是专门用于提供额外USB接入点的USB设备。主机需要集线器,被称为根集线器。〔习题5.17〕 USB总线协议支持哪几种数据传输方式?简述之。〔解答〕 USB的数据传输有4种: 控制传输――在USB设备初次安装时,USB系统软件使用控制传输方式设置USB设备参数、发送控制指令、查询状态等。批量传输――对于打印机、扫描仪等设备需要传输大量数据,可以使用批量传输方式连续传输一批数据。 中断传输――该方式传输的数据量很小,但需要及时处理,以保证实时性,主要用于键盘、鼠标等设备上。 同步传输――该方式以稳定的速率发送和接收信息,保证数据的连续和及时,用于数据传输正确性要求不高而对实时性要求高的外设,例如麦克风、喇叭、电话等。第6章 存储系统 〔习题6.1〕简答题 〔解答〕 ① 因为各种存储器件在容量、速度和价格方面存在矛盾。速度快,则单位价格高;容量大,单位价格低,但存取速度慢。故存储系统不能采用一种存储器件。② Cache中复制着主存的部分内容。当处理器试图读取主存的某个字时,Cache控制器首先检查Cache中是否已包含有这个字。若有,则处理器直接读取Cache,这种情况称为高速命中;若无,则称为高速缺失。 ③ 标签存储器保存着该数据所在主存的地址信息。④ 主存块与Cache行之间的对应关系称“地址映射”,Cache通过地址映射确定一个主存块应放到哪个Cache行组中。 ⑤ 写入策略用于解决写入Cache时引起主存和Cache内容不一致性的问题。 ⑥ 存取时间是指从读/写命令发出,到数据传输操作完成所经历的时间;存取周期表示两次存储器访问所允许的最小时间间隔。存取周期大于等于存取时间。 ⑦ 虚拟存储器是由操作系统利用辅助存储器、以磁盘文件形式建立的、在主存储器与辅助存储器之间的一个存储器。⑧ DRAM芯片容量大、芯片小,高集成度,引脚数量少。故DRAM芯片将地址引脚分时复用,即用一组地址引脚传送两批地址。第一批地址称行地址,第二批地址称列地址。⑨ 译码电路中只有部分地址线参与译码会造成地址重复,也就是一个存储单元占有多个存储器地址。 ⑩页表项的P位称为存在位(Present),表示该页面是否在物理存储器中。〔习题6.2〕判断题。 〔解答〕 ① 错 ② 对 ③ 对 ④ 对 ⑤ 对 ⑥ 错 ⑦ 错 ⑧ 对 ⑨ 错 ⑩ 对 〔习题6.3〕填空题 〔解答〕 ① 8,1024,1024,1024,1024,240 ② 8KB,4 ③ 随机存取存储器,丢失,只读存储器,读取,不会丢失 ④ 8,13,8 ⑤ 2 ⑥(UV-)EPROM,Flash Memory ⑦ 58000H,5FFFFH,32KB ⑧ 32,4,64,8 ⑨ 直接映射,组合相关映射,全相关映射,2路组合相关映射 ⑩ 00820000H,02000H 〔习题6.4〕 举例说明存储访问的局部性原理。〔解答〕 处理器访问存储器时,无论是读取指令还是存取数据,所访问的存储单元在一段时间内都趋向于一个较小的连续区域中,这就是存储访问的局部性原理。例如,求平均值的函数。long mean(long d[], long num){ long i,temp=0; for(i=0;i temp=temp/num; return(temp);} 函数中的变量temp体现了时间局部,因为每次循环都要使用它。顺序访问数组d[]的各个元素(相邻存放在主存),体现了空间局部。循环体内的指令顺序存放,依次读取执行体现了空间局部;同时重复执行循环体,又体现了时间局部。〔习题6.5〕 简述存储系统的层次结构及各层存储部件特点。〔解答〕 为解决容量、速度和价格的矛盾,存储系统采用金字塔型层次结构,单位价格和速度自上而下逐层减少,容量自上而下逐层增加。 存储系统的各层存储部件自上而下依次是:CPU寄存器、高速缓存、主存存储器(RAM/ROM),辅助存储器如磁盘、光盘等。CPU寄存器、高速缓存器集成在CPU芯片上,对用户来说,是透明的,它们用于暂存主存和处理器交互的数据,以减少频繁读取主存而影响处理器速度;主存储器则可和处理器直接交换数据,而辅助存储器必须经过主存存储器,才可与处理器进行数据交换。〔习题6.6〕 在半导体存储器件中,什么是SRAM、DRAM和NVRAM? 〔解答〕 SRAM是静态读写存储器芯片,它以触发器为基本存储单元,以其两种稳定状态表示逻辑0和逻辑1。 DRAM是动态读写存储器芯片,它以单个MOS管为基本存储单元,以极间电容充放电表示两种逻辑状态,需要不断刷新保持信息正确。NVRAM多指带有后备电池的SRAM芯片,这种芯片采用CMOS制造工艺设计以减少用电。〔习题6.7〕 SRAM芯片的片选信号有什么用途?对应读写控制的信号是什么? 〔解答〕 片选信号 :片选有效时,才可以对该芯片进行读/写操作;无效时,数据引脚呈现高阻状态、与系统数据总线隔离,并可降低内部功耗。 读控制信号 :在芯片被选中的前提下,若 有效,则芯片将允许地址信号选择的存储单元内的数据输出到数据引脚上。 写控制信号 :在芯片被选中的前提下,若 有效,则芯片将数据引脚上的数据写入地址信号选择的存储单元内。〔习题6.8〕 DRAM为什么要刷新,存储系统如何进行刷新? 〔解答〕 DRAM以单个MOS管为基本存储单元,以极间电容充放电表示两种逻辑状态。由于极间电容的容量很小,充电电荷自然泄漏会很快导致信息丢失,所以要不断对它进行刷新操作、即读取原内容、放大再写入。 存储系统的刷新控制电路提供刷新行地址,将存储DRAM芯片中的某一行选中刷新。实际上,刷新控制电路是将刷新行地址同时送达存储系统中所有DRAM芯片,所有DRAM芯片都在同时进行一行的刷新操作。刷新控制电路设置每次行地址增量,并在一定时间间隔内启动一次刷新操作,就能够保证所有DRAM芯片的所有存储单元得到及时刷新。〔习题6.9〕 什么是掩摸ROM、OTP-ROM、EPROM、EEPROM和Flash ROM? 〔解答〕 掩膜ROM:通过掩膜工艺、将要保存的信息直接制作在芯片当中,以后再也不能更改。OTP-ROM:该类芯片出厂时存储的信息为全“1”,允许用户进行一次性编程,此后便不能更改。 EPROM:一般指可用紫外光擦除、并可重复编程的ROM。 EEPROM:也常表达为E2PROM,其擦除和编程(即擦写)通过加电的方法来进行,可实现“在线编程”和“在应用编程” Flash ROM:是一种新型的电擦除可编程ROM芯片,能够很快擦除整个芯片内容。〔习题6.10〕 请给出教材图6-7中138译码器的所有译码输出引脚对应的地址范围。〔解答〕 ~ 的地址范围依次是: E0000H~E3FFFH,E4000H~E7FFFH,E8000H~EBFFFH,EC000H~EFFFFH,F0000H~F3FFFH,F4000H~F7FFFH,F8000H~FBFFFH,FC000H~FFFFFH。〔习题6.11〕 什么是存储器芯片的全译码和部分译码?各有什么特点? 〔解答〕 全译码:使用全部系统地址总线进行译码。特点是地址唯一,一个存储单元只对应一个存储器地址(反之亦然),组成的存储系统其地址空间连续。 部分译码:只使用部分系统地址总线进行译码。其特点:有一个没有被使用的地址信号就有两种编码,这两个编码指向同一个存储单元,出现地址重复。〔习题6.12〕 区别如下各个主存名称的含义:常规主存,扩展主存,扩充主存;上位主存区UMA和上位主存块UMB,高端主存区HMA,影子主存。〔解答〕 常规主存:8088和8086提供20个地址线A19~A0,寻址1MB的存贮空间,其中,最低640KB的系统RAM区被称为常规主存或基本主存。 扩展主存:IA-32处理器在1MB之后的主存空间都作为RAM区域使用,被称为扩展主存。扩充主存:处理器不可以直接访问,利用“体交换技术”实现处理器访问。上位主存区UMA:在常规主存其后384KB(A0000H~FFFFFH)主存称为上位主存区UMA。上位主存块UMB:上位主存区UMA没有被使用部分,被开辟为上位主存块UMB。 高端主存区HMA:在实方式下,通过控制A20开放,程序可以访问的1MB之后的64KB区域。 影子主存:PC机启动后可以将ROM-BIOS映射到RAM中,这部分用作ROM-BIOS、并被操作系统设置为只读的RAM区域。〔习题6.13〕 开机后,微机系统常需要检测主存储器是否正常。例如,可以先向所有存储单元写入数据55H(或00H)、然后读出看是否还是55H(或00H);接着再向所有存储单元写入数据AAH(或FFH)、然后读出看是否还是AAH(或FFH)。利用两个二进制各位互反的“花样”数据的反复写入、读出和比较就能够识别出有故障的存储单元。利用获得的有故障存储单元所在的物理地址,如果能够分析出该存储单元所在的存储器芯片,就可以实现芯片级的维修。试利用汇编语言编写一个检测常规主存最高64KB(逻辑地址从9000H∶0000H到9000H∶FFFFH)的程序,如果发现错误请显示其逻辑地址。〔解答〕 ;代码段 mov ax,9000h mov ds,ax mov ah,55h;先用55H push ax again: mov bx,0 mov al,ah again1: mov [bx],al;写入 dec bx jnz again1 again2: mov al,[bx];读出 cmp al,ah;检测 jz next2 dispcrlf push ax mov ax,ds call disphw;显示段地址 mov al,':' call dispc mov ax,bx call disphw;显示偏移地址 pop ax next2: dec bx jnz again2 pop ax cmp ah,0aah;后用0AAH jz done mov ah,0aah jmp again done: 〔习题6.14〕 什么是LRU替换算法?80486片内Cache中,如果3个替换算法位B2B1B0=010,则将替换哪个Cache行,并给出你的判断过程。〔解答〕 LRU算法是近期最少使用、即选择最长时间未被使用的数据块进行替换的算法。 B0=0,说明最近访问了L2/L3行,所以应该替换L0或L1行。B1=1,说明最近访问了L0行,所以应该替换L1。因为LRU算法是选择最长时间未被访问的Cache行进行替换。〔习题6.15〕 高速缓冲存储器Cache的写入策略是解决什么问题的?有哪两种写入策略,各自的写入策略是怎样的? 〔解答〕 写入策略用于在写命中时Cache与主存内容保持一致。 直写式写入策略指处理器对Cache写入的同时,将数据也写入到主存,这样来保证主存和Cache内容一致。它简单可靠。 回写Cache只有在行替换时才可能写入主存,写入主存的次数,会少于处理器实际执行的写入操作数。回写Cache的性能要高于直写Cache,但实现结构略为复杂。〔习题6.16〕 80486片上8KB Cache的标签存储器为什么只需要21位? 〔解答〕 80486片上Cache共有8KB容量,采用4路组合地址映射方式。对于4GB容量的主存来说,以Cache路为单位,可以分成4GB÷2KB=232÷211=221个Cache路。这样每个Cache行只要设计一个21位的标签存储器,记录该Cache行映射到哪个主存的Cache路。再结合直接映射的组号就可以明确该Cache行对应哪个主存块。〔习题6.17〕 高速缓存的写入操作有几个很近似的英文词汇,它们分别表示什么含义?(1)Write Through(2)Write Back(3)Write Around(4)Fetch on Write 〔解答〕 (1)Write Through:写命中时的直写策略。(2)Write Back:写命中时的回写策略。 (3)Write Around:写未命中时的不写分配法,即绕写法。(4)Fetch on Write:写未命中时的写分配法,即写时取法。〔习题6.18〕 区别如下高速缓存中的概念:(1)主存数据块Block(2)高速缓存行Line(3)高速缓存组Set(4)高速缓存路Way 〔解答〕 (1)主存数据块Block:高速缓存与主存间的数据传送以数据块(Block)为单位,例如B个字。主存数据块Block是主存中连续的B个字数据。 (2)高速缓存行Line:指高速缓存中包含B个字的一个单元。 (3)高速缓存组Set:组合相关映射将多个Cache行作为一个组(Set)。 (4)高速缓存路Way:组合相关映射将所有组中同位置Cache行称为一路(Way)。〔习题6.19〕 什么是段选择器、描述符、描述符表和描述符表寄存器? 〔解答〕 段选择器:保护方式下的16位段寄存器就是段选择器。 描述符:是保护方式引入的数据结构,有8个字节64位,具有段基地址、访问权限、段界限等字段。IA-32处理器利用它来实现存储管理、特权与保护。描述符表:描述符表是存放描述符的一个特殊区域段。描述符表寄存器:指明描述符表所在主存地址的寄存器。〔习题6.20〕 IA-32处理器在保护方式下,段寄存器是什么内容?若DS=78H,说明在保护方式其具体的含义。〔解答〕 段寄存器是段选择器,包含3个域,指向一个段描述符。 DS=78H,说明当前数据段描述符是全局描述符表中的第0FH个描述符。本次访问数据的特权级别为0,最高。〔习题6.21〕 采用4KB分页,说明IA-32处理器将线性地址转换为物理地址的过程。〔解答〕 通过2级查表来实现线性地址转换为位物理地址。 (1)在CR3中包含着当前任务的页目录的起始地址,将其加上线性地址最高10位A31~A22确定的页目录项的偏移量,便访问到指定的页目录项。(2)在此页目录项中包含着指向的页表的起始地址,将其加上线性地址中间的10位A21~A12确定的页表项的偏移量,便访问到指定的页表项。 (3)在此页表项中包含着要访问的页面的起始地址,将其加上线性地址最低12位A11~A0的偏移量,就从这一页中访问到所寻址的物理单元。第7章 输入输出接口 〔习题7.1〕简答题 〔解答〕 ① 外部设备,在工作原理、驱动方式、信息格式、以及工作速度等方面彼此差别很大,与处理器的工作方式也大相径庭。所以,外设不能像存储器芯片那样直接与处理器相连,必须经过一个中间电路。 ② 数据缓冲用于匹配快速的处理器与相对慢速的外设或两个功能部件速度不匹配的数据交换。 ③ 处理器向接口芯片相应端口写入特定的数据,用于选择I/O芯片的工作方式或控制外设工作,该数据称命令字或控制字。 ④ PC机中CMOS RAM不属于主存空间,CMOS RAM有64个字节容量,以8位I/O接口形式与处理器连接,通过两个I/O地址访问。 ⑤ 在输入接口中,为避免多个设备同时向总线发送数据,需要安排一个三态缓冲器。只有当处理器选通时,才允许被选中设备将数据送到系统总线,此时其他输入设备与数据总线隔离。 ⑥ 透明锁存器的控制端为有效电平时,输出随输入变化,常称为直通或透明。非透明锁存器不论其控制端为低或为高电平,输出状态都不随输入变化。 ⑦ 如发光二极管、按键和开关等简单设备,它们的工作方式十分简单;相对处理器而言,其状态很少发生变化或变化很慢。这些设备与处理器交换数据时,可采用无条件传送。⑧ 在查询程序中,当查询超过了规定的时间,设备仍未就绪时,就引发超时错误。 ⑨ 远调用CALL指令利用直接或间接寻址调用另一个代码段的子程序;INT n指令利用中断向量表(地址表)的方法调用另一个代码段的中断服务程序,还有保存标志寄存器的功能。⑩ 外部中断是由处理器外部提出中断请求引起的程序中断。相对于处理器来说,外部中断是随机产生的,所以是真正意义上的中断。〔习题7.2〕判断题 〔解答〕 ① 对 ② 对 ③ 对 ④ 错 ⑤ 错 ⑥ 错 ⑦ 对 ⑧ 错 ⑨ 对 ⑩ 错 〔习题7.3〕填空题 〔解答〕 ① 数字量、开关量、脉冲量 ② I/O独立,输入输出(I/O)指令,直接寻址,DX寄存器间接寻址 ③ I/O端口(接口,外设),处理器(主机),I/O读 ④ 寄存器,I/O地址的直接寻址 ⑤ I/O地址的间接寻址,寄存器 ⑥ 直接存储器存取,DMA请求,总线请求,总线响应,高阻,DMAC(DMA控制器)⑦ 除法错,2 ⑧ 1,STI,CLI,0 ⑨ 1KB,20H,4,F010H∶2300H ⑩ IR3,IR3请求的 〔习题7.4〕 一般的I/O接口电路安排有哪三类寄存器?它们各自的作用是什么? 〔解答〕 ① 数据寄存器 保存处理器与外设之间交换的数据。② 状态寄存器 保存外设当前的工作状态信息。处理器通过该寄存器掌握外设状态,进行数据交换。③ 控制寄存器 保存处理器控制接口电路和外设操作的有关信息。处理器向控制寄存器写入控制信息,选择接口电路的不同工作方式和与外设交换数据形式。〔习题7.5〕 什么是I/O独立编址和统一编址,各有什么特点? 〔解答〕 独立编址是将I/O端口单独编排地址,独立于存储器地址。 统一编址是将I/O端口与存储器地址统一编排,共享一个地址空间。端口独立编址方式,处理器除要具有存储器访问的指令和引脚外,还需要设计I/O访问的I/O指令和I/O引脚,其优点是:不占用存储器空间;I/O指令使程序中I/O操作一目了然;较小的I/O地址空间使地址译码简单。但I/O指令功能简单,寻址方式没有存储器指令丰富。统一编址方式,处理器不再区分I/O口访问和存储器访问。其优点是:处理器不用设计I/O指令和引脚,丰富的存储器访问方法同样能够运用于I/O访问。缺点是:I/O端口会占用存储器的部分地址空间,通过指令不易辨认I/O操作。〔习题7.6〕 简述主机与外设进行数据交换的几种常用方式。〔解答〕 主机与外设进行数据交换的几种常用方式: ① 无条件传送方式,常用于简单设备,处理器认为它们总是处于就绪状态,随时进行数据传送。 ② 程序查询方式:处理器首先查询外设工作状态,在外设就绪时进行数据传送。 ③ 中断方式:外设在准备就绪的条件下通过请求引脚信号,主动向处理器提出交换数据的请求。处理器无其他更紧迫任务,则执行中断服务程序完成一次数据传送。 ④ DMA传送: DMA控制器可接管总线,作为总线的主控设备,通过系统总线来控制存储器和外设直接进行数据交换。此种方式适用于需要大量数据高速传送的场合。〔习题7.7〕 参看图7-5,编程实现以下功能:当K0键单独按下时,发光二极管L0~L7将依次点亮(L0,L1,L2,„„L7),每个维持200ms;当K1键单独按下时,发光二极管L0~L7将反向依次点亮(L7,L6,L5,„„L0),每个也维持200ms;在其他情况下各发光二极管均不点亮。假定有延时200ms的子程序DELAY可直接调用。〔解答〕 again: mov dx,8000h in al,dx cmp al,0feh;D7~D0=11111110B ? jz next1;单独按下K0,转移到next1 cmp al,0fdh;D7~D0=11111101B ? jz next2;单独按下K1,转移到next2 jmp again;其它情况不点亮 next1: mov cx,8 mov al,1;从K0开始 next11: out dx,al;某个LED电亮 call delay;延时200ms shl al,1;rol al,1 loop next11 jmp again next2: mov cx,8 mov al,80h;从K7开始 next21: out dx,al;某个LED电亮 call delay;延时200ms shr al,1;ror al,1 loop next21 jmp again 〔习题7.8〕 现有一个输入设备,其数据端口地址为FFE0H,状态端口地址为FFE2H。当状态标志D0=1时,表明一个字节的输入数据就绪。请编写利用查询方式进行数据传送的程序段,要求从该设备读取100个字节保存到BUFFER缓冲区。〔解答〕 mov bx, offset buffer mov cx,100 again: mov dx,0ffe2h status: in al,dx;查询一次 test al,01h jz status mov dx,0ffe0h in al,dx;输入一个字节 mov [bx],al inc bx loop again;循环,输入100个字节 〔习题7.9〕 某个字符输出设备,其数据端口和状态端口的地址均为80H。在读取状态时,当标志位D7=0时,表明该设备闲,可以接收一个字符。请编写利用查询方式进行数据传送的程序段,要求将存放于缓冲区ADDR处的一串字符(以0为结束标志)输出给该设备。〔解答〕 mov bx,offset addr again: cmp byte ptr [bx],0 jz done status: in al,80h;查询 test al,80h jnz status mov al,[bx] out 80h,al;输出一个字节 inc bx jmp again;循环 done: 〔习题7.10〕 以可屏蔽中断为例,说明一次完整的中断过程主要包括哪些环节? 〔解答〕 中断请求:外设通过硬件信号的形式、向处理器引脚发送有效请求信号。中断响应:在满足一定条件时,处理器进入中断响应总线周期。关中断:处理器在响应中断后会自动关闭中断。 断点保护:处理器在响应中断后将自动保护断点地址。中断源识别:处理器识别出当前究竟是哪个中断源提出了请求,并明确与之相应的中断服务程序所在主存位置。 现场保护:对处理器执行程序有影响的工作环境(主要是寄存器)进行保护。中断服务:处理器执行相应的中断服务程序,进行数据传送等处理工作。恢复现场:完成中断服务后,恢复处理器原来的工作环境。开中断:处理器允许新的可屏蔽中断。 中断返回:处理器执行中断返回指令,程序返回断点继续执行原来的程序。〔习题7.11〕 什么是中断源?为什么要安排中断优先级?什么是中断嵌套?什么情况下程序会发生中断嵌套? 〔解答〕 计算机系统中,凡是能引起中断的事件或原因,被称为中断源。处理器随时可能会收到多个中断源提出的中断请求,因此,为每个中断源分配一级中断优先权,根据它们的高低顺序决定响应的先后。 一个中断处理过程中又有一个中断请求、并被响应处理,被称为中断嵌套。必须在中断服务程序中打开中断,程序才会发生中断嵌套。〔习题7.12〕 明确如下中断有关的概念:中断源、中断请求、中断响应、关中断、开中断、中断返回、中断识别、中断优先权、中断嵌套、中断处理、中断服务。〔解答〕 中断源:能引起中断的事件或原因。 中断请求:是外设通过硬件信号的形式、向处理器引脚发送有效请求信号。中断响应:中断响应是在满足一定条件时,处理器进入中断响应总线周期。关中断:禁止处理器响应可屏蔽中断。开中断:允许处理器响应可屏蔽中断。 中断返回:处理器执行中断返回指令,将断点地址从堆栈中弹出,程序返回断点继续执行原来的程序。中断识别:处理器识别出当前究竟是哪个中断源提出了请求,并明确与之相应的中断服务程序所在主存位置。中断优先权:为每个中断源分配一级中断优先权,即系统设计者事先为每个中断源确定处理器响应他们的先后顺序。 中断嵌套:在一个中断处理过程中又有一个中断请求被响应处理,称为中断嵌套。中断处理:接到中断请求信号后,随之产生的整个工作过程,称中断处理。中断服务:指处理器执行相应的中断服务程序,进行数据传送等处理工作。〔习题7.13〕 按照图7-10所示的中断查询接口与相应的流程图,编写用于中断服务的程序段。具体要求是,当程序查到中断设备0有中断请求(对应数据线D0),它将调用名为PROC0的子程序;如此,依次去查中断设备1~中断设备3,并分别调用名为PROC1~PROC3的子程序。〔解答〕 第一章习题答案 一、选择题 1.十进制数 66 转换成二进制数为_______。 A.11000010 B.01100110 C.11100110 D.01000010 答案:D 2.十进制数 27.25 转换成十六进制数为_______。 A.B1.4H B.1B.19H C.1B.4H D.33.4H 答案:C 3.下列数中最小的是________。 A.(101001)2 B.(52)8 C.(2B)16 D.(50)10 答案:A 4.若一个数的 BCD 编码为 00101001,则该数与______相等。 A.41H B.121D C.29D D.29H 答案:C 5.十进制数 9874 转换成 BCD 数为________。 A.9874H B.4326H C.2692H D.6341H 答案:A 6.BCD 数 64H 代表的真值为_______。 A.100 B.64 C.-100 D.+100 答案:B 7.十六进制数 88H,可表示成下面几种形式,错误的表示为_______。 A.无符号十进制数 136 B.带符号十进制数-120 C.压缩型 BCD 码十进制数 88 D.8 位二进制数-8 的补码表示 答案:D 8.若[A]原=1011 1101,[B]反=1011 1101,[C]补=1011 1101,以下结论正确的是______。 A.C 最大 B.A 最大 C.B 最大 D.A=B=C 答案:B 9.8 位二进制补码表示的带符号数 1000 0000B 和 1111 1111B 的十进制数分别是____。A.128 和 255 B.128 和-1 C.-128 和 255 D.-128 和-1 答案:D 10.微机中地址总线的作用是___________。 A.用于选择存储器单元 B.用于选择进行信息传输的设备 C.用于指定存储器单元和 I/O 设备接口单元的选择地址 D.以上选择都不对 答案:C 11.计算机中表示地址使用____。 A.无符号数 B.原码 C.反码 D.补码 答案:A 二、填空题 1.计算机的主机由_______、控制器、主存储器组成。 答案:运算器 2._______确定了计算机的 5 个基本部件:输入器、______、运算器、_______和控制器,程 序和数据存放在______中,并采用二进制数表示。 答案:冯.诺依曼、输出器 存储器 存储器 3.10110.10111B 的十六进制数是_______,34.97H 的十进制数是______,将 114.25 转换为二 进制数为_______。 答案:16.B8H、52.6055、1110010.01 4.(640)10=(______)2=(________)16 答案:101000 0000 280 5.(256.375)10=(______)2=(________)16 答案:10000 0000.011 100.6 6.(10111100.1101)2=(______)10=(________)16 答案:188.8125 BC.D 7.二进制数 1000 0001B 若为原码,其真值为_____;若为反码,其真值为_____;若为补码,其真值为_____。 答案:-1 -126 -127 8.一个 8 位的二进制整数,若采用补码表示,且由 3 个“1”和 5 个“0”组成,则最小的十 进制数为______。 答案:-125 1000 0011 9.在微机中,一个浮点数由_____和_____两个部分构成。 答案:尾数和阶码 10.若[X]原=[Y]反=[Z]补=90H,试用十进制分别写出其大小,X=_____;Y=_____;Z=_____。答案:-16 -111 -112 三、问答题 1.在计算机中为什么都采用二进制数而不采用十进制数?二进制数有哪两种缩写形式? 答案:二进制数具有运算简单、电路简便可靠等多项优点。计算机的逻辑器件均采用高低电平来表示。二进制数的 0 和 1 正好和逻辑电平的高低相吻合,且二进制数使用很方便,还能 节省元器件,4 个元器件的不同组合就能表示 16 个数。八进制和十六进制 2.什么是程序计数器 PC? 答案:CPU 内部都有一个程序计数器 PC(或指令指针计数器 IP),用来存放将要从存储器中 取出执行的下一条指令所在存储空间的位置(指向下一条将要执行的指令)。它具有自动加 1 的功能。 3.已知[X]补=1001 1101B,[Y]补=1100 1001B,[Z]补=0010 0110B,计算[X+Y]补=?,并指出是 否溢出;计算[X-Z]补=?,并指出是否溢出。 答案:[X+Y]补=0110 0110 溢出 [X-Z]补=0111 0111 溢出 4.将下列十六进制数的 ASCII 码转换为十进制数。 (1)313035H(2)374341H(3)32303030H(4)38413543H 答案:103H=259 7CAH=1994 2000H=8192 8A5CH=35420 第二章习题答案 一、选择题 1.8086/8088CPU 内部有一个始终指示下条指令偏移地址的部件是_______。 A.SP B.CS C.IP D.BP 答案:C 2.指令队列的作用是_________。 A.暂存操作数地址 B.暂存操作数 C.暂存指令地址 D.暂存预取指令 答案:D 3.8086/8088 下列部件中与地址形成无关的是______。 A.ALU B.通用寄存器 C.指针寄存器 D.段寄存器 答案:A 4.对于 8086,下列说法错误的是_______。 A.段寄存器位于 BIU 中 B.20 位的物理地址是在 EU 部件中形成的 C.复位后 CS 的初值为 FFFFHD.指令队列的长度为 6 个字节 答案:B 5.8086/8088 中 ES、DI 分别属于_______。 A.EU、BIU B.EU、EU C.BIU、BIU D.BIU、EU 答案:D 6.BIU 与 EU 工作方式的正确说法是_______。 A.并行但不同步工作 B.同步工作 C.各自独立工作 D.指令队列满时异步工作,空时同步工作 答案:A 7.在执行转移、调用和返回指令时,指令队列中原有的内容_______。 A.自动清除 B.用软件清除 C.不改变 D.自动清除或用软件清除 答案:A 8.下列说法中,正确的一条是______ A.8086/8088 标志寄存器共有 16 位,每一位都有含义。B.8088/8086 的数据总线都是 16 位。C.8086/8088 的逻辑段不允许段的重叠和交叉 D.8086/8088 的逻辑段空间最大为 64KB,实际应用中可能小于 64KB。 答案:D 9.8086/8088 工作于最大模式,是因为_____。 A.可以扩展存储容量 B.可以扩大 I/O 空间 C.可以构成多处理器系统 D.可以提高 CPU 主频 答案:C 10.8088/8086 最大模式比最小模式在结构上至少应增加_____。 A.中断优先级控制器 B.总线控制器 C.数据驱动器 D.地址锁存器 答案:B 11.组成最大模式下的最小系统,除 CPU、时钟电路,ROM,RAM 及 I/O 接口外,至少需增 加的芯片类型为______。 a.总线控制器 b.总线裁决器 c.地址锁存器 d.总线驱动器 A.b,d B.a,b,c C.a,d D.a,c,d 答案 C 12.工作在最小模式时,对 CPU 而言,下列信号皆为输入信号的是______。 A.HOLD、、READY B.、、READY C.、HOLD、D.、HOLD、READY 答案:A 13.在最小工作模式下,8088/8086CPU 在每个时钟脉冲的______处,对 HOLD 引脚上的信号 进行进行检测。A)上升沿 B)下降沿 C)结束位置 D)中间位置 答案:A 14.LOCK 引脚的功能是____。 A.总线锁定 B.地址锁定 C.数据输入锁定 D.数据输出锁定 答案:A 15.与存储器(或外设)同步以及与协处理器同步的引脚信号依次为_______。 A.READY、B.READY、HOLD C.、RESET D.、答案:A 16.工作在最大模式时,下列信号皆为输出信号的是_______。 A.QS0、QS1、B.QS0、、C.QS1、、S0 D.、QS1、答案:A 17.8086/8088 最大模式时,引脚有效时的正确含义是_____。 A.能中断 CPU 的工作 B.能进行 DMA 操作 C.其它总线部件不能占有总线 D.暂停 CPU 的工作 答案:C 18.工作在最大模式时,经总线控制器 8288 将对应 CPU 最小模式时的三个引脚状态进行组合,产生控制和命令信号,这三个引脚应为________。 答案:C 19.8088/8086 中,关于总线周期叙述不正确的是_______。 A.总线周期通常由连续的 T1~T4 组成 B.在读写操作数时才执行总线周期 C.总线周期允许插入等待状态 D.总线周期允许存在空闲状态 答案:B 20.在 8086 读总线周期中,进入 T3 后发现 READY=0,需要插入等待状态,则在插入等待状 态时其引脚的高地址 A19~A16_______。 A.表示读数据对应的高 4 位的地址 B.表示 CPU 当前工作状态 C.处于高阻状态 D.处于不定状态 答案:B 21.设 8086/8088 工作于最小模式,在存储器读、写周期中,总线 AD15~AD0 上数据开始有 效的时刻(不插入 Tw)分别是______。 A.T2、T2 B.T2、T3 C.T3、T4 D.T3、T2 答案:D 二、填空题 1.8086/8088CPU 在结构上由两个独立的处理单元_______和_______构成,这两个单元可以 _____工作,从而加快了程序的运行速度。 答案:EU BIU 并行 2.8086 是 Intel 系列的 16 位处理器,从功能上,它分为两个部分:即总线接口单元和执行单 元。总线接口单元由_______、_______、_______、_______、_______等寄存器和 20 位地址 加法器和 6 字节指令队列构成。执行单元有 4 个通用寄存器,即______;4 个专用寄存器,即____、_____、_____、______等寄存器和算术逻辑单元组成。 答案:AX、BX、CX、DX SP、BP、DI、SI 3.任何 CPU 都有一个寄存器存放程序运行状态的标志信息,在 8086 中,该寄存器是_____。其中,根据运算结果是否为零,决定程序分支走向的标志位是____。答案:FR ZF 4.8086/8088CPU 中标志寄存器的 3 个控制位是_____、_____、______。 答案:DF IF TF 5.逻辑地址 9B50H:2C00H 对应的物理地址是______。 答案:9E100H 6.在任何一个总线周期的 T1 状态,ALE 输出_____。 答案:高电平 7.8086 有两种工作模式,即最小模式和最大模式,它由______决定。最小模式的特点是 _______,最大模式的特点是________。 答案: CPU 提供全部的控制信号 需要总线控制器 8288 8.8086CPU 可访问的存储器的空间为 1MB,实际上分奇数存储体和偶数存储体两部分,对于 奇数存储体的选择信号是________,对于偶数存储体的选择信号是_______,对于每个存储 体内的存储单元的选择信号是___________。 答案: A0 A19~A1 9.在 8086 的最小系统,当,时,CPU 完成的操作是_______。 答案:I/O 读 10.在最小模式下,执行“OUT DX, AL”指令时,、、、的状态分别是___。 答案:0, 0, 1, 1 11.8086CPU 从偶地址读写两个字节时,需要_____个总线周期,从奇地址读取两个字节时,需要_____个总线周期。 答案:1 2 12.8086 在存取存储器中以偶地址为起始地址的字时,,A0 的状态分别是____。 答案: 1 0 0 13.8086 向内存地址 1200BH 写一个字节数据时,需要一个总线周期,在该总线周期的 T1 状 态,为______,A0 为_____。 答案:0,1 14.假设某个总线周期需插入两个 Tw 等待状态,则该总线周期内对 READY 信号检测的次数 是_______。 答案:3 15.8086CPU 上电复位后,CS=_____,IP=_____,DS=_____,标志寄存器 FR=_____。答案:0FFFFH,0,0,0 16.8088/8086 的复位信号至少要维持______个时钟周期。 答案:4 17.8086CPU 工作在最小模式下,控制数据流方向的信号是____、____、____、____、____。 答案:、、、、18.当存储器的读出时间大于 CPU 所要求的时间时,为了保证 CPU 与存储器的周期配合,就 要利用______信号,使 CPU 插入一个_____状态。 答案:准备好(READY)等待(Tw)状态 19.当 8086/8088 工作于最大模式时,QS1=1,QS0=0,其表示指令队列的状态为______。答案:队列为空。 20.在 T2、T3、Tw、T4 状态时,S6 为_____,表示 8086/8088 当前连在总线上。 答案:低电平 21.8086/8088 提供的能接受外中断请求信号的引脚是_____和_____。两种请求信号的主要不 同处在于是否可______。 答案:INTR NMI 屏蔽 22.一台微机的 CPU,其晶振的主振频率为 8MHz,二分频后作为 CPU 的时钟频率。如果该 CPU 的一个总线周期含有四个时钟周期,那么此总线周期是_____us。 答案:0.125 23.某微处理器的主频为 20MHz,由 2 个时钟周期组成一个机器周期,设平均 3 个机器周期 可完成一条指令,其时钟周期和平均运算速度分别为_____。 答案:50ns,3.33MHz 三、问答题 1.8086/8088CPU 在结构上由哪两个独立的处理单元构成?这样的结构最主要的优点是什 么? 答案:在微机中,一条机器指令由操作数和操作码构成,再由若干指令构成程序。微处理器 执行一条指令的完整步骤需要两个阶段:取指和执行。取指是从内存中取出指令,执行是分 析指令要求实现的功能,读取所需的操作数,执行指令规定的操作。传统的 8 位处理器采用 顺序执行的方式,各条指令的执行按以上两个阶段交替执行。也就是说,首先取一条指令,然后执行该指令,之后再取下一条指令,再执行,如此重复,直到整个程序执行完毕。在 8086 中,为了加快程序的执行速度,采用了重叠执行的方式,各条指令的执行过程是重 叠进行的。每条指令的执行过程也包括取指和执行两个阶段,但是相邻两条指令的执行过程 有一部分是同时进行的。在执行一条指令时,可以同时取出下一条指令。在当前指令执行完 毕后,就可以立即执行下一条指令。显然,这种重叠执行的方式大大加快了程序的执行速度。为了实现指令的重叠执行方式,8086/8088 微处理器内部分为两个独立的功能部件:执行单 元 EU 和总线接口单元 BIU,执行单元 EU 专门负责指令的执行,总线接口单元 BIU 是从内存 指定区域取出指令送到指令队列缓冲器的。和 BIU 两个功能部件并行工作,执行的 BIU EU EU 在前一时刻取出的指令,与此同时,BIU 又取出下一时刻要执行的指令,由此能使大部分取 指令和执行指令的操作重叠进行,大大缩短了等待指令所需的时间,提高了微处理器的利用 率和整个系统的执行速度。 2.完成下列补码运算,并根据结果设置标志 SF、ZF、CF 和 OF,指出运算结果是否溢出。(1)00101101B+10011100B(2)01011101B-10111010B(3)876AH-0F32BH(4)10000000B+11111111B 答案:(1)C9H SF=1 ZF=0 CF=0 OF=0 未溢出(2)01011101B-10111010B =01011101B+01000110B A3H SF=1 ZF=0 CF=1 OF=1 有溢 出 求-Y 的补码,即正数-Y 的真值(3)876AH-0F32BH =876AH+0CD5H 943FH SF=1 ZF=0 CF=1 OF=0 未溢出(4)7FH SF=0 ZF=0 CF=1 OF=1 有溢出 3.存储器采用分段方法进行组织有哪些好处? 答案:8086 微处理器 CPU 中寄存器都是 16 位,16 位的地址只能访问大小为 64KB 以内的内 存。8086 系统的物理地址由 20 根地址线形成,怎样用 16 位数据处理能力实现 20 位地址的 寻址呢?要做到对 20 位地址空间进行访问,就需要两部分地址,在 8086 系统中,就是由段 地址和偏移地址组成的。而这两个地址都是 16 位,将这两个地址采用相加的方式组成 20 位地址去访问存储器。在 8086 系统的地址形成中,当段地址确定后,该段的寻址范围就已经确定,其容量不大于 64KB。同时,通过修改段寄存器的内容,可达到逻辑段在整个 1MB 空间中浮动。各个逻辑 段之间可以紧密相连,可以中间有间隔,也可以相互重叠。采用段基址和偏移地址方式组成物理地址的优点是: 满足对 8086 系统的 1MB 存储空间的访 问,同时在大部分指令中只要提供 16 位的偏移地址即可。4.Intel 8086/8088 处理器芯片功能强大,但引脚数有限,为了建立其与外围丰富的信息联系,Intel8086/8088 处理器引脚采用了复用方式,说明其采用了何种复用方式? 答案:8086CPU 采用双列直插式的封装形式,具有 40 条引脚。由于受到引脚数量的限制,8086 引脚安排采用了复用技术。它的复用方式有两种:一是采用分时复用技术,在不同的 时刻通过相同的引脚传送不同的信息,从而减少了引脚的数量;二是采用了两种工作方式,在不同的工作方式下,部分引脚具有两种不同的引脚功能。 5.8086CPU 是怎样解决地址线和数据线的复用问题的?ALE 信号何时处于有效电平? 答案:为解决引脚少的问题,8086CPU 内部采用一个多路开关,使低 16 位地址线和 16 位数 据线共用引脚。因为当 CPU 访问存储器或外设时,先要给出访问单元的地址,然后才是读 写数据,因此在时间上是可以区分的。在总线周期的第一个时钟周期(T1 状态),输出低 16 位地址(记为 A15~A0),而在总线周期的其他时钟周期内传送数据。当 CPU 处于“保持响 应”状态时,这些引脚处于高阻隔离状态(即悬浮状态)。ALE 信号是地址锁存信号。8086 在总线周期开始通过地址总线输出地址的同时,通过该引脚 输出一个正脉冲,其下降沿用于将地址信息写入外部的地址锁存器中。在任何一个总线周期 的第一个时钟周期时,ALE 输出有效电平以表示在当前地址/数据复用总线上输出的是地址 信息,ALE 作为锁存信号,对地址进行锁存。ALE 端不能被浮空。 6.8086/8088 系统用的时钟发生器会产生哪些信号? 答案:8284A 是一个专用的时钟发生器,产生 4.77MHz 的标准时钟信号 CLK。此时钟信号作 为系统时钟,并经 CLK 引脚直接送到 8086,作为微处理器的时钟信号。同时 8284A 还对复 位和就绪信号实现内部的时钟同步,然后再输出,实施对 8086 的控制。所以,8086/8088 系统用的时钟发生器产生恒定的时钟信号 CLK,复位信号 RESET,准备就绪信号 READY。 7.说明 8086CPU 的 READY 输入信号和 信号的作用是什么? 答案: READY 输入信号实际上是由访问的存储器或外设发出的响应信号,高电平有效。READY 信号有效时,表示内存或外设准备就绪,马上就可以进行一次数据传输。CPU 在每个总线周 期的 T3 状态开始对 READY 信号开始进行采样。如果检测到 READY 信号为低电平,则在 T3 状态后插入等待状态 Tw,在 Tw 状态 CPU 也对 READY 信号进行采用,若 READY 信号仍为低 电平,则会继续插入等待状态 Tw,所以 Tw 状态可以插入一个或多个,直到 READY 变为高 电平,才进入 T4 状态,完成数据传输过程,从而结束当前总线周期。测试信号,低电平有效,信号是和指令 WAIT 结合起来使用的,CPU 执行 WAIT 指令时,在 CPU 处于等待状态,当 信号低电平时,等待状态结束,CPU 继续往下执行被暂停的指令。 第三章习题 一、选择题 1.寻址方式指出了操作数的位置,一般来说_______。 A.立即寻址给出了操作数的地址 B.寄存器直接寻址的操作数在寄存器内,而指令给出了存储器 C.直接寻址直接给出了操作数本身 D.寄存器直接寻址的操作数包含在寄存器内,由指令指定寄存器的名称 答案:D 2.寄存器寻址方式中,操作数在_________。A.通用寄存器 答案:A 3.寄存器间接寻址方式中,操作数在_________。 A.通用寄存器 答案:C 4.下列指令中的非法指令是______。 A.MOV [SI+BX], AX C.MOV [0260H], 2346H 答案:B 5.设(SP)=0100H,(SS)=2000H,执行 PUSH BP 指令后,栈顶的物理地址是_____。A.200FEH 答案:A 6.指令 LEA BX, TAB 执行后,其结果是______。A.将 TAB 中内容送 BX C.将 TAB 的偏移地址送 BX 答案:C 7.下列正确的指令格式有______。A.MOV [BX], 1 答案:D 8.设(AX)=C544H,在执行指令 ADD AH,AL 之后,______。A.CF=0,OF=0 答案:C 9.若 AL、BL 中是压缩 BCD 数,且在执行 ADD AL, BL 之后,(AL)=0CH,CF=1,AF=0。再执行 DAA 后,(AL)=_____。A.02H 答案:B 10.执行下列程序后 AL 的内容为_____。MOV AL, 25H SUB AL, 71H DAS A.B4H B.43H C.54H D.67H B.12H C.62H D.72H B.CF=0,OF=1 C.CF=1,OF=0 D,CF=1,OF=1 B.MOV AL, 0345H C.MOV ES: PTR[CX], 3 D.XLAT B.将 TAB 的段基址送 BX D.将 TAB 所指单元的存储内容送 BX B.0102H C.20102H D.00FEH B.MOV CL, 280 D.MOV BX, [BX] B.堆栈 C.内存单元 D.段寄存器 B.堆栈 C.内存单元 D.段寄存器 答案:C 11.下列四条指令中,需要使用 DX 寄存器的指令是______。 A.MUL BX 答案:C 12.设(AL)=0E0H,(CX)=3,执行 RCL AL, CL 指令后,CF 的内容_______。A.0 答案:B 13.下列四条指令中,错误的是______。A.SHL AL, CX 答案: A 14.串操作指令中,有 REP 前缀的串操作指令结束的条件是________。A.ZF=1 答案:D 15.对于下列程序段: AGAIN: MOV AL, [SI] MOV ES:[DI], AL INC INC SI DI B.ZF=0 C.CX>0 D.CX=0 B.XCHG AL, BL C.MOV BX, [SI] D.AND AX, BX B.1 C.不变 D.变反 B.DIV BL C.IN AX, 20H D.OUT 20H, AL LOOP AGAIN 也可用指令_______完成同样的功能。A.REP MOVSB 答案:A 16.JMP WORD PTR [DI] 是________指令。A.段内间接转移 答案:A 17.条件转移指令 JNE 的转移条件是_______。A.ZF=1 答案:C 18.下列指令中,影响标志位的指令是_____。 A.从存储器取数指令 答案:D 19.假设外部设备的状态字已经读入 AL 寄存器,其中最低位为 0,表示外部设备忙。为了判 断外部设备是否忙而又不破坏其它状态位,应选用下列哪一组指令? A.C.RCR JZ AND JZ 答案:D 20.假定一组相邻字节的首地址在 BX 中,末地址在 DI 中,为了使下面的程序段能用来查找 出其中第一个非零字节,并把它存放在 AL 中,在横线处应填入的指令是什么? SUB INC DI, BX DI AL, 01H Label AL, 01H Label D.B.CMP JZ TEST JZ AL, 00H Label AL, 01H Label B.条件转移指令 C.压栈指令 D.循环移位指令 B.CF=0 C.ZF=0 D.CF=1 B.段内直接转移 C.段间间接转移 D.段间直接转移 B.REP LODSB C.REP STOSB D.REPE SCASB MOV NEXT: CMP LOOP MOV 答案:C CX, DI INC BX BYTE PTR [BX], 0 NEXT AL, BYTE PTR [BX] B.SUB BX, BX C.DEC BX D.INC BX _________ A.MOV SI, CX 二、填空题 1.指令 MOV [BX+SI], AL 中的目的操作数使用______段寄存器,属于______寻址方式。答案:数据段 基址加变址 2.8086 微机中,_______寄存器存放的是当前堆栈区的基地址。堆栈区的存取原则为_____,在 8086/8088 系统中,栈区最大容量为_____。若(CS)=2000H,(DS)=2500H,(SS)=3000H,(ES)=3500H,(SP)=0100H,(AX)=2FA6H,则这个栈区的物理地址的范围为________,CPU 执行 PUSH AX 指令后,栈顶地址为_____,该栈顶单元存放的内容为_______。 答案:SS 先进后出 64KB PUSH BX POPF 指令执行完毕后,(SF, ZF, CF, OF)=______。答案:7531H,1,1,0,0 4.假设(DS)=1000H,(ES)=0200H,(BP)=0100H,(DI)=0200H,(10200H)=11H,(10201H)=12H,执行指令 LEA DX, [BP][DI]后,(DX)=_______。 答案: 0300H 5.假定(DS)=4000H,(DI)=0100H,(40100H)=55H,(40101H)=AAH, 执行指令 LEA BX, [DI] 后,BX 中的内容是_______。 答案:0100H 6.如果 TABLE 为数据段 3400H 单元的符号名,其中存放的内容为 0505H,当执行指令 MOV AX, TABLE 后,(AX)=_______;而执行指令 LEA AX, TABLE 后,AX=______。答案:0505H,3400H 7.若(DS)=3000H,(SI)=2000H,(DI)=1000H,(AX)=2500H,(34000H)=00H,(34001H)=34H,(34002H)=00H,(34003H)=50H,变量 AREA 的值为 3000H,执行指令 LDS SI, AREA[DI]后,SI 的内容是_______,DS 的内容是_______。 答案:3400H,5000H 8.已知(AL)=2EH,(BL)=6CH,执行 ADD AL, BL 之后,(AL)=_____,(BL)=______,ZF=_____,AF=______,OF=_______,PF=_____,CF=______。答案:9AH 6CH 0,1,1,1,0 9.CPU 对两个无符号 8 位二进制数进行加法运算后,结果为 0EH,且标志位 CF=1,OF=1,SF=0,其结果应为十进制数______。 答案:270 10.8086CPU 执行 SUB AH, AL 后结果为(AH)=85H,OF=1,CF=1。若 AH、AL 中为带符号 30000H~300FFH 300FEH A6H 3.若(BX)=42DAH,则下列指令段数,则指令执行前_______寄存器中的数大。 答案:AH 11.若(AX)=7531H,(BX)=42DAH,则 CMP AX, BX 指令执行后,(AX)=_____,(SF, ZF, CF, OF)=_______。 答案:42DAH 1,0,0,0 12.设(AL)=1010 0000B,则执行 NEG AL 后,(AL)=________;设(AL)=1000 0000B,则执行 NEG AL 后,(AL)=________。 答案:60H 80H 13.假定(AX)=96H,(BX)=65H, 依次执行 ADD AX, BX 指令和 DAA 指令后,(AL)=___。答案:61H 14.执行下列指令序列后,(AH)=____,(AL)=_____,CF=____,AF=____。MOV AX, 0106H MOV BL, 08H SUB AL, BL AAS 答案:(AL)=08H,(AH)=0,CF=AF=1 15.设(AL)=98H,(BL)=12H,(AX)=_______(OF)=_______(CF)=_______ 而执行指令 IMUL BL 后,(AX)=_______(OF)=_______(CF)=_______ 答案:0AB0H 0F8B0H MUL AAM 答案:02H 17.CBW 指令是将_____的符号扩展到_____中,如果(AL)=0A4H,则执行 CBW 指令后,(AX)=______。 答案:AL XOR DEC MOV XCHG NEG AH 0FFA4H 18.执行下列程序段后,给出指定寄存器的内容。AX, AX AX BX, 6378H AX, BX BX BL 1 1 1.1 若执行指令 MUL BL 后,16.已知(AL)=6,(BL)=7, 执行下述指令后,(AL)=______ AX 和 BX 寄存器的内容为_______。答案:6378H 和 0001H 19.执行下列指令后: MOV MOV ROL DEC MOV MUL HLT AX, 1234H CL, 4 AX, CL AX CX, 4 CX 寄存器 AH 的值是______,AL 的值是 _____。 答案:8DH 00H 20.假设(DX)=10111001B,(CL)=03H,CF=1,执行 SHL DL, CL 后,(DX)=_____。答案:10111001000B 21.下列指令段执行完毕后,(SI)=_______,(DI)=______。STD MOV AX, 2500H MOV DS, AX MOV BX, 3500H MOV ES, AX MOV SI, 1500H MOV DI, 0400H MOV CX, 3 REP MOVSB 答案:14FDH 22.假设 ES 段中有一个字符串‟12FG3LM5C‟,其名为 ARRAY。下面的程序段执行后 CX的值是______。REPNE SCASB 24.已知(SS)=3000H,(SP)=0100H,执行下列程序后,(SP)=_______。 答案:5 23.假设(DS)=2000H,(BX)=1256H,(SI)=528FH,位移量 TABLE=20A1H,(232F7H)=80H,(232F8H)=32H,(264E5H)=50H,(264E6H)=24H: 执行指令 执行指令 执行指令 答案:1256H 3280H 2450H 24.答案:00FEH 25.已知(IP)=1000H,(SP)=2000H,(BX)=283FH, 指令 CALL WORD PTR [BX] 的机器代码是 FF17H, 试问执行该指令后,内存单元 1FFEH 中的内容是______。 答案:02H 三、问答题 1.设 DS=1000H,ES=3000H,SS=4000H,SI=00A0H,BX=0700H,BP=0070H,执行指令为 MOV AX, [BX+5]。(1)指令使用的是何种寻址方式?(2)源数据的逻辑地址和物理地址分别是多少?(3)若源数据为 1234H,则执行指令后上述各寄存器的内容是什么? 答案:基址寻址,基址寄存器是 BX,源操作数在数据段中,源操作数的逻辑地址是: EA=BX+5=0700H+5=0705H 源操作数的物理地址是:10705H 若源数据为 1234H,则执行指令后,AX 中的内容就为 1234H,其余寄存器的内容不变。 2.分别说明下列指令的源操作数和目的操作数各采用什么寻址方式,并写出指令中存储器操 作数的物理地址的计算公式。(1)MOV AX, 2408H(2)MOV BX, [SI](3)MOV [BP+100H],AX(4)MOV [BX+DI], '$'(5)MOV DX, ES:[BX+SI] 答案:(1)立即寻址,(AX)=2408H(2)寄存器寻址,物理地址:10H×(DS)+EA=10H×(DS)+(SI)(3)寄存器寻址,物理地址:10H×(SS)+(BP)+0100H(4)基址加变址寻址,物理地址:10H×(DS)+(BX)+(DI)(5)基址加变址,带有段超越前缀,物理地址:10H×(ES)+(BX)+(SI)3.写出能完成下述操作的指令。 (1)将立即数 1234H 送至 DS 寄存器。 (2)将存储单元 3000H 和内容送至 4000H 单元。 (3)将累加器 AX 与寄存器 CX 中的内容对调。 答案:(1)MOV AX, 1234H MOV DS, AX(2)MOV AX, [3000H] MOV [4000H], AX(3)XCHG AX, CX 4.编程:将数据段中以 BX 为偏移地址的连续 4 单元的内容颠倒过来。 答案: MOV AL, [BX] XCHG AL, [BX+3] MOV [BX], AL MOV AL,[BX+1] XCHG AL, [BX+2] MOV [BX+1], AL 5.已知(DS)=091DH,(SS)=(1E4AH),(AX)=1224H,(BX)=0024H,(CX)=5678H,(BP)=0024H,(SI)=0012H,(DI)=0032H,(09214H)=085BH,(09226H)=00F6H,(09228H)=1E40H,(1E4F6H)=091DH。试问下列指令或指令段执行后结果如何?(1)MOV CL, [BX+20H](2)MOV [BP][DI], CX(3)LEA BX, [BX+20H][SI] MOV AX, [BX+2](4)LDS SI, [BX][DI] MOV BX,[SI](5)XCHG CX, [BX+32H] XCHG [BX+20H][SI], AX 答案:(1)CL=5BH(2)(1E4F6H)=5678H(3)(AX)=1E40H(4)(BX)=091DH (5)(AX)=5678H,(09226H)=1224H 6.十六进制 0~9,A~F 对应的 ASCII 码为 30H~39H,41H~46H,依次放在内存以 TABLE 开始的区域,将 AL 中某一位十六进制数×H 转换为对应的 ASCII 码,请编写程序段。 答案: LEA BX, TABLE MOV AL, ××H XLAT 7.将 AX 寄存器清零有 4 种方法,试写出这 4 条指令。 答案:MOV AX, 00H SUB AX, AX AND AX, 00H XOR AX, AX 8.使用一条逻辑运算指令实现下列要求:(1)使 AL 高 4 位不变,低 4 位为 0。(2)使 AL 最高位置 1,后 7 位不变。(3)使 AL 中的 bit3、bit4 变反,其余位不变。(4)测试判断 CL 中的 bit2、bit5、bit7 是否都为 1。 答案:(1)AND AL, 0F0H(2)OR AL, 80H(3)XOR AL 18H(4)TEST AL, 0A4H 9.试分析下面的程序段完成什么功能。 MOV CL, 4 SHL AX, CL SHL BL, CL MOV AL, BL SHR DH, CL OR AL, DH 答案:将 AX 中间 8 位,BX 的低 4 位,DX 的高 4 位组成一个新字存放在 AX 中。 10.若要将源串 100 个字节数据传送到目标串单元中去,设源串首址的偏移地址为 2500H,目标串首址的偏移地址为 1400H,请编写程序实现以下功能。(1)完成源串到目标串的搬移。(2)比较两串是否完全相同,若两串相同,则 BX 寄存器内容为 0;若两串不同,则 BX 指向 源串中第一个不相同字节的地址,且该字节的内容保留在 AL 的寄存器中。 答案:(1)CLD MOV CX, 100 MOV SI, 2500H MOV DI, 1400H REP MOVSB(2)CLD MOV CX, 100 MOV SI, 2500 MOV DI, 1400 REPE CMPSB JZ EQQ DEC SI MOV BX, SI MOV AL, [SI] JMP STOP EQQ: MOV BX, 0 STOP: HLT 11.下列指令段的功能是: 从内存 2000H:0A00H 开始的 2KB 内存单元清零。请在下列空格中 填入合适的指令,程序指令完成后 DI 的内容是多少。CLD MOV AX, 2000H _________ _________ XOR AL, AL _________ _________ HLT 答案:MOV ES,AX MOV DI, 0A00H XOR AL,AL MOV CX, 800H REP STOSB HLT 第四章习题答案 一、选择题 1.下列描述正确的是_______。 A.汇编语言源程序可直接运行 B.汇编语言属于低级语言 C.汇编程序是用汇编语言编写的程序,运行速度高,阅读方便,属于面向用户的程序语言。D.汇编语言可以移植 答案:B 2.分析下面的程序,变量 VAR2 的偏移地址是______。DATA SEGMENT ORG 2 VAR1 DB 2,3,4 ORG $+3 VAR2 DW 1234H DATA ENDS A.02H B.04H C.05H D.08H 答案:D 3.为了使 MOV AX, VAR 指令执行后,寄存器中的内容为 4142H,AX 下面哪一种数据定义会产 生不正确的结果? A.VAR DW 4142H B.VAR DW 16706 C.VAR DB 42H, 41H D.VAR DW ‘AB’ 答案:C 4.下列伪指令中______是正确的。 A.ERR1:DW 99 B.ERR2 DB 25*60 C.COUNT EQU 20 D.ONE DB ONE 答案:C 5.执行下列指令后,寄存器 CL 的值是_______。STR1DW „AB‟ STR2DB 16 DUP(?)CNT EQU $-STR1 MOV CX, CNT MOV AX, STR1 HLT A.10H B.12H C.0EH D.0FH 答案:B 二、填空题 1.汇编语言的调试过程如下:建立以______为扩展名的源文件;生成以______为扩展名的目 标文件;生成以______为扩展名的可执行文件;使用 DEBUG 调试程序,调试可执行目标程 序。 答案:.asm.obj.exe 2.执行下列指令后,(AX)=______,(BL)=_______。A DW „EF‟ B DB „ABCDEF‟ MOV AX, A MOV BL, B[3] HLT 答案:4546H 44H 3.执行下面程序段后,AL 中的内容是______。BUF DW 1234H, 5678H, 0001H MOV BX, OFFSET BUF MOV AL, 2 XLAT 答案:78H 4.若符号定义语句如下,则 L=_______。BUF1 DB 1, 2, „12‟ BUF2 DB 0 L EQU BUF2-BUF1 答案:4 5.执行下列程序段后,BX 寄存器间址单元的内容是______。ORG 1FFFH DB 4FH, 50H, 51H MOV BX, 1FFFH INC [BX] INC BX DEC [BX] 答案:4FH 6.对于下面的数据定义,各条 MOV 指令单独执行后,请填充有关寄存器的内容: TABLE1 DB ? TABLE2 DW 20 DUP(?)TABLE3 DB „ABCD‟......MOV AX, TYPE TABLE1;(AX)=___ MOV BX, TYPETABLE2;(BX)=____ MOV CX, LENGTH TABLE2;(CX)=_____ MOV DX, SIZE TABLE2;(DX)=_____ MOV SI, LENGTH TABLE3;(SI)=_______ 答案:1 2 20 40 1 7.下面是多字节加法程序,第一个数是 8A0BH,第二个数是 D705H。请填写出正确结果。DATA SEGNEBT FIRST DB _____, _____, 0H SECOND DB _____,______ DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV CX, _____ MOV SI, 0 _________ NEXT: MOV AL, SECOND[SI] ADC FIRST[SI], AL INC SI LOOP NEXT MOV AL, 0 ADC AL, ______ MOV FIRST[SI], AL MOV AH, 4CH INT 21H CODE ENDS END START 答案:0BH 8AH 05H D7H 2 CLC 0 8.下面程序的功能是求有符号数中绝对值最小的数,并将最小绝对值存放在 DAT2 字节中,填空使程序正确实现此功能。程序执行后,DAT2 单元中的内容是______。DATA SEGMENT DAT1 DB 65H, 88H, 20H, 0F6H N EQU $-DAT1 DAT2 DB ? DATA ENDS CODE SEGMENT _________________ START: MOV AX, DATA __________ LEA SI, DAT1 MOV CX, N-1 MOV AL, [SI] TEST AL, 80H JZ LP0 NEG AL LP0: MOV DAT2, AL LP1: _________ MOV BL, [SI] TEST BL, 80H JZ LP2 NEG BL LP2: ________ JB LP3 MOV DAT2, BL MOV AL, BL LP3: ________ MOV AH, 4CH INT 21H CODE ENDS END START 答案: ASSUME DS:DATA, SS:STACK, CS:CODE MOV DS, AX INC SI CMP DAT2, BL LOOP LP1 DAT2 单元中的内容:0AH 9.填空说明在下列程序段执行过程中相应寄存器中的值。假设程序执行前 DS=3000H,SS=2000H,SP=3000H,AX=4567H,BX=1234H,CX=6789H。AND BX, 00FFH CALL MYSUB NOP;SP=________;AX=_______;BX=_______ PROC PUSH AX PUSH BX PUSH CX SUB AX, BX;SP=______ POP CX POP AX POP BX NOP;SP=______ RET MYSUB ENDP 答案:3000H 0034H 4567H 2FF8H 2FFEH 10.完善程序。BUFFER 单元开始放置一个数据块,BUFFER 单元存放预计数据块的长度为 20H,BUFFER+1 单元存放的是实际从键盘输入的字符串的长度,BUFFER+2 开始存放的是从键盘 从 接收的字符,请将这些从键盘接收的字符再在屏幕上显示出来。MOV DX, OFFSET BUFFER MOV AH, _______ INT 21H;读入字符串 LEA DX, ______ MOV AL, ______;实际读入的字符串的字符个数 MOV AH, 0 ADD BX, AX MOV AL, ____ MOV [BX+1], AL MOV AH, _____ INC DX;确定显示字符串的首址 INT 21H MOV AH, _____;系统返回 DOS INT 21H 答案:0AH BUFFER+1 [BX] '$'或 24H 9 4CH 三、问答题 1.变量和标号有哪些属性?它们的区别是什么? 答案:变量、标号还有常量是汇编语言中使用的操作数,是 3 种基本的数据项。变量和标号 都有段属性、偏移属性和类型属性 3 种属性,但含义不同。变量通常指存放在存储单元中的值,在程序的运行中是可以修改的。所有的变量都具有 3 个属性。(1)段属性:指变量所在段的段基址,此值必须在一个段寄存器中。(2)偏移属性:指变量所在地址与所在段的段首地址之间的地址偏移字节数。(3)类型属性:指变量中每个元素所包含的字节数。标号是可执行指令语句的地址的符号表示,它可作为转移指令和调用指令 CALL 的目标操作 HLT MYSUB 数,以确定程序转向的目标地址,它也具有 3 个属性:(1)段属性:指标号所在段的段基址。标号的段是它所出现的那个代码段,由 CS 指示。(2)偏移属性:指标号所在地址与所在段的段首地址之间的地址偏移字节数。(3)类型属性:标号的类型属性指在转移指令中标号可转移的距离,也称距离属性。NEAR 和 FAR 2.指出下列伪指令语句中的错误:(1)DATA DB 395(2)PRGM SEG …… PRGM ENDS(3)ALPHA EQU BETA(4)COUNT EQU 100 COUNT EQU 65(5)GOON DW 10DUP(?)…… JMP GOON 答案:(1)字节变量,范围在 0~255(2)定义段的伪指令为 SEGMENT(3)BETA 必须先定义(4)EQU 不能重复定义,在下一次定义前必须用 PURGE 撤消(5)转移指令必须转移到指令上,不允许转移到数据变量上。 3.一数据段如下: DATA SEGMENT PARA 'DATA' AT 46H QA EQU 255 QA1=QA GT 3000 QA2=0FFFH QA3 EQU QA2 XOR 255 QA4=88 MOD 5 QA5=88H SHR 2 QA6 EQU QA3/16+15 ORG 1060H G1 DB 32, QA, 98/2, NOT 25 G2 DW 0FF6H, OFFSET G2 G3 DW 3DUP(5)G4 DW SEG G1 SA EQU LENGTH G3 SB EQU SIZE G3 SC=TYPE G3 ORG 1200H F1 EQU THIS WORD F2 DB 11H, 22H, 33H, 44H FF DD 12345H DATA ENDS (1)写出每个符号所对应的值(2)画出内存分配图(3)执行下列指令后,对应的寄存器的值为多少 MOV AX, WORE PTR FF AND AX, 0FFH MOV BX, WORD PTR G1 MOV BX, 255 AND 0FH ADD AX, OFFSET F2 MOV BX, F1 答案:(1)DATA SEGMENT PARA 'DATA' AT 46H QA EQU 255;QA=255 QA1=QA GT 3000;255 大于 3000,命题假,QA1=0 QA2=0FFFH;QA2=0FFFH QA3 EQU QA2 XOR 255;QA3=0FFFH⊕0FFH=0F00H QA4=88 MOD 5;QA4=3 QA5=88H SHR 2;QA5=22H QA6 EQU QA3/16+15;QA6=10FH ORG 1060H G1 DB 32, QA, 98/2, NOT 25 G2 DW 0FF6H, OFFSET G2 G3 DW 3DUP(5)G4 DW SEG G1 SA EQU LENGTH G3;SA=3 SB EQU SIZE G3;SB=3×2=6 SC=TYPE G3;SC=2 ORG 1200H F1 EQU THIS WORD;F1 的偏移地址为 1200H,类型为字 F2 DB 11H, 22H, 33H, 44H FF DD 12345H DATA ENDS(2)内存分配: DS:1060HG1 20H FFH 31H E6H DS:1064HG2 F6H 0FH 64H 10H DS:1068HG3 05H 00H 05H 00H 05H 00H DS:106EHG4 46H 00H …… …… DS:1200HF2 11H 22H 33H 44H DS:1204HFF 45H 23H 01H 00H(3)存储器的值: MOV AX, WORE PTR FF;AX=2345H AND AX, 0FFH;AX=0045H MOV BX, WORD PTR G1;BX=0FF20H MOV BX, 255 AND 0FH;BX=000FH ADD AX, OFFSET F2;AX=1245H MOV BX, F1;BX=2211H 4.以下程序的执行结果是_______。A DB „1234‟ B DW 5 DUP(2,3 DUP(0))C DW „AB‟,‟C‟,‟D‟ L1: MOV AL, TYPE B MOV BL, LENGTH B MOV AH, SIZE A MOV BH, SIZE C MOV CL, TYPEL1 MOV CH, SIZE B 答案:AX=0102H, BX=0205H CX=0AFFH 5.有下列数据段,写出数据段中 MAX、VAL1、VAL2、LEND 符号所对应的值。DATA SEGMENT MAX EQU 0FFFH VAL1 EQU MAX MOD 10H VAL2 EQU VAL1*2 BUFF DB 1,2,3,'123' EBUFF DB ? LEND EQU EBUFF-BUFF DATA ENDS 答案: MAX=0FFFH VAL1=000FH VAL2=001EH LEND 6 6.现有程序如下: DATA SEGMENT A DB 23 B DB 0F0H C DB 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV AL, A CMP AL, B JZ L JG M MOV C,-1 JMP EXIT L: MOV C, 0 JMP EXIT M: MOV C, 1 EXIT: MOV AH, 4CH INT 21H CODE ENDS END START 请回答:(1)该程序完成什么功能?(2)程序运行完后,C 中的内容是什么? 答案:判断两个有符号数,若 A=B,则 C=0;若 A>B,则 C=1;若 A (1)程序执行后,RESULT 单元的内容为多少? (2)程序完成的功能是什么? (3)该程序所占的数据区为多少个字节? DATA SEGMENT FEN DB 85,-90, 64,-120, 95, 77, 88, 120, 60, 83 COUNT EQU $-FEN RESULT DB ? DATA ENDS STACK SEGMENT PARA STACK DB 100 DUP(?)STACK ENDS CODE SEGMENT ASSUME CS:CODE, DATA:DATA, SS:STACK START: MOV AX,DATA MOV DS, AX MOV SI, OFFSET FEN MOV CX, COUNT DEC CX MOV AL, [SI] MOV RESULT ,AL TEST AL, 80H JZ LOP NEG AL LOP: INC SI MOV BL, [SI] TEST BL, 80H JZ NEXT NEG BL NEXT: CMP AL, BL JAE NEXT1 MOV AL, BL MOV BL, [SI] MOV RESULT , BL NEXT1: LOOP LOP CODE NOP MOV AH, 4CH INT 21H ENDS END START 答案:(1)-120(2)将绝对值最大的数放入 RESULT 单元中 (3)11 字节 9.定理:从 1 开始的连续 n 个奇数之和等于 n2,如 1+3+5=32=9。设:在数据区有字节变量 N(0≤N≤255)。试按此定理编写程序求 N2 并将结果存放于字变量 RESULT 中。答案: STACK SEGMENT PARA STACK DW 100 DUP(?)STACK ENDS DATA SEGMENT N DB 5 RESULT DW ? DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS:DATA, SS:STACK START: MOV AX, DATA MOV DS, AX MOV AH, 0 MOV AL, N MOV CX, AX MOV BX, 0 MOV DX, 1 LOOP1: ADD BX, DX ADD DX, 2 LOOP LOOP1 MOV RESULT, BX MOV AH, 4CH INT 21H CODE ENDS END START 第六章习题 一、选择题 1.I/O 单独编址方式下,从端口读入数据可使用_____。 A.MOV B.OUT C.IN D.XCHG 答案:C 2.可用作简单输入接口电路的是______。 A.译码器 B.锁存器 C.方向器 D.三态缓冲器 答案:D 3.CPU 与 I/O 设备之间传送的信号有______。 A.控制信息 B.状态信息 C.数据信息 D.以上三种都有 答案:D 4.从硬件角度而言,采用硬件最少的数据传送方式是______。 A.DMA 控制 B.无条件传送 C.查询传送 D.中断传送 答案:B 5.从输入设备向内存输入数据时,若数据不需经过 CPU,其 I/O 数据传送方式是____。 A.程序查询方式 B.中断方式 C.DMA 方式 D.直接传送方式 答案:C 6.主机与外设信息传送的方式分别为查询方式、中断方式、DMA 方式。相比之下,中断方 式的主要优点是_______。 A.接口电路简单、经济,只需少量的硬件 B.数据传输的速度最快 C.CPU 的时间利用率高 D.能实时响应 I/O 设备的设备的输入输出请求 答案:D 7.在微机系统中,为了提高 CPU 系统数据总线的驱动能力,可采用_____。 A.译码器 B.多路转换器 C.双向三态缓冲器 D.采样保持器 答案:C 8.执行“IN AL, DX”指令后,进入 AL 寄存器的数据来自_____。 A.立即数 B.存储器 C.寄存器 D.外设端口 答案:D 二、问答题 1.CPU 与外设进行数据传送时,为什么需要 I/O 接口电路?I/O 接口电路的功能有哪些? 答案:CPU 与外部设备进行信息交换,是在控制信号的作用下通过数据总线来完成的。外部 设备的种类不同,对信息传送的要求也不同,这就给计算机和外设之间的信息交换带来以下 一些问题:(1)速度不匹配:CPU 速度高,外设的速度低。不同的外设速度差异大,如硬盘速度高,每秒能传送兆位数量级,串行打印机每秒钟只能打印百位字符,而键盘的速度则更慢。(2)信号不匹配:CPU 的信号为数字信号,数据采集输入的是模拟信号,需要对外部信号 进行模/数转换,才能被计算机处理;同样,计算机输出的是数字信号,需要输出模拟信号 时,必须要通过数/模转换。(3)信号格式不匹配:计算机接收和处理的是并行数据,而有些外部设备的信号为串行数 据,这就需要使用接口电路进行串行数据和并行数据转换。(4)另外为了提高 CPU 的传输效率,需要利用接口电路对外设进行控制。作为连接 CPU 和外设的接口电路,它具有以下功能:(1)数据的寄存和缓冲功能 为了解决 CPU 和外部设备速度不匹配的问题,接口电路内部设置有数据寄存器或具有 RAM 功能的数据缓冲区,使之成为 CPU 和外设进行数据交换的中转站。无论输入还是输出数据,传输的数据首先进入缓冲区,输入数据时等待 CPU 发出接收指令,输出数据时等待外设发 出的输出信号。(2)信号转换功能为了解决 CPU 和外设之间信号电平不一致的问题,可以通过设置电平转换接口电路来解决,如采用 MAX232 等芯片实现电平转换。为了解决 CPU 和外设之间串并行数据不匹配的问题,CPU 输出数据时,设置并变串接口电 路;CPU 输入数据时,设置串变并接口电路。为了解决外设模拟量传输的问题,设置模/数转换(A/D)电路或数/模转换(D/A)电路。(3)端口选择功能 CPU 通过接口电路对外部设备进行控制,具体和哪一个外设进行数据交换,首先要选通相应 的接口电路,而这一过程是通过地址选通来实现的,即接口电路有其独有的地址空间。不同 的接口电路占用的地址是不同的,占有的地址个数也是不同的。有的占有两个地址,有的占 有 4 个地址等,以对应不同的外设。一般来说,接口电路的片选信号由高位地址信号来产生,接口电路内部的选择由低位地址来决定。CPU 的地址信号是一组单向的信号线,它们总是由 CPU 发出,因此 CPU 发出不同的地址信号就选择了相应的接口电路,也就选通了相应的外 部设备。(4)接收和执行 CPU 的指令 CPU 的地址信号发出后,被选通的接口电路,根据 CPU 的读、写等指令输入输出数据信号 或输出控制信号。(5)中断管理功能 为了提高 CPU 的效率,使得外设工作时,不影响 CPU 的执行,需要利用中断控制芯片来连 接多个外设。只有当外设需要 CPU 进行处理,才会通过中断控制器,给 CPU 发送中断请求 信号,CPU 接到该信号后,在满足相应中断允许的条件下,停止执行当前程序,转而去执行 中断服务程序,即处理外设事物。在这里接口电路就是中断控制器,用来管理这些需要 CPU 中断的外部设备。 2.计算机对 I/O 接口电路的编址有哪些方法?8086/8088 CPU 采用哪种编址方法? 答案:当接口电路的地址和存储单元的地址相同时,称为独立编址,也称 I/O 映射方式;当 接口电路的地址和存储单元的地址不同时,称为统一编址,也称存储器映射方式。独立编址 3.CPU 与外设间进行数据传送有哪几种方式?简述各种方式的工作原理。 答案:无条件传送方式是最简单的传送方式,该方式应用于始终处于准备好状态的外设,即 CPU 输入或输出数据时不需要查询外设的工作状态,任何时候都可以输入输出。查询传送方式在传送数据前,CPU 需要查询当前外设的状态,当查询到当前外设准备好,即 处于空闲状态时,CPU 就可以通过数据线和外设进行输入输出的操作; 当查询到外设当前的 状态为忙时,则等待,并继续查询,直到外设准备好,再传送数据。 4.假设一接口电路的地址信号为 A0,片选端为,占用两个地址,分别是 20H 和 21H,试 利用 74LS138 译码器设计译码电路,并画出硬件电路设计图。片选地址 片内地址 接口电路地址 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 0 0 0 0 1 0 0 0 0 0 20H 1 21H 5.若要求 74LS138 输出的译码地址为 0200H~0207H,0208H~020FH,……,0238H~023FH 等 8 组,可用于选通 8 个 I/O 芯片,试画出 74LS138 与 8086 最小系统连接图。片外地址 内部地址 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 第1片 1 第2片 1 第3片 1 第4片 1 第5片 1 第6片 1 第7片 1 第8片 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 200H 207H 0 208H 20FH 0 210H 217H 0 218H 21FH 0 220H 227H 0 228H 22FH 0 230H 237H 0 238H 23FH 第七章习题 一、选择题 1.在程序控制传送方式中,_______可提高系统的工作效率。A.无条件传送 B.查询传送 C.中断传送 D.以上均可 答案:C 2.在 8086 的中断中,只有______需要硬件提供中断类型码。 A.外部中断 B.可屏蔽中断 C.不可屏蔽中断 D.内部中断 答案:B 3.在中断响应周期,CPU 从数据总线上获取______。 A.中断向量的偏移地址 B.中断向量 C.中断向量的段地址 D.中断类型码 答案:D 4.执行 INT n 指令或响应中断时,CPU 保护现场的次序是______。 A.FLAGS 寄存器(FR)先入栈,其次是 CS,最后是 IP B.CS 在先,其次是 IP,最后 FR 入栈 C.FR 在先,其后一次是 IP,CS D.IP 在先,其次是 CS,最后 FR 答案:A 5.在 PC/XT 中,NMI 中断的中断向量在中断向量表中的位置_______。 A.是由程序指定的 B.是由 DOS 自动分配的 C.固定在 0008H 开始的 4 个字节中 D.固定在中断向量表的表首 答案:C 6.中断调用时,功能调用号码应该_______。 A.写在中断指令中 B.在执行中断指令前赋给 AH C.在执行中断指令前赋给 AX D.在执行中断指令前赋给 DL 答案:B 7.若 8259A 的 ICW2 设置为 28H,从 IR3 引入的中断请求的中断类型码是_____。A.28H B.2BH C.2CH D.2DH 答案:B 8.8259A 有 3 中 EOI 方式,其目的都是为了_____。 A.发出中断结束命令,使相应的 ISR=1 B.发出中断结束命令,使相应的 ISR=0 C.发出中断结束命令,使相应的 IMR=1 D.发出中断结束命令,使相应的 IMR=0 答案:B 9.8259A 特殊全嵌套方式要解决的主要问题是______。 A.屏蔽所有中断 B.设置最低优先级 C.开发低级中断 D.响应同级中断 答案:D 10.8259A 编程时,中断屏蔽可通过______设置。A.ICW1 B.OCW1 C.OCW2 D.OCW3 答案:B 二、填空题 1.8086/8088 的中断系统,可以处理______种不同的中断。从产生中断的方法来分,中断可 分为两大类: 一类叫_____中断; 一类叫______中断。硬件中断又可分为两大类: 一类叫______ 中断;另一类叫______中断。 答案:256 外部、内部 不可屏蔽中断 可屏蔽中断 2.8086 系统中断响应时,会将,和 压入堆栈,并将 和 TF 清零。 答案:FR CS IP 3.类型码为______的中断所对应的中断向量放在 0000H:0084H 开始的 4 个存储单元中,若这 4 个存储单元中从低地址到高地址存放的数依次是___________,则相应的中断服务程序的 入口地址是 3322H:1150H。 答案:21H 50H 11H 22H 33H 4.已知 CS 的内容为 2000H,IP 的内容为 3000H,则 CPU 下一条要执行指令的物理地址是 ________;当紧接着执行中断指令 INT 15H 时,其中断类型码为______,该指令对应的中断 向量在中断向量表中的首地址为__________,假定该中断对应的中断向量是 4000H:2300H,则执行该中断后 CPU 执行中断服务程序的首地址是______,此时 CS 中为_____,IP 中为 _______。 答案:23000H, 15H 54H 43200H 4000H 2300H 5.8259A 有两种中断触发方式:______和______。 答案:边沿触发方式 电平触发方式 6.若有 40 个外部中断申请信号,则至少需要______片 8259A 中断控制器。 答案:6 7.8259A 内部含有_____个可编程寄存器,共占用_____个端口地址。8259A 的中断请求寄存 器 IRR 用于存放_______,中断服务寄存器 ISR 用于存放_______。 答案:7 2 外部的中断请求信号 系统响应中断信号的状态 8.8259A 的初始化命令字包括_________,其中________和_______是必须设置的。 答案:ICW1~ICW4 ICW1 ICW2 9.中断服务程序的返回指令为。答案:IRET 10.执行溢出中断的两个条件是 和。 答案:OF=1, INTO 11.8086/8088 系统共能管理 个中断,中断向量表在内存中的地址从 到。 答案:256 00000H~0003FFH 12.已 知 SP=0100H, SS=0600H, 标 志 寄 存 器 Flags=0204H, 存 储 单 元 [0024H]=60H, [0025H]=00H, [0026H]=00H, [0027H]=10H,在段地址为 0800H 及偏移地址为 00A0H 开始的单元 中,有一条指令 INT 9H(INT 9H 为 2 字节指令)则执行该指令后。SS= , SP= , IP= , CS= ,Flags=。Flags: OF DF IF TF SF ZF AF PF CF 答案:(SS)=0600H(SP)=00FAH(IP)=0060H(CS)=1000H(FR)=0004H 三、问答题 1.如何“屏蔽”可屏蔽中断?叙述 CPU 响应可屏蔽中断的过程。 答案: 由 CPU 的 INTR 引脚上的中断请求信号引起的中断称为可屏蔽中断。这种中断可以被 CLI 指 令屏蔽。当中断接口电路中的中断屏蔽触发器未被屏蔽时,外设可通过中断接口发出中断申请。外设 向 CPU 发出中断请求的时间是随机的,而 CPU 响应可屏蔽中断需满足如下条件:(1)CPU 必须处于开中断状态,即 TF=1 状态;(2)系统中无总线请求;(3)系统中无不可屏蔽中断请求;(4)CPU 执行完现行命令。 2.设某中断的中断类型号为 12H,中断服务程序的段地址为 2020H,偏移地址为 3000H,试编写程序段将中断向量装入中断向量表中。 答案: XOR AX, AX MOV ES, AX MOV DI, 12*4;DI 中为 n 号中断对应的中断向量表的偏移地址 MOV AX, 3000H CLD STOSW;装入中断服务程序偏移地址 MOV AX, 2020H STOSW;装入中断服务程序偏移地址 3.8259A 具有两种中断屏蔽方式,普通屏蔽和特殊屏蔽方式。这两种屏蔽方式有什么特殊之 处,特殊屏蔽方式一般用在什么场合? 答案:(1)普通屏蔽方式:在普通屏蔽方式中,将 IMR 某位置 1,则它对应的中断就被屏蔽,从 而使这个中断请求不能从 8259A 送到 CPU。如果 IMR 位置 0,则允许该级中断产生。(2)特殊屏蔽方式:在有些特殊情况下,希望一个中断服务程序能够动态地改变系统优先 权结构,就引入了特殊屏蔽方式。编程时 IMR 某位置位,就会同时使 ISR 的对应位复位。这 样就不只屏蔽了当前正在处理的这级中断,而且真正开放了其他级别较低的中断。当然,未 屏蔽的较高级中断也可得到响应。特殊屏蔽中断一般用在中断服务程序执行过程中,不仅用于响应优先级高于当前中断的中断 请求优先级,而且还能够应用于响应优先级低于当前中断的中断申请优先级的场合。 4.试简述 8259A 中断控制器是如何在特殊全嵌套方式 SNFM 下实现全嵌套的? 答案: 特殊全嵌套方式和普通全嵌套方式的区别在于: 在特殊全嵌套方式下,当处理某一级中断时,如果有同级的中断请求 8259A 也会给予响应,从而实现一个中断过程能被另一个具有同等 级的中断请求所打断。特殊全嵌套方式一般用在 8259A 的级联系统中。在这种情况下只有主片的 8259A 允许编程 为特殊全嵌套方式。这样,当来自某一从片的中断请求正在处理时,主片除对来自优先级较 高的本片上其他 IR 引脚上的中断请求进行开放外,同时对来自同一从片的较高优先级请求 也会开放。使主片不封锁得到响应的从片的 INT 输入,以便让从片上优先级别更高的中断能 够得到响应。 5.请编写初始化程序。系统有一片 8259A,中断请求信号用电平触发方式,要用 ICW4,中断 类型码为 60H~67H,用特殊全嵌套方式,无缓冲,采用自动中断结束方式。设 8259A 的地 址为 92H,93H。 答案: MOV AL, 0001101B OUT 92H, AL MOV AL, 01100000B OUT 93H, AL MOV AL, 00010011B OUT 93H, AL 6.若 8086 系统采用单片 8259A 作为外部可屏蔽中断的优先级管理器,正常全嵌套方式,边 沿触发,非缓冲连接,非自动中断结束,端口地址为 20H,21H。其中某中断源的中断类型 码为 0AH,其中断服务子程序的入口地址是 2000:3A40H。 (1)请为 8259A 设置正确的初始化命令字,并编写初始化程序。 (2)中断源应与 IR 的哪一个输入端相连?中断向量地址是多少,中断向量区对应着 4 个单 元的内容是什么? 答案: MOV AL, 13H OUT 20H, AL MOV AL, 08H OUT 21H, AL MOV AL, 01H OUT 21H, AL 中断源应与 IRQ2 相连,矢量地址为 0028AH,地址中内容(由高向低):20H,00H,3AH,40H 7.8086 微机系统中,如图例 7 所示硬件连接,8259A 的主片采用特殊全嵌套,从片采用 一般全嵌套,主片和从片都是非自动中断结束,中断源都为边沿触发信号有效,主片的中断 类型码为 80H~87H,从片的中断类型码为 50H~57H。1. 写出主片 8259A 和从片 8259A 的地址; 2. 写出主片 8259A 的控制字,并完成初始化编程; 3. 写出从片 8259A 的控制字,并完成初始化编程; 图例 7 1.主片地址:F0H F1H 从片地址:C0H C1H 2.主片: ICW1 ICW2 ICW3 ICW4 从片: ICW1 ICW2 ICW3 ICW4 11H 80H 80H 11H 11H 50H 03H 01H 3.主片初始化 MOV AL, 11H OUT 0F0H,AL MOV AL, 80H OUT 0F1H,AL MOV AL, 80H OUT 0F1H, AL MOV AL, 11H OUT 0F1H, AL 从片初始化: MOV AL, 11H OUT 0C0H,AL MOV AL, 50H OUT 0C1H,AL MOV AL, 03H OUT 0C1H, AL MOV AL, 01H OUT 0C1H, AL 第七章习题 一、选择题 1.在程序控制传送方式中,_______可提高系统的工作效率。 A.无条件传送 B.查询传送 C.中断传送 D.以上均可 答案:C 2.在 8086 的中断中,只有______需要硬件提供中断类型码。 A.外部中断 B.可屏蔽中断 C.不可屏蔽中断 D.内部中断 答案:B 3.在中断响应周期,CPU 从数据总线上获取______。 A.中断向量的偏移地址 B.中断向量 C.中断向量的段地址 D.中断类型码 答案:D 4.执行 INT n 指令或响应中断时,CPU 保护现场的次序是______。 A.FLAGS 寄存器(FR)先入栈,其次是 CS,最后是 IP B.CS 在先,其次是 IP,最后 FR 入栈 C.FR 在先,其后一次是 IP,CS D.IP 在先,其次是 CS,最后 FR 答案:A 5.在 PC/XT 中,NMI 中断的中断向量在中断向量表中的位置_______。 A.是由程序指定的 B.是由 DOS 自动分配的 C.固定在 0008H 开始的 4 个字节中 D.固定在中断向量表的表首 答案:C 6.中断调用时,功能调用号码应该_______。 A.写在中断指令中 B.在执行中断指令前赋给 AH C.在执行中断指令前赋给 AX D.在执行中断指令前赋给 DL 答案:B 7.若 8259A 的 ICW2 设置为 28H,从 IR3 引入的中断请求的中断类型码是_____。A.28H B.2BH C.2CH D.2DH 答案:B 8.8259A 有 3 中 EOI 方式,其目的都是为了_____。 A.发出中断结束命令,使相应的 ISR=1 B.发出中断结束命令,使相应的 ISR=0 C.发出中断结束命令,使相应的 IMR=1 D.发出中断结束命令,使相应的 IMR=0 答案:B 9.8259A 特殊全嵌套方式要解决的主要问题是______。A.屏蔽所有中断 B.设置最低优先级 C.开发低级中断 D.响应同级中断 答案:D 10.8259A 编程时,中断屏蔽可通过______设置。A.ICW1 B.OCW1 C.OCW2 D.OCW3 答案:B 二、填空题 1.8086/8088 的中断系统,可以处理______种不同的中断。从产生中断的方法来分,中断 可分为两大类:一类叫_____中断;一类叫______中断。硬件中断又可分为两大类:一类 叫______中断;另一类叫______中断。 答案:256 外部、内部 不可屏蔽中断 可屏蔽中断 2.8086 系统中断响应时,会将,和 压入堆栈,并将 和 TF 清零。 答案:FR CS IP 3.类型码为______的中断所对应的中断向量放在 0000H:0084H 开始的 4 个存储单元中,若这 4 个存储单元中从低地址到高地址存放的数依次是___________,则相应的中断服务 程序的入口地址是 3322H:1150H。 答案:21H 50H 11H 22H 33H 4.已知 CS 的内容为 2000H,IP 的内容为 3000H,则 CPU 下一条要执行指令的物理地址 是________;当紧接着执行中断指令 INT 15H 时,其中断类型码为______,该指令对应 的中断向量在中断向量表中的首地址为__________,假定该中断对应的中断向量是 4000H:2300H,则执行该中断后 CPU 执行中断服务程序的首地址是______,此时 CS 中 为_____,IP 中为_______。 答案:23000H, 15H 54H 43200H 4000H 2300H 5.8259A 有两种中断触发方式:______和______。 答案:边沿触发方式 电平触发方式 6.若有 40 个外部中断申请信号,则至少需要______片 8259A 中断控制器。 答案:6 7.8259A 内部含有_____个可编程寄存器,共占用_____个端口地址。8259A 的中断请求 寄存器 IRR 用于存放_______,中断服务寄存器 ISR 用于存放_______。 答案:7 2 外部的中断请求信号 系统响应中断信号的状态 8.8259A 的初始化命令字包括_________,其中________和_______是必须设置的。 答案:ICW1~ICW4 ICW1 ICW2 9.中断服务程序的返回指令为。 答案:IRET 10.执行溢出中断的两个条件是 和。 答案:OF=1, INTO 11.8086/8088 系统共能管理 个中断,中断向量表在内存中的地址从 到。 答案:256 00000H~0003FFH 12.已知 SP=0100H, SS=0600H, 标志寄存器 Flags=0204H, 存储单元 [0024H]=60H, [0025H]=00H, [0026H]=00H, [0027H]=10H,在段地址为 0800H 及偏移地址为 00A0H 开始的单元中,有一条指令 INT 9H(INT 9H 为 2 字节指令)。则执行该指令后,SS= , SP= , IP= , CS= ,Flags=。Flags: OF DF IF TF SF ZF AF PF CF 答案:(SS)=0600H(SP)=00FAH(IP)=0060H(CS)=1000H(FR)=0004H 三、问答题 1.如何“屏蔽”可屏蔽中断?叙述 CPU 响应可屏蔽中断的过程。 答案: 由 CPU 的 INTR 引脚上的中断请求信号引起的中断称为可屏蔽中断。这种中断可以被 CLI 指令屏蔽。当中断接口电路中的中断屏蔽触发器未被屏蔽时,外设可通过中断接口发出中断申请。外设向 CPU 发出中断请求的时间是随机的,而 CPU 响应可屏蔽中断需满足如下条件:(1)CPU 必须处于开中断状态,即 TF=1 状态;(2)系统中无总线请求;(3)系统中无不可屏蔽中断请求;(4)CPU 执行完现行命令。 2.设某中断的中断类型号为 12H,中断服务程序的段地址为 2020H,偏移地址为 3000H,试编写程序段将中断向量装入中断向量表中。 答案: XOR AX, AX MOV ES, AX MOV DI, 12*4;DI 中为 n 号中断对应的中断向量表的偏移地址 MOV AX, 3000H CLD STOSW;装入中断服务程序偏移地址 MOV AX, 2020H STOSW;装入中断服务程序偏移地址 3.8259A 具有两种中断屏蔽方式,普通屏蔽和特殊屏蔽方式。这两种屏蔽方式有什么特 殊之处,特殊屏蔽方式一般用在什么场合? 答案:(1)普通屏蔽方式:在普通屏蔽方式中,将 IMR 某位置 1,则它对应的中断就被屏蔽,从而使这个中断请求不能从 8259A 送到 CPU。如果 IMR 位置 0,则允许该级中断产生。(2)特殊屏蔽方式:在有些特殊情况下,希望一个中断服务程序能够动态地改变系统优 先权结构,就引入了特殊屏蔽方式。编程时 IMR 某位置位,就会同时使 ISR 的对应位复 位。这样就不只屏蔽了当前正在处理的这级中断,而且真正开放了其他级别较低的中断。当然,未屏蔽的较高级中断也可得到响应。特殊屏蔽中断一般用在中断服务程序执行过程中,不仅用于响应优先级高于当前中断的 中断请求优先级,而且还能够应用于响应优先级低于当前中断的中断申请优先级的场合。 4.试简述 8259A 中断控制器是如何在特殊全嵌套方式 SNFM 下实现全嵌套的? 答案: 特殊全嵌套方式和普通全嵌套方式的区别在于:在特殊全嵌套方式下,当处理某一级中 断时,如果有同级的中断请求 8259A 也会给予响应,从而实现一个中断过程能被另一个 具有同等级的中断请求所打断。特殊全嵌套方式一般用在 8259A 的级联系统中。在这种情况下只有主片的 8259A 允许编 程为 特殊全嵌套方式。这样,当来自某一从片的中断请求正在处理时,主片除对来自优 先级较高的本片上其他 IR 引脚上的中断请求进行开放外,同时对来自同一从片的较高优 先级请求也会开放。使主片不封锁得到响应的从片的 INT 输入,以便让从片上优先级别 更高的中断能够得到响应。 5.请编写初始化程序。系统有一片 8259A,中断请求信号用电平触发方式,要用 ICW4,中断类型码为 60H~67H,用特殊全嵌套方式,无缓冲,采用自动中断结束方式。设 8259A 的地址为 92H,93H。 答案: MOV AL, 0001101B OUT 92H, AL MOV AL, 01100000B OUT 93H, AL MOV AL, 00010011B OUT 93H, AL 6.若 8086 系统采用单片 8259A 作为外部可屏蔽中断的优先级管理器,正常全嵌套方式,边沿触发,非缓冲连接,非自动中断结束,端口地址为 20H,21H。其中某中断源的中 断类型码为 0AH,其中断服务子程序的入口地址是 2000:3A40H。(1)请为 8259A 设置正确的初始化命令字,并编写初始化程序。 (2)中断源应与 IR 的哪一个输入端相连?中断向量地址是多少,中断向量区对应着 4 个单元的内容是什么? 答案: MOV AL, 13H OUT 20H, AL MOV AL, 08H OUT 21H, AL MOV AL, 01H OUT 21H, AL 中断源应与 IRQ2 相连,矢量地址为 0028AH,地址中内容(由高向低):20H,00H,3AH,40H 7.8086 微机系统中,如图例 7 所示硬件连接,8259A 的主片采用特殊全嵌套,从片采 用一般全嵌套,主片和从片都是非自动中断结束,中断源都为边沿触发信号有效,主片 的中断类型码为 80H~87H,从片的中断类型码为 50H~57H。 1. 写出主片 8259A 和从片 8259A 的地址; 2. 写出主片 8259A 的控制字,并完成初始化编程; 3. 写出从片 8259A 的控制字,并完成初始化编程; 8086 D7~D0IO /M A7A5A4A3A2A1A0INTA A6INTR G1 A B C 1 74LS138 CS A0D7~D0INT IR0IR1IR2IR3IR4IR5IR6IR7EN SP/ +5V INTA CAS0CAS2~ 8259A 8259AG2AG2B7Y6Y5Y4YCAS0CAS2~ IR0IR1IR2IR3IR4IR5IR6IR7EN SP/ CS A0D7~D0INT INTA 图例 7 1.主片地址:F0H F1H 从片地址:C0H C1H 2.主片: ICW1 11H ICW2 80H ICW3 80H ICW4 11H 从片: ICW1 11H ICW2 50H ICW3 03H ICW4 01H 3.主片初始化 MOV AL, 11H OUT 0F0H,AL MOV AL, 80H OUT 0F1H,AL MOV AL, 80H OUT 0F1H, AL MOV AL, 11H OUT 0F1H, AL 从片初始化: MOV AL, 11H OUT 0C0H,AL MOV AL, 50H OUT 0C1H,AL MOV AL, 03H OUT 0C1H, AL MOV AL, 01H OUT 0C1H, AL 第八章习题 一、选择题 1.可编程计数/定时器 8253 的工作方式共有______,共有_____个 I/O 口。 A.3 种,4 B.4 种,5 C.6 种,3 D.6 种,4 答案:C 2.若 8253 的通道计数频率为 1MHz,每个通道的最大定时时间为______。 A.10ms B.97.92ms C.48.64ms D.65.536ms 答案:D 3.当可编程计数/定时器 8253 工作在方式 0,在初始化编程时,一旦写入控制字后,_________。 A.输出信号端 OUT 变为高电平B.输出信号端 OUT 变为低电平C.输出信号保持原来的电位值 D.立即开始计数 答案:B 4.定时/计数器 8253 无论工作在哪种方式下,在初始化编程时,写入控制字后,输出端 OUT 便______。 A.变为高电平B.变为低电平C.变为相应的高电平或低电平D.保持原状态不变,直至计数结束 答案:C 5.8253 工作在方式 1 时,输出负脉冲的宽度等于______。 A.1 个 CLK 脉冲宽度 B.2 个 CLK 脉冲宽度 C.N 个 CLK 脉冲宽度 D.N/2 个 CLK 脉冲宽度 答案:C 6.将 8253 定时/计数器的通道 0 设置为方式 3,产生频率为 10KHz 的方波。当输入脉冲 频率为 2MHz 时,计数初值为______。A.200 B.300 C.400 D.500 答案:A 二、填空题 1.8253 的计数器通道有______个,端口地址有_______个。答案:3,4 2.8253 的最高计数频率为。 答案:2MHz 3.8253 的数据引脚有_______位,内部有_______位的计数器初值寄存器。答案:8 位 16 位 4.若 8253 的输入时钟 CLK1=1MHz,计数初值为 500,BCD 码计数方式,OUT1 输出为 方波,则初始化时该通道的控制字应为______。 答案:77H 5.如果 8253 通道 0 工作在方式 0,初值为 8H,当减法计数至 5H 时,GATE 信号变为低,则 当 GATE 信号从新为高时,从 又开始计数。 答案:原来计数中断的位置 6.8253 端口地址为 40H~43H,通道 0 作为计数器,计数时钟频率为 1MHz。下面程序段 执行后,输出脉冲的宽度是______。MOV AL, 36H OUT 43H, AL MOV AX, 20000 OUT 40H, AL MOV AL, AH OUT 40H, AL 答案:10ms 三、问答题 1.每个计数器和外设的连接引脚各是什么?简述其功能。 答案:计数器与外部相连的信号端有 3 个:CLK、GATE 和 OUT。CLK 是计数器 的时钟脉冲输入端,最高频率为 2MHz;GATE 是计数器的控制信号,决定是否允许计 数;OUT 是计数器的输出信号,不同的工作方式有不同的输出信号。 2.某系统利用 8253 芯片进行定时计数,输入的时钟脉冲为 1MHz,定时时间为 10s,问需要几个计数器通道完成定时,每个计数器通道的计数初值为多少? 答案: 10×106=1000 0000 需要两个计数通道,计数初值分别为 1000 和 10000 3.8253 的 4 个端口地址为 208H、209H、20AH、20BH,采用计数器 0 定时,输入时钟 信号为外部事件,当外部事件记满 100 时,由计数器 0 输出中断请求信号,要求完成对 计数器 0 的初始化编程,并设计端口地址的译码硬件电路。 答案: 控制字 00010000H 片选地址 片内地址 接口电路地址 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 10000010 0 0 208H 0 1 209H 1 0 20AH 1 1 20BH MOV DX, 20BH MOV AL, 10H OUT DX, AL MOV AL,100 MOV DX, 208H OUT DX, AL & ≥1 CS A9A3A8A7A6A5A4M/IO RD WR IOR IOW D7~D0 至 DB A1A0A1A0GATE0+5V CLK0OUT0 外部事件计数 申请中断 4.如题图 8.1 所示硬件电路,试写出 8253 的 4 个端口地址,并写出计数器 1 的初始化 程序。M/IO A9A8A7A6A5A4A3A2A1A0RDWR D7D08086 CPU G1 G2A Y3G2B C B A CS A1A0RD WR D7D0CLK1GATE1OUT18253 1MHz 方波 +5V 2KHz 方波 74LS138 & ≥ ≥ 题图 8.1 硬件电路连接 答案:地址: 片选地址 片内地址 接口电路地址 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 11000011 0 0 30CH 0 1 30DH 1 0 30EH 1 1 30FH 计数值: 1M/2K=500 控制字:01 10 011 1 方式 3,十进制,只写高位 MOV DX, 30FH MOV AL, 67H OUT DX, AL MOV AL, 05H MOV DX, 30DH OUT DX, AL 5.已知电路原理图如题图 8.2 所示。编写初始化程序,使在 OUT0 端输出图示波形。题图 8.2 答案: 初值:1000 控制字:35H MOV AL, 35H MOV DX, 203H OUT DX, AL MOV AX, 1000H MOV DX, 200H OUT DX, AL MOV AL, AH OUT DX, AL 第九章习题 一、选择题 1.对 8255A 的 C 口执行按位置位/复位操作时,写入的端口地址是______。 A.端口 A B.端口 B C.端口 C D.控制口 答案:D 2.要将 8255A 的 3 个 8 位的 I/O 端口全部设定为方式 0 的输入,其设置的方式控制字为____。 A.98H B.9BH C.9AH D.99H 答案:D 3.当 8255A 的 A 口工作在方式 1,B 口工作在方式 1 时,C 口仍然可按基本的输入输出方式 工作的端口线有_________条。A.0 B.2 C.3 D.5 答案:B 4.当 8255A 端口 PA、PB 分别工作在方式 2、方式 1 时,其 PC 端口引脚为_______。A.2 位 I/O B.2 个 4 位 I/O C.全部用作应答联络线 D.1 个 8 位 I/O 答案:C 5.如果 8255A 的端口 A 工作在双向方式,这时还有_____根 I/O 线可作其他用。A.11 B.12 C.10 D.13 答案:A 6.当 8255A 的 PC4~PC7 全部为输出线时,表明 8255A 的 A 端口工作方式是______。A.方式 0 B.方式 1 C.方式 2 D.任何方式 答案:A 7.8255A 中既可以作为数据输入、输出端口,又可以提供控制信息、状态信息的端口是____。A.端口 A B.端口 B C.端口 C D.控制口 答案:C 8.8255A 的端口 A 和端口 B 工作在方式 1 输出时,与外部设备的联络信号将使用____信号。A.INTR B.C.INTE D.IBF 答案:B 二、填空题 1.当 8255A 的 A 口工作于方式 1 输入,B 口工作于方式 0 时,C 口的_____位可以作为输入 输出口使用。答案:5 位 2.若要求 8255A 的 A、B 口工作在方式 1,作为输入,C 口作为输出,则输入 8255A 控制口 的控制字为______。 答案:B6H 3.若 8255A 的端口 B 工作在方式 1,并为输出口,置位 PC2 的作用为______。 答案:允许端口 B 输出中断 4.当数据从 8255A 的端口 C 往数据总线上读出时,8255 的几个控制信号、A1、A0、、分 别是__________________。 答案:0 1 0 0 1 5.8255A 在方式 0 工作时,端口 A、B 和 C 的输入输出可以有_______种组合。 答案:16 三、问答题 1.并行接口芯片 8255A 和外设之间有几个数据端口?在结构上有什么区别? 答案:3 个数据端口 这 3 个端口与外设的数据接口都是 8 位,但功能不完全相同。A 口有 3 种工作方式,B 口有 2 种工作方式,口有 1 种工作方式。口可以分两部分使用,C C 常用来配合 A 口和 B 口工作,C 口的高四位 PC7 ~ PC4 常用来配合 A 口工作,口的低四位 PC3 ~ PC0 常用来配合 B 口工作。C 各端口在结构上有所不同: 端口 A 包含 1 个 8 位的数据输入锁存器,1 个 8 位的数据输出锁存器; 端口 B 包含 1 个 8 位的数据输入缓冲器,1 个 8 位的数据输出锁存器; 端口 C 包含 1 个 8 位的数据输入缓冲器,1 个 8 位的数据输出锁存器。 2.8255A 的地址信号线是什么?共占用几个端口地址? 答案: 地址信号端 A1、A0,有 4 种组合: A1A0=00,选中端口 A 的寄存器; A1A0=01,选中端口 B 的寄存器; A1A0=10,选中端口 C 的寄存器; A1A0=11,选中控制字寄存器。 3.A 口工作于方式 0,输入,B 口工作于方式 1,输出,C 口的 PC1 作为输出联络口,PC2 作 为输入联络口,8255A 占用的 4 个端口地址为 80H ~ 83H,编写初始化程序,画出端口地址 的译码电路。 答案: 控制字:1 001 0 1 00 94H MOV AL, 94H OUT 83H, AL 4.8255A 的 A 口和 B 口都工作于方式 0,PC6 作为输入联络口,PC2 作为输出联络口。当检 测到 PC6 为“1”时,A 口输出数据 46H,并且 PC2 输出“1”。设 8255A 的 4 个端口地址为 108H ~ 10EH,试编写以上操作程序段。 答案: 控制字:1 00 0 1 00 0 88H A 口方式 0 输出 C 口高 4 位输入 PC2 输出 1 0 000 010 1 05H MOV DX, 10EH MOV AL, 88H OUT DX, AL;控制字 DEC DX NEXT: IN AL , DX TEST AL, 40H;测试 PC6 JZ NEXT;为 0,继续查询 MOV DX, 108H MOV AL, 46H OUT DX, AL;A 口输出 MOV AL, 05H MOV DX, 10EH OUT DX, AL ;PC2 输出 5.如题图 9.1 所示电路,当 A 口连接的开关闭合时,相应的 B 口连接的发光二极管亮。(1)(2)写出 8255A 的 4 个端口地址; 编写程序完成以上操作。题图 9.1 硬件电路连接 答案:地址:208H~20BH 控制字:1 00 1 0 0 00 A 口发生 0 输入 B 口方式 0 输出 MOV DX , 20BH MOV AL, 90H OUT DX, AL MOV DX, 108H IN AL, DX;读 A 口 INC DX OUT DX, AL;写 B 口 6. 如题图 9.2 所示电路,口工作于方式 1 输出,B 作为 CPU 和打印机之间的并行接口电路。设 8255A 的端口地址为 90H ~ 93H,编写程序完成将 RUF 开始的 1000 个字节的数据打印。题图 9.2 B 口方式 1 输出 答案: 控制字 1 000 0 1 0 0 84H B 口方式 1 输出 允许 B 口中断,可以查询中断指示状态:PC2 置 1,0 000 010 1 MOV AL, 84H OUT 93H, AL;写控制字 MOV AL, 05H OUT 93H, AL;写中断允许 LEA SI , RUF MOV CX, 1000 L1: MOV AL, [SI];将数据传送至 AL OUT 91H, AL;从 A 口输出数据,使 变为低电平L2: IN AL, 92H;从 C 口读取状态字;打印机取走数据后,变为低电平,并将 变为高电平AND AL, 01H;判断 B 口是否提出中断申请 JZ L2;如果没有,继续检测状态字 INC SI;DEC CX JNZ L1 HLT 第10章 定时/计数器8253应用设计 1.试分析 8255A方式0、方式1和方式2的主要区别,并分别说明它们适合于什么应用场合。 答:方式0是基本的输入/输出,端口A、B、C都可以作为输入输出端口。适用于CPU与非智能I/O设备的数据传输; 方式1是有联络信号的输入/输出,端口A、B都可以设定成该方式,此时三个端口的信号线分成了A、B两组,PC7~PC4用作A组的联络信号,PC3~PC0用作B组的联络信号。适用于高速CPU与低速I/O设备的数据传输; 方式2是双向传输,只有A组端口可以设定成该方式,PC6~PC7用作输出的联络信号,PC4~PC5用作输入的联络信号,PC3用作中断请求信号。适用于双机之间数据的并行传送。 2.8255A的A组设置成方式1输入,与CPU之间采用中断方式联络,则产生中断请求信号INTRA的条件是 STBA= ,IBFA= ,INTEA=。 3.如果8255A的端口地址为300H~303H,A组和B组均为方式0,端口A为输出,端口B为输入,PC3~PC0为输入,PC7~PC4为输出,写出8255A的初始化程序段;编程实现将从端口C低4位读入的值从高4位送出。解: MOV DX,303H MOV AL,10000011B OUT DX,AL MOV DX,302H IN AL,DX MOV CL,4 SHL AL,CL OUT DX,AL 4.在实际应用中经常需要检测设备的状态,并进行指示。在8086最小方式系统下,有一片8255A,其分配的端口地址为8F00H~8F07H中的奇地址,外部设备产生的状态有16个(K15~K0),要求采用4个发光二极管来指示开关量中“1”的个数。(1)画出8255A - 0 - 的连接图;(2)编写程序段实现连续检测并显示。解:(1) 8086D8~D158255D0~D7RDRDWRA2A1M/IOBHEA15A11A10A9A8A0A14A13A12A7A6A5A4A3PA0PA1......WRA1PA716位开关量(K15~K0)A0PB0PB1PB7......VCCCSPC3PC2PC1PC0 (2)MOV DX,8F07H MOV AL,10010010B;端口A、B方式0输入,端口C方式0输出 OUT DX,AL NEXT: L2: MOV DX,8F03H;从端口B读取高8位开关量 IN AL,DX XCHG AL,AH MOV DX,8F01H;从端口A读取低8位开关量 IN AL,DX MOV BX,AX XOR AL,AL MOV CX,16 CLC SHL BX,1 - 1 - L1: JNC L1 INC AL LOOP L2 MOV DX,8F05H;从端口C送出 OUT DX,AL JMP NEXT;进行下一次检测 5.利用IBM PC系统机的总线槽,开发由一片8255A构成的子系统,8255A端口地址为260H~263H,编程实现产生如图10.20所示的8个信号(各个信号的节拍不必严格相等)。 Y0Y1Y7„ 图10.20 要求产生的信号波形 解:8355A与IBM PC机总线的连接框图如下: 可将8255A的端口A作为要产生的信号的输出端口,设定为方式0输出,端口B和端口C不做使用,均设定为方式0输出。程序段如下: MOV DX,263H ;设定8255A的工作方式 - 2 - MOV AL,10000000B OUT DX,AL MOV DX,260H ;产生指定信号 XOR AL,AL OUT DX,AL REP: MOV AL,80H MOV CX,7 REP1: OUT DX,AL SAR AL,1 LOOP REP1 MOV CX,8 REP2: SHL AL,1 OUT DX,AL LOOP REP2 JMP REP 6.在实际应用中,经常会遇到要求输入多个数据量,这时需要用到多路开关,如图10.21表示八选一的逻辑框图及其真值表。现有8组16位开关量数据(无符号数),要求通过一片8255A(端口地址为260H~263H)分时输入到CPU(8088最小方式系统)中,并找出它们中的最大值,并通过4个发光二极管指示其序号(灯亮表示“1”)。画出8255A的连接图,并编程实现。 解:由于开关量是16为数据,故可以将8255A的PA端与PB端设定为方式0,分别读取开关量的低八位和高八位,以PC低三位端口的控制八选一电路的输出依次从X0到X7,- 3 - 八选一x0x1x2x3x4x5x6x7ys0s1s2s2s1s00 0 00 0 10 1 00 1 11 0 01 0 11 1 01 1 1yx0x1x2x3x4x5x6x7图10.21 八选一逻辑电路使用PC端口的高八位输出最大开关量的序号(该序号为1~8),控制发光二极管的亮灭以码指示序号。连接图如下: 程序段如下: MOV DX,263H MOV AL,10011010B;设定工作方式,PA,PB均工作于方式0,PA、PB为输入,PC为输出 OUT DX,AL MOV CX,8 XOR BX,BX MOV SI,0 ;SI表示输入开关量的序号 ST1: MOV DX,262H OUT DX,SI MOV DX,260H ;将开关量数据的低八位写入AL IN AL,DX MOV DX,261H ;将开关量数据的高八位写入AH IN AH,DX - 4 - CMP BX,AX JA NEXT MOV BX,AX ;将当前最大值保存在BX中 INC SI PUSH SI ;将当前最大值的序号压栈 NEXT: INC SI LOOP ST1 POP SI XOR AX,AX MOV AX,SI MOV CL,4 ROL AL,CL MOV DX,262H OUT DX,AL ;最大值的序号出栈 ;将最大值的序号(4位)移至AL的高四位 的高四位输出最大值序号 - 5 - ;PC 第2章 8086 CPU结构与功能 1.微处理器内部结构由哪几部分组成?阐述各部分的主要功能。解:微处理器内部结构由四部分组成: (1)算术逻辑运算单元ALU:完成所有的运算操作; (2)工作寄存器:暂存寻址信息和计算过程中的中间结果; (3)控制器:完成指令的读入、寄存和译码,并产生控制信号序列使ALU完成指定操作; (4)I/O控制逻辑:处理I/O操作。 2.微处理器级总线有哪几类?各类总线有什么作用? 解:微处理器级总线有三类: (1)数据总线:传送信息; (2)地址总线:传送地址码; (3)控制总线 传送控制信号。 3.为什么地址总线是单向的,而数据总线是双向的? 解:地址码只能由CPU生成。而数据需要在CPU和存储器之间传输。4.8086/8088微处理器内部有哪些寄存器?其主要作用是什么? 解:8086CPU内部有14个16位寄存器,其中8个通用寄存器(4数据寄存器AX、BX、CX、DX,4地址指针/变址寄存器SI、DI、SP、BP),4个段寄存器(CS、DS、ES、SS),2个控制寄存器(指令指针IP,微处理器状态字PSW)。 应该注意的是:可以在指令中用作为地址指针的寄存器有:SI、DI、BP和BX;在微处理器状态字PSW中,一共设定了9个标志位,其中6个标志位用于反映ALU前一次操作的结果状态(CF,PF,AF,ZF,SF,OF),另3个标志位用于控制CPU操作(DF,IF,TF)。 5.如果某微处理器有20条地址总线和16条数据总线: (1)假定存储器地址空间与I/O地址空间是分开的,则存储器地址空间有多大? (2)数据总线上传送的有符号整数的范围有多大? 解:(1)存储器地址空间为:2201MB 1(2)有符号数范围为: 2~21,即 -32768~32767 6.将十六进制数62A0H与下列各数相加,求出其结果及标志位CF、AF、SF、ZF、OF 15和PF的值: (1) 1234H;(2) 4321H;(3) CFA0H;(4) 9D60H 解:(1) 74D4H CF=0 AF=0 SF=0 ZF=0 OF=0 PF=1 (2) A5C1H CF=0 AF=0 SF=1 ZF=0 OF=1 PF=0 (3) 3240H CF=1 AF=0 SF=0 ZF=0 OF=0 PF=0 (4) 0000H CF=1 AF=0 SF=0 ZF=1 OF=0 PF=1 7.从下列各数中减去4AE0H,求出其结果及标志位CF、AF、SF、ZF、OF和PF的值: (1)1234H;(2)5D90H;(3)9090H;(4)EA04H 解:(1) C754H CF=1 AF=0 SF=1 ZF=0 OF=0 PF=0(2) 12B0H CF=0 AF=0 SF=0 ZF=0 OF=0 PF=0(3) 45B0H CF=0 AF=0 SF=0 ZF=0 OF=1 PF=0 (4) 9F24H CF=0 AF=0 SF=1 ZF=0 OF=0 PF=1 9.写出下列存储器地址的段地址、偏移地址和物理地址:(1)2134:10A0;(2)1FA0:0A1F;(3)267A:B876 解:物理地址=段地址*10H+偏移地址 (1)段地址:2134H,偏移地址:10A0H,物理地址:223E0H(2)段地址:1FA0H,偏移地址:0A1FH,物理地址:2041FH(3)段地址:267AH,偏移地址:B876H,物理地址:32016H 10.给定一个数据的有效地址为2359H,并且(DS)=490BH,求该数据的物理地址。解:物理地址=段地址*10H+偏移地址 物理地址=490BH +2359H = 4B409H 11.如果在一个程序段开始执行之前,(CS)=0A7F0H,(IP)=2B40H,求该程序段的第一个字的物理地址。 解:物理地址=段地址*10H+偏移地址 物理地址=CS*10H+IP = AAA40H 12.IBM PC有哪些寄存器可用来指示存储器的地址? 解:变址寄存器SI,DI,堆栈指针SP,BP,另外还有BX。第二篇:微机原理与接口技术习题解答(钱晓婕)
第三篇:微机原理与接口技术课后习题答案(朱红)
第四篇:微机原理与接口技术习题答案10章
第五篇:微机原理与接口技术习题答案2