第1章习题
1.1 将下列二进制数转换为十进制数和十六进制。 (1)1101(2)=13=D(H) (2)11010(2)=26=1A(H) (3)110100(2)=52=34(H)
(4)10101001(2)=169=A9(H)
要点:从低位起,按每4位将对应二进制转换成十六进制。而不是通过十进制转换。
1.2 见上。
1.3简述3个门电路的基本元素在电路中对电平高低的作用。 答:与、或、非。
1.4 布尔代数有哪两个特点? 答:(1)值只有两个;
(2)只有与、或、反3种运算。
1.5 布尔代数的“或运算”结果可用哪两句话来归纳?其“与运算”又可归纳成哪两句话“ 答:(1)“或运算”运算结果为有一真必为真,两者皆假才为假。 (2)“与运算”有一假即为假,两者皆真才为真。
1.6 什么叫原码、反码及补码? 答:原码就是一个数的机器数。 反码:将原码每位取反,即为反码。
更准确的是:正数的反码就等于它的原码;
负数的反码就是它的原码除符号位外,各位取反。
补码:反码加1就是补码。
更准确的是:正数的补码就等于它的原码;
负数的补码就是它的反码加1。
例:X1=+100 1001 X2=-100 1001 则 :
[X1]原 = 0100 1001 [X1]反 = 0100 1001 [X1]补= 0100 1001 [X2]原 = 1100 1001 [X2]反 = 1011 0110
[X2]补 = [X2]反+1= 1011 0111
1.7 为什么需要半加器和全加器,它们之间的主要区别是什么? 答:(1)因为加法的第一位没有进位,所以用半加器即可;而第二位起可能有进位,故需要考虑全加器;
(2)两者的区别是半加器为双入双出,全加器为三入双出。
1.8 用补码法写出下列减法的步骤: (1)1111(2)-1010(2)=?(2)=?(10) 答:
两个数相减其实就是第一个数与第二个数的补码相加。
第一个数1111为正数,其原码为1111
第二个数为1010),其机器码(原码)为:1010,反码为0101,补码为:0110
两者相加: 1111
+ 0110
10101
将最高位的进位1删去,得结果为10101,即为5(10)
这是按书上的简单做法。按最正规的方法做如下:
若考虑两个数属于带符号数,第一个是正数,补码与原码都为01111;
第二个数是负数,原码为11010,反码为10101,补码为10101+1=10110
第一个数与第二个数的补码相加,即为:
01111
+ 10110
100101
将最高位的进位删去,得结果为00101,即为5(10)
建议用第二种方法为佳。
(2)1100(2)-0011(2)=?(2)=?(2) 答:按上述所讲的正规方法做。
第一个数的补码=原码=01100;第二个数的原码(即机器码)为10011,其反码为11100, 其补码为11101;
两个数的补码相加,即为: 01100 + 11101 = 101001
将最高位的进位1删去,得结果为01001,即为9(10)
1.9 做出101011(2)+011110(2)的门电路图并求其相加的结果。 答:相加结果为: 101011 + 011110 = 1001001 得结果为1001001(2)。(注:相加时不去掉最高位的进位) 门电路图略去。
1.10 做出第1.9题中两数相减的门电路图并求其相减的结果。 答:若为101011-011110
则第一个数为正数,其补码=原码=0101011;
第二个数为负数,其原码为1011110,反码为1100001,补码=反码+1=1100001+1=1100010 两个数的补码相加为: 0101011 + 1100010 = 1 0001101
去掉最高位的进位1,得结果为0001101,即为13(10)。
例2: [+0]反 = 00000000
[-0]反 = 11111111
即:数0的反码也不是唯一的。
第2章习题
2.2 触发器、寄存器及存储器之间有什么关系?请画出这几种器件的符号。 答:触发器是存放一位二进制数字信号的基本单元。触发器是计算机的记忆装置的基本单元,也可以说是记忆细胞。触发器可以组成寄存器,寄存器又可以组成存储器。寄存器和存储器统称为计算机的记忆装置。 (2)其符号分别表示如下:
2.4 累加器有何用处?画出其符号。
答:累加器作为ALU运算过程的代数和的临时存储处。
2.5 三态输出电路有何意义?其符号如何画? 答:三态输出电路使得一条信号传输线既能与一个触发器接通,也可以与其断开而与另外一个触发器接通,从而使得一条信号线可以传输多个触发器的信息。
2.6 何谓L门及E门?它们在总线结构中有何用处? 答:(1)L门:高电平时使数据装入、低电平时数据自锁其中的电路 ;
E门:E门即三态门,当选通端E门为高电平时,可将信息从A端送到B端。
(2)L门专管对寄存器的装入数据的控制,而E门志管由寄存器输出数据的控制。
2.7 控制字是什么意义?试举个例子说明。 答:(1)控制字CON将各个寄存器的L门和E门的按次序排成一列,并且为了避免住处在公共总线中乱窜,规定在某一时钟节拍,只有一个寄存器的L门为高电平,一个寄存器的E门为高电平,从而保证了E门为高电平的寄存器的数据流入到L门为高电平的寄存器中去。 (2)略去,详见教材P31的表2-3
2.8 ROM和RAM各有何特点与用处?
答:ROM是只读存储器,是用以存放固定程序的存储器,一旦程序放进去之后,就不能再改变。也不能再写入新的字节,而只能读出其中所存储的内容; RAM是随机存储器(又称读/写存储器),它与ROM的区别在于它不但能读出存放在其中各个存储单元的数据,而且能够随时写进新的数据,或者改变原有数据。
2.9 为什么要建立“地址”这个概念?
答:因为一个存储器可以包含数以千计的存储单元,可以存储很多数据,为了便于存入和取出,需要对每个存储单元确定一个固定地址。
2.11 译码器有何用处?
答:译码器用来确定存储单元的地址。地址译码器常用于计算机中对存储单元地址的译码,即将一个地址代码转换成一个有效信号,从而选中对应的单元。
2.12 存储地址寄存器(MAR)和存储数据寄存器(MDR)各有何用处? 答:MAR将所要寻找的存储单元的地址暂存下来,以备下一条指令之用。 MDR是将要写入RAM中去的数据暂存起来,以等待控制器发出指令再将数据写入RAM中去。
P33 2,4,5,6,7,8,9,11,12
第3章习题 3.1 略去
3.2 程序计数器PC的内容是什么意义?
答:程序计数器PC存储的内容是指令的地址码。每次运行指令前,先复位到0,每取出执行一条指令,PC加1.
3.3指令寄存器IR从PROM接收到指令字(8位)后的运行过程如何?起什么作用? 答:(1)指令寄存器IR从PROM接收到指令字后,就立即将其高4位送到控制部件。 (2)控制部件经过分析后就发出控制指令,将IR的低4位数送到存储地址寄存器MAR,MAR将此低4位数作为地址并用于访问PROM。
故第1次访问PROM的是其指令区,第2次访问的是其数据区。
3.4 略
3.5 环形计数器有何用处?什么叫环形字? 答:(1)环形计数器用来发出顺序控制信号(即用来发出环形字),从而产生机器节拍。 (2)环形字是其6位输出端依次轮流为高电平,并且是在最位一位(左边第1位)置1后又回到右边第1位,从而形成环形置位。
3.6 什么叫例行程序?什么叫机器周期、取指周期和执行周期?本章简化式计算机的机器周期包括几个时钟周期(机器节拍)?机器周期是否一定是固定不变的? 答:(1)例行程序:由厂家编好的执行每个程序(在本章中即为每条指令)所需要的机器节拍(3个,见P49)
(2)机器周期:执行一条指令的时间。
(3)取指周期:取一条指令所需的3个机器节拍。
(4)执行周期:执行一条指令所需的机器节拍(一般也为3个机器节拍) (5)本章简化式计算机的机器周期包括6个机器节拍。 补充:
机器节拍:即一个时钟周期(时钟一个高电平+一 个低电平)
(6)不一定。只不过固定了在6个节拍完成一个机器周期的计算机被称为固定周期的计算机。
3.7 控制部件包括哪些主要环节?各有何用处? 答:(1)控制部件包括环形计数器、指令译码器、控制矩阵和其他控制电路。 (2)环形计数器用来产生环形字,从而产生机器节拍;
指令译码器:将高四位组成的编码信息译成某一控制线为高电位。 控制矩阵:用来产生控制字CON,即产生所有控制信号。 其他控制电路包含时钟脉冲发生器、运行/停车触发器、“启动”和“清除”按钮。其作用见P54.
3.8 子程序计数器有何用处?
答:也是用来作为一个程序计数器的。 3.9-3.11 略去
3.12 指令寄存器IR是如何将其指令字段和地址字段分送出去的?这两个字段的位数是否保持不变? 答:(1)指令寄存器IR将8位指令字的高4位作为指令字段送到控制部件,而将低4位做为地址字段通过总线送到存储地址寄存器MAR中去。 (2) 对,保持不变。这由制造厂家确定。
第4章习题
4.1 8086CPU与8088CPU有哪些相同之处?又有哪些区别?
答:两者的内部结构基本相同,内部都采用16位字进行操作及存储器寻址,两者的软件完全兼容,程序的执行也完全相同,两种处理器都封装在相同的40脚双列直插组件(DIP)中。
但它们的外部性能有区别。8086是16位数据总线,而8088是8位数据总线,在处理一个16位数据字时,8088需要两步操作而8086只需要一步。
4.2 8086 CPU从功能上分为几部分?各部分由什么组成?各部分的功能是什么? 答:8086CPU从功能上分为总线接口部分BIU和执行部件EU两部分。
其中总线接口部分的功能是负责与存储器、I/O端口传送数据,即BIU管理在存储器中存取程序和数据的实际处理过程。
执行部件EU的功能负责指令的执行。将指令译码并利用内部的寄存器和ALU对数据进行所需的处理。
BIU由4个段寄存器(CS、ES、DS、SS)、16位指令指针寄存器IP、20位的地址加法器和6字节的指令队列组成。
EU由4个通过寄存器(AX、BX、CX、DX)、4个专用寄存器(SI、DI、SP、BP)、标志寄存器FR、算术逻辑部件ALU组成。
4.3 8086 CPU有哪些寄存器组成?各有什么用途?标志寄存器的各标志位在什么情况下置位?
答:8086 CPU由4个通用寄存器(AX、BX、CX、DX)、4个专用寄存器(SI、DI、SP、BP)、标志寄存器FR组成,共9个寄存器。
4个通用寄存器既可作为16位寄存器用,也可作为8位寄存器使用。其中AX寄存器也常称为累加器。其它寄存器的用途见教材。
标志寄存器有6个状态标志(SF、ZF、PF、CF、AF、OF)和3个控制标志位(DF、IF、TF)。
其具体置位见P75的表4-1.
4.4 8086系统中的物理地址是如何得到的?假如CS=2000H,IP=2100H其物理地址应是多少?
答:8086系统中的物理地址是通过BIU中的20位地址加法器得到的。
物理地址计算公式为CS段地址*16(即二进制左移4位,或者十六进制左移1位)+IP偏移地址。
按计算公式,本题中的物理地址为20000H+2100H=22100H。
4.5 什么叫总线周期?8086CPU的一个总线周期包括多少时钟周期,什么情况下要插入TW等待周期?插入多少个TW取决于什么因素?
答:总线周期是CPU或其他总线控制设备访问一次存储器或I/O端口所需的时间。 在总线周期中需要利用总路线。
补充:指令周期:指令周期是机器执行一条指令所需的时间。
8086CPU的一个标准总线周期包括4个时钟周期。当4个时钟周期不能完成所规定的操作时,可以插入一个或多个等待时钟周期TW。
插入多少个TW取决于所访问的存储器或者I/O设备是否准备就绪,此信号由引脚READY发出。
4.6 什么是最大模式?什么是最小模式?用什么方法将8086/8088置为最大模式和最小模式?
答:所谓最小模式,就是在系统中只有8086/8088一个微处理器。
最大模式中,饮包含两个或多个微处理器,其中主处理器是8086/8088,其他处理器是协处理器(如数值运算协处理器8087,输入/输出协处理器8089)。 用硬件方法来决定8086/8088的工作模式,具体是通过引脚MN/MX控制信号引脚来决定,其接+5伏,则为最小模式,接地为最大模式。
4.7 什么是地址锁存器?8086/8088系统中为什么要用地址锁存器?锁存的是什么信息? 答:
(1)地址锁存器就是一个寄存器,它根据控制信号的状态,将总线上的地址代码暂存起来,即用于“锁定”一个(系列)数字状态的电路。
简答:地址锁存器是用来锁存/保存地址的一个寄存器(即一个普通的时序电路),是触发器的原始形式。目的是某次传送数据并不能一次完成所以锁存地址以免CPU重复的传送一个地址。
原理:CPU送地址到锁存器8282/8283之后,内存在地址锁存器中找地址,而不是向CPU要地址。
(2)因为8060/8088系统采用的是地址/数据分时复用总线,即用同一总线传输数据又传输地址,当微处理器与存储器或IO交换信号时,首先由CPU发出存储器地址,同时发出允许锁存ALE给锁存器,当锁存器接到该信号后将地址/数据总线上的地址锁存在总线上,随后才能传输数据。
个人理解:因为在总线周期的前半部分,CPU总是送出地址信号和BHE(总线高允许)信号,为了通知地址已经准备好了,可以被所锁存,CPU会送出高电平允许锁存信号ALE。此时地址信号和BHE信号被锁存。由于有了锁存器对地址信号和BHE信号的锁存,CPU在总线周期的后半部分,地址和数据都在总线上,确保了CPU对锁存器和I/O接口的读/写操作。
(3)锁存的是复用总线上的地址信息。
4.8 8086/8088系统中的8286是什么器件?起什么作用? 答:(1)8286是总线驱动器(又称总线收发器,双向数据缓冲器)。
(2)在一个系统所含的外设接口较多时,它用来增加数据总线的驱动能力。
4.9 8086/8088系统中用时钟发生器8284A产生哪些信号?
答:8284A产生恒定的时钟信号、准备信号(READY)及复位信号(RESET)。
4.10 8086最基本的操作是什么? 答:是总线操作
4.11 8086/8088系统中引入了哪些中断?是如何引入的?
答:8086共有256种类型的中断。从产生中断的方法,可以将其分为硬件中断和软件中断两大类,硬件中断中的非屏蔽中断是通过CPU的NMI引脚进入的,可屏蔽中断是通过CPU的INTR引脚进入的,并且只有当中断允许标志IF为1时,非屏蔽中断才能进入。
软件中断是CPU根据软件中的某条指令或者软件对标志寄存器中某个标志的设置而产生的。
4.12 什么是可屏蔽中断?什么是非屏蔽中断?
可屏蔽中断是指受中断标志IF屏蔽的中断,由INTR引脚进入。 非屏蔽中断是不受中断标志IF屏蔽的中断,由NMI引脚进入。
4.13 什么是中断向量?中断向量表指的是什么?中断向量表放在什么地方? 答:(1)中断向量是中断处理子程序的入口地址,每个中断类型对应一个中断向量。 (2)中断向量表是指在8086/8088微机系统的内存中,专门留出的0段的0000~03FH区域,用于存放所有的256个中断向量。
(3)中断向量表放在0段的0000~03FH区域。
4.14 假如中断类型为8,它的中断服务入口地址是多少?
答:中断类型8*4=32,即十六进制20H,所以其中断服务入口地址为20H.
第5章习题
5.1 分别指出下列指令中的源操作数和目的操作数的寻址方式: (1)MOV SI, 200 ;源操作数为立即数寻址 (2)MOV CX, DATA[SI] ;源操作数为
(3)ADD AX, [BX][DI] ;源操作数为基址加变址的寄存器间接寻址 (4)AND AX, BX 源操作数为寄存器寻址 (5)MOV [SI], AX ;源操作数为寄存器寻址 (6)PUSHF ; 为寄存器寻址
对于目的操作数,前4小题均为寄存器寻址,(5)题为寄存器间接寻址。
5.2 试述指令MOV AX, 2010H 和MOV AX, DS:[2010H]的区别中。 答:前者为将十六进制数2010H送到寄存器AX中去;
后者为将数据段DS中偏移地址为2010H、2011H两单元中的内容送到AX中去。
5.3 写出以下指令中内存操作数的所在地址。 (1)MOV AL, [BX+5]
答:源操作数的地址为[BX+5],默认段寄存器为数据段寄存器DS,又因BX为基址寄存器,所以寻址方式为数据段相对基址寻址; (2)MOV [BP+5], AX 答:目的操作数的地址为[BP+5],默认段寄存器为堆栈段寄存器SS,又因BP为基址寄存器,所以寻址方式为堆栈段相对基址寻址; (3)INC BYTE PTR [SI+3]
答:此句意思为将SI+3所指的存储单元的内容加1;PTR的意义是定义其后的内容变量的新类型为字节属性,具体用法见第7章P159.
内存操作数的地址为[SI+3],属于相对变址寻址; (4)MOV DL, ES: [BX+DI]
答:源操作数为附加段基址加变址的寻址方式; (5)MOV BX, [BX+SI+2]
答:源操作数的内存地址为[BX+SI+2],属于数据段相对基址加变址寻址。
5.4 判断下列指令书写是否正确: (1)MOV AL, BX
答:不对,一个8位,一个16位; (2)MOV AL,CL 答:正确
(3)INC [BX] 答:正确
(4)MOV 5, AL
答:不对,目的操作数不能是立即数。 (5) MOV [BX], [SI]
答:不对,两个存储单元之间不能直接传送数据; (6)MOV BL, F5H 答:正确
(7)MOV DX, 2000H 答:正确
(8)POP CS
答:不对,段寄存器CS和立即数都不能作目的操作数 (9) PUSH CS 答:正确。
注:本部分可以用DEBUG中的-a指令进行调试以确认指令是否正确
5.5 设堆栈指针SP的初值为2000H,AX=3000H,BX=5000H,试问: (1)执行指令PUSH AX 后 SP=?
答:执行PUSH指令时,栈顶指针SP自动减2,所以SP=2000H-2= 1FFE H; (2)再执行PUSH BX 及POP AX后SP=? AX=? BX=?
答:执行PUSH BX 后SP=1FFE H- 2;再执行POP AX后SP=(1FEE H-2)+2=1FFE H; 此时AX中的内容为原BX中的内容,故AX=5000H;
而BX中的内容没有改动,即还是5000H.
5.6 要想完成把[2000H]送 [1000H]中,用指令:
MOV [1000H], [2000H]是否正确 ?如果不正确,应用什么方法? 答:不正确,因为两个存储单元之间不能直接传送数据。可以改为: MOV AX, [2000H] MOV [1000H], AX
5.7 假如想从100中减去AL中的内容,用SUB 100,AL是否正确?如果不正确,应用什么方法?
答:不正确,因为立即数不能做为目的操作数。可以改为: MOV BL, 5AH ; 100的16进制数表达式为5AH SUB BL, AL
5.8 用两种方法写出从88H端口读入信息的指令。再用两种方法写出从42H口输出100H的指令。
答:法一:IN AL, 88H;
法二:MOV DL, 88H IN AL, DL
(2) 法一:MOV AX, 0100H
OUT 42H, AX; 将AX中的内容输出到42H、43H两端口中,其中00H送42H端口中,01H送到43H端口中
法二:MOV AX,0100H MOV DX, 42H OUT DX, AX
5.9 假如AL=20H,BL=10H,当执行CMP AL,BL后,问:
(1)若AL、BL中内容是两个无符号数,比较结果如何?影响哪几个标志位? 答:对无符号数,执行CMP后影响 CF、ZF位。
第一个数AL为: 0002 0000
第二个数BL为:- 0001 0000
0001 0000
故执行后标志为分别为 ZF=0;CF=0;
(2)若AL、BL中内容是两个有符号数,结果又如何?影响哪几个标志位? 答:对有符号数,执行CMP指令后影响ZF和OF标志位,不影响CF位。 执行后标志位分别为ZF=0;OF=0
第6章习题
6.1.读下面程序段,请问:在什么情况下,本段程序的执行结果是AH=0? BEGIN: IN AL,5FH
TEST AL,80H JZ BRCHl MOV AH,0 JMP STOP BRCHl: MOV AH,0FFH STOP: HLT
解答:AL中的最高位为1时。
6.2.读程序:
START: IN AL,20H MOV BL,AL IN AL,30H MOV CL,AL MOV AX,0 ADLOP: ADD AL,BL ADC AH,0 DEC CL JNZ ADLOP HLT 请问: (1)本程序实现什么功能? (2)结果在哪里?
解答:完成20H*30H,结果在AX中。
6.3 请编一程序段完成AX*10的任务(要求不准用乘法指令做) 答:MOV BX,AX MOV CL 2
SHL AX, CL ;此句实现了AX=AX*4 ADD AX,BX ;此句使得AX=5AX
SHL AX ,1 ;此句实现了5AX*2=10AX 法二:MOV BX,AX MOV CL, 4 SHL AX,CL SHL BX,1 ADD AX,BX
6.4.编程序使:
(1)AX寄存器低4位清零。 (2)BX寄存器低4位置“1”。 (3)CX寄存器低4位变反。
(4)用TEST指令测试DL寄存器位3、位6是否同时为0,若是,将0送DL;否则l送DH。 解答 :(1) AND AX ,0FFF0H (2) OR BX ,000FH
(3) XOR CX ,000FH 或者NOT CX(但这样CX的高4位也会变反) (4)TEST DL ,48H JZ LOOP MOV DH,1 HLT
LOOP :MOV DL ,0
HLT
6.5.编一程序段,完成符号函数(-128≤x≤127):
1 (x>0)
y= 0 (x=0) -1 (x<0)
假设x的值存放在DATAl中,y的值存放在DATA2中。 解答: START :MOV AL ,DATA1 AND AL,AL JGE BIGR
MOV AL,81H ;即将-1给AL MOV DATA2,AL HLT
BIGR: JE EQUL ;结果为0,转EQUL MOV AL,1 MOV DATA2,AL HLT
EQUL: MOV AL,O
MOV DATA2,AL
HLT
6.6.设AX寄存器中有一个16位二进制数,编一程序,统计AX中“l”的个数,统计结果送CX中。
解答: START : MOV CX ,0 ;CX清零也可用XOR CX,CX实现 LOOP1: CLC ;CF清零
SUB AX,0 ;此句也可用CMP AX,O替代
JZ STP
SAL AX,1 ;此句也可用SHL AX,1替代 JNC NOD INC CX NOD: JMP LOOP1 STP: HLT 6.7.编一子程序利用XLAT指令把十六进制数转换成ASCII码。假设ASCII码存放在以 DAT1为首地址的数据区中,对应的16进制数放在以DAT2为首地址的数据区中,转换结果送以DAT3为首地址的数据区中。 解答: SUBPROC PROC
SUBPROC :PUSH BX PUSH SI
PUSH DI PUSH CX PUSH AL PUSH DS
START: MOV BX,DATA1 ;将首地址DAT1送到BX中,作为表的首地址 MOV SI ,DAT2 MOV DI DAT3 MOV CX ,16
NEST: LODSB ;读字节串,从地址为SI的RAM读16进制数到AX/AL XLAT ;用换码指令XLAT将AX/AL中的16进制数转换成
;对应的ASCII码
STOSB ;写字节串,从AX/AL写到RAM,即将转换成的ASCII码送
;到目标地址DI处
LOOP NEST ;CX!=0,就转向NEST,SI与DI都会自动增1 POP DS POP AL POP CX POP DI POP SI POP BX RET SUBPROC ENDP 本题重点:(1)所有的串操作指令,如LODSB, STOSB等都用寄存器SI对源操作数进行间接寻址;都用寄存器DI为目的操作数进行间接寻址。 (2)在每次循环后,地址指针SI和DI都会受到修改;
(3)XLAT指令的用法,见教材P118,用BX给定首地址,用AL/AX给定偏移地址,再用XLAT指令转换。
第7章习题
7.2 假设学生某门课程的成绩放在数据区中,请编一程序,统计该成绩中小于60分的人数,60~90分的人数,大于90分的人数,并显示在屏幕上。
答:分析:假设学生成绩放在以DATA1为首地址的数据区中。 DATASEG SEGMENT DATA1 DB 100 DUP (?) STRING1 DB ’The student number of grade is bigger than 90’ STRING2 DB ‘The student number of grade is between 60 and 90’ STRING3 DB ’The student number of grade is less than 90’ DATASEG ENDS SS1 SEGEMENT STACK DW 30 DUP(?) SS1 ENDS CODE SEGMENT ASSUME CS: CODE, DS:DATASEG, SS:SS1 START: MOV AX, DATASEG MOV DS, AX MOV SI, OFFSET DATA1 MOV CL, 100(D); 将学生人数100赋给CL XOR BX, BX XOR AX, AX XOR DX, DX A1: MOV AX, [SI] CMP AX, 90(D) JA L1 CMP AX, 60(D) JAE L2 INC CH ;用CH保存小于60的人数 JUMP A2
L1: INC BH ;用BH保存大于90的人数 JUMP A2
L1: INC BL ;用BL保存60到90的人数 JUMP A2 A2: INC SI LOOP A1
;----------------在屏幕上输出各类人数
MOV DX, OFFSET STRING1
MOV AH, 9 INT 21H MOV DL, CH MOV AH, 2 INT 21H ; ---------输出60-90的学生人数 MOV DX, OFFSET STRING2 MOV AH, 9 MOV DL, BL MOV AH, 2 INT 21H
;----------------输出小于60的学生人数 MOV DX, OFFSET STRING3 MOV AH, 9 MOV DL, BH MOV AH, 2 INT 21H
;----------程序完成,返回操作系统,结束 MOV AH, 4CH INT 21H CODE ENDS END START
第八章习题
8.1 编一初始化程序,使8255A的PC5端输出一个负跳变。如果要求PC5端输出一个负脉冲,则初始化程序又是什么情况? 答:(1)设置PC5为负跳变(从1到0),即设置PC5引脚为0值,其控制字应设置为:0000 1010(即0AH)。
故其初始化程序为:MOV DX, 8255控制端口地址 MOV AL,0AH OUT DX, AL (2)负脉冲为(从0到-1),故其控制字为:0000 1011(即0BH) 故其初始化程序为:MOV DX, 8255控制端口地址 MOV AL,0BH
OUT DX, AL
8.2 设8251A的控制和状态端口地址为52H,数据输入/输出口地址为50H(输出端口未用),输入50个字符,将字符放在BUFFERR所指的内存缓冲区中。请写出这段程序。 答:分析:(1)工作方式选择
本题没有讲清用同步或异步,故可自选,在此选择异步传送,波特率为16,偶校验,停止位为2位;8个数据位。
从而确定工作方式选择字为:1111 1110,即为0FEH; (2)操作命令控制字选择
根据题意,是通过8251A作为输入接口用,从外设输入50个字符到主机的缓冲区,必须允许接收,则其RXE位需置1;而8251A既可作输入、又可作输出接口用,故其控制字中必须设为既允许接收(RXE/D2=1,又允许发送(TXEN/D0=1);但在此既然作为接收器从外设将数据送到CPU,故其请求发送位RTS/D5=0;又因CPU送出数据,故其数据终端准备好信号DTR/D1=0。
由此,推出其工作方式字可设为 00010101,即为15H; (3)初始化程序为: MOV DX,52H
MOV AL,FEH
OUT DX,AL ;以上三句将工作方式选择字送到控制端口52H中 ;-------------------------以下两句设操作命令控制字送送到控制端口中 MOV AL,15H OUT DX,AL
;---------------------------以下对各寄存器进行初始化; MOV DX, 50H ;将数据输入端口号送到DX中; MOV CX,32H ;将传送字节数50(即32H)送到计数寄存器CX MOV DI,OFFSET BUFFER ;将内存缓冲器BUFFER的起始地址送给DI ;---------------------------查询输入端口状态,以确定是否准备好传送数据 BEGIN:IN AL, 52H ;从状态端口52H读入状态字送到AL; TEST AL,02H ;测试其状态位RXRDY是否准备好; JZ BEGIN
;---------------------查询其三个出错校验位是否有问题;
TEST AL, 38H;检测其出错位0011 10000,三个出错标志位分别是帧校验
; 闪出校验和奇偶错标志位;
JZ ERROR IN AL, DX;将输入数据端口号的数据送到AL MOV [DI],AL;将AL中的数据送到内存地址为DI的单元中
INC DI
LOOP BEGIN ;如没错,则再输入下一个字符 JUMP EXIT ;如输入满足80个字符,则结束
ERROR: CALL ERR-0UT ;调出错处理 EXIT:……
8.3设状态端口地址为86H,数据端口地址为87H,外部输入信息准备好状态标志为D7=1,请用查询方式写出读入外部信息的程序段。 答:LOP1: MOV DX, 86H IN AL, DX
;注:8位地址可直接用输入语句,即以上两句可用 IN AL, 86H替换。 TEST AL, 10H JZ LOP1
IN AL, 87H HLT
8.4 设状态端口地址为76H,数据端口地址为75H,外部设备是否准备好信息由D7位传送,D7=1为准备好,D7=0为未准备好(忙),请用查询方式写出:CPU向外部传送数据的程序段。
答: LOP1: IN AL, 76H TEST AL, 10H JZ LOP1 MOV AL, DATA OUT 75H, AL HLT
补充题:
假设8255A的地址为0060~0063H,试编写下列情况的初始化程序:
A组设置为方式1,且端口A作为输入,PC6和PC7作为输出,B组设置为方式1,且端口B作为输入。
答:根据题意,8255A的控制字应为:10110 110(即B6H)
故其初始化程序为: MOV DX, 0063H ;控制端口地址为0063H MOV AL, B6H OUT DX, AL