1、程序设计题1、统计从 01000H 内存单元开始的 100 个字(WORD)型带符号数中的正数,负数和零的字(WORD)个数?解:设正数个数存放于 BX 中,负数个数存放于 DI 中,零的个数存放于 DX 中MOV AX,0100H JZ ZEROMOV DS,AX JL NEGATMOV BX,0 INC BXMOV DX,0 JMP NEXT1MOV DI,0 ZERO: INC DXMOV SI,0 JMP NEXT1MOV CX,100 NEGAT: INC DINEXT: MOV AX,SI NEXT1: ADD SI,2CMP AX,0 LOOP NEXT2、实现两个十六位二进制的
2、加法,要求加数放在 FIRST 开始单元,被加数放在SECOND 开始单元,和数放在 SUM 单元解:MOV AX, FIRSTADD AX, SECONDMOV SUM, AX3 从 BUFF 单元起有一个字符串(长度小于 65535),以*结束,编写一个完整程序求该字符串长度存入 LENT 单元,并统计字符串中含有大写英文字符的个数并存入 COUNT 单元。要求源程序具备必要的伪指令和段说明。1 DATA SEGMENT INC CXBUFF DB ABCD.* CMP AL,ALENT DW ? JC NEXTCOUNT DW ? CMP AL,ZDATA ENDS JNC NEXTCO
3、DE SEGMENT INC DXASSUME CS:CODE,DS:DATANEXT: INC BXSTART:MOV AX,DATA JMP LPMOV DS,AX DONE: INC CXLEA BX,BUFF MOV LENT,CXMOV CX,0 MOV COUNT,DXMOV DX,0 MOV AH,4CHLP: MOV AL,BX INT 21HCMP AL,* CODE ENDSJZ DONE END START4有一带符号 8 位数 X 存于 DAT 单元编一个程序段判断该数,若 x 小于 0 则将 0FFH 送 MARK 单元;若 X 等于 0 则将 MARK+1 单元置
4、0FFH;若 X 大于 0 则置MARK+2 单元为 0FFH。MOV AL,DAT JMP DONEAND AL,AL LPl: MOV MARK,0FFHJS LP1 JMP DONEJZ LP2 LP2: MOV MARK+1,0FFHMOV MARK+2,0FFH DONE: HLT5已知有 X、Y、Z 三个字变量,存放无符号整数,请编一个完整的程序实现公式 Z=(X+Y)/(X-Y+600) (不考虑溢出情况) 。DSEG SEGMENT SUB BX,YX DW ? ADD BX,600Y DW ? MOV AX,XZ DW ? ADD AX,YDSEG ENDS MOV DX,0
5、CSEG SEGMENT DIV BXASSUME CS:CSEG,DS:DSEG MOV Z,AXMAIN PROC FAR MOV AH,4CHBEGIN: MOV AX,DSEG INT 21HMOV DS,AX MAIN ENDPMOV BX,X CSEG ENDSEND BEGIN6AX 寄存器中存放着 4 位十六进制数。试编写一个汇编语言程序,将这 4 位十六进制数分别转换为相应的 ASCII 码,并依次存放到 RESULT 数组的 4 个字节中去,要求用调用子程序的方法实现。CODE SEGMENT HASC PROC NEARASSUME CS:CODE,DS:CODE MOV
6、 DL,ALSTART: MOV BX,CODE AND DL,0FHMOV DS,BX CMP DL,9MOV CL,4 JA L2MOV BL,4 ADD DL,30HMOV SI,OFFSET RESULT L1:RETLP:CALL HASC L2:ADD DL,37HMOV SI,DL JMP L1INC SI HASC ENDPSHR AX,CL RESULT DB 4 DUP(?)DEC BL CODE ENDSJNZ LP END STARTEXIT: MOV AH,4CHINT 21H7写出对存放在 DX 和 AX 中的双字长数求补的指令序列。方法 1 方法 2 方法 3MO
7、V CX,0 NOT AX NEG DXSUB CX,AX NOT DX NEG AXMOV AX,CX ADD AX,1 SBB DX,0MOV CX, 0 ADC DX,0SBB CX, DXMOV DX, CX8设有两个等长字符串。试编写一个汇编语言程序,比较它们是否完全相同;若相同,则将字符“Y“送入 AL 中,否则,将字符“N“送入 AL 中。CODE SEGMENT REPE CMPSBASSUME CS:CODE,DS:CODE JNZ NESTART: MOV AX,CODE MOV AL,YMOV DS,AX JMP EXITMOV ES,AX NE: MOV AL,NCLD
8、 EXIT: MOV AH,4CHLEA SI,STRING1 INT 21HLEA DI,STRING2 STRING1 DBMOV CX,DI STRING2 DBSUB CX,SI CODE ENDSXOR AX,AX END START9写出程序段,把 DX,AX 中的双字右移四位。MOV CL,4 SHR DX,CLSHR AX,CL SHL BL,CLMOV BL,DL OR AH,BL9编写一个完整的 8086 汇编语言程序,从附加段中首地址为 ADR1(变量名)连续存放的 100 个字型无符号整数中找出最大数,并将此数及其偏移地址分别放入变量 MAX 和 MAXM 中DATA
9、SEGMENT MOV AX,ES:SIADR1 DW 100 DUP(?) LOP1: CMP AX,ES:SIMAX DW ? JAE LOP3MAXM DW ? MOV AX,ES:SIDATA ENDS MOV ES:MAXM,SICODE SEGMENT LOP3: ADD SI,2ASSUME CS:CODE,DS:DATA,ES:DATALOOP LOP1MAIN PROC FAR MOV ES:MAX,AXMOV AX,DATA MOV AH,4CHMOV ES,AX INT 21HMOV SI,OFFSET ADR1 MAIN ENDPMOV CX,100 CODE ENDS
10、MOV ES:MAXM,SI END MAIN10已知(AX)=4BD5H,统计 AX 中 1 的个数和 0 的个数,并分别放在 BL 和 DL 中。编写程序段实现该功能。MOV AX,4BD5H INC DLMOV BL,0 JMP L3MOV DL,0 L2: INC BLMOV CX,16 L3: LOOP L1L1: SHL AX,1 HLTJC L211有一个首地址为 ARRAY 的 N 个字的数组,请编程序使该数组中的数按照从大到小的次序排序。 (采用冒泡排序算法)DATA SEGMENT MOV BX,0ARRAY DW A1,A2,A3,AN LOOP2: MOV AX,ARR
11、AYBXDATA ENDS CMP AX,ARRAYBX+2PROG SEGMENT JGE CONTINUEASSUME DS:PROG,DS:DATA XCHG AX,ARRAYBX+2MAIN PROC FAR MOV ARRAYBX,AXSTART: PUSH DS CONTINUE: ADD BX,2SUB AX,AX LOOP LOOP2PUSH AX MOV CX,DIMOV AX,DATA LOOP LOOP1MOV DS,AX RETMOV CX,N MAIN ENDPDEC CX PROG ENDSLOOP1: MOV DI,CX END START存储器设计应用题1已知有
12、 SRAM 芯片 62256(32K8)及 EPROM 芯片 27256(32K8) ,现用这两种芯片构成 8088 最小系统内存的一部分,其中 SRAM 所占的地址空间为40000H-47FFFH,EPROM 所占的地址空间为 F8000H-FFFFFH,试设计出其原理图。2给8088CPU 系 统扩展 32K 的 ROM,且所选用的存储器芯片为 8K8,地址译码器为74LS138,ROM 的地址范围从 60000H存储器芯片为 8K8,可知芯片容量为8K,地址线为 13 条,数据线为 8 条,而系统要求容量为 32K,位数是 8,因此为字扩展。需要的芯片为 4 个 存储器芯片的地址为:1)
13、 、地址译码器:3 个输入端的信号中必须有:A13,A14,其对应的位置不同,输出的引脚也不同。只要输入信号与输出信号一致,且连接到相应的存储器芯片上 。2) 、数据线连接正确3) 、地址线连接正确 67FFFH,要求写出每一个存储器芯片的地址范围,画出逻辑连线图。3设某系统的 CPU 有 16 根地址线 A15-A0、8 根数据线 D7-D0。现需扩展 6KB的 ROM,地址范围为:0000H-17FFH,采用 2716 芯片。(1) 请写出存储器器件 2716 的数据线和地址线的条数;(2)计算 ROM 的芯片数量;(3)设计存储器扩展原理图,并写出每片 ROM 的地址范围。1)存储器 2
14、716 的数据线有 8 条,地址线有 11 条。2)因为 2716 的容量为 2KB,要扩展 6KB,所以需要三片。3)原理图如下:4已知 RAM 芯片结构如图所示,回答下列问题:1) 该芯片容量为多少?若要求构成一个 2K8 的 RAM 阵列,需几个这样的芯片?42) 若 RAM 阵列组的起始地址为 E1000H,画出存储器系统与 8086 的电路连接图(8086 工作在最小模式) ,并写出每组 RAM 芯片的地址空间。3) 编程:将缓冲区中的 10 个数据写进 E1000 开始的 10 个单元中,并说明如何查看结果? MOV AX,0E100H MOV CX,10MOV ES,AX CLD
15、MOV SI,OFFSET BUF REP MOVSBMOV DI,O查看结果 D E100:05设某微机系统需要扩展内存 RAM 32KB,扩充的存储器空间为 10000H 开始的连续存储区域。存储器芯片采用 16K8 的 RAM 芯片,CPU 使用 8088。1)选用芯片,画出逻辑连接图;2)写出各片 RAM 的所在地址区域。答案:2) 地址范围 第一片 10000H-13FFFH第二片 14000H-17FFFH6用 4K4 的 EPROM 存储器芯片组成一个 16K8 的只读存储器。试问:(1)该只读存储器的数据线和地址线的位数。(2)根据题意需要多少个 4K4 的 EPROM 芯片?
16、(3)画出此存储器的组成框图。答案: (1)该存储器有 14 位地址线和 8 位数据线。(2)共需总芯片数为 8 片。8255 编程题1.一个 8088 系统中有一 8255A,8255A 各口设置如下:A 组与 B 组均工作于方式 0,A 口为数输入,B 口为输出,C 口高位部分为输出,低位部分为输入,A口地址设为 40H。1) 写出工作方式控制字2) 对 8255A 初始化3) 从 A 口输入数据,将其取反后从 B 口送出1)10010001B 即 91H 2) MOV AL,91H; OUT 43H,AL3)IN AL,40H; NOT AL; OUT 41H,AL2.设 8255A 的
17、 4 个寻址地址号为 0060H0063H,试编写下列各种情况下的初始化程序。1) 将 A 组和 B 组设置成方式 0,A 口,B 口为输入,C 口为输出。2) 将 A 组工作方式设置成方式 2,B 组为方式 1,B 口作为输出。3) 将 A 口,B 口均设置成方式 1,均为输入,PC6 和 PC1 为输出.4) A 口工作在方式 1,输入;B 口工作在方式 0,输出;C 口高 4 位配合 A 口工作,低 4 位为输入。1) MOV AL,92H 2) MOV AL,0C4H 3) MOV AL,0B6H 4) MOV AL,0B1HOUT 63H,AL OUT 63H,AL OUT 63H,
18、AL OUT 63H,AL3. 8255A 控制字如下,8255A 端口地址为:160H、162H、164H、166H,端口 A方式 0 输出,端口 B 方式 0 输入,端口 C 方式 0 输出。编写程序实现初始化,并将端口 B 内容的 2 倍与端口 C 的内容求和后将结果取反送到端口 A。根据端口地址知,端口 A 地址为:160H,端口 B 地址为:162H,端口 C 地址为:164H,控制端口地址为:166H。端口 A 方式 0 输出,端口 B 方式 0 输入,端口C 方式 0 输入知:控制字 8BH。MOV AL, 8BH MOV DX, 164H MOV DX, 0166H IN AL
19、, DX OUT DX, AL ADD AL, BLMOV DX, 0162H NOT AL IN AL, DX MOV DX, 0160HMOV BL, AL OUT DX, AL ADD BL, AL 4 用一片 8255 A 芯片设计一基于 PC 系统总线的 I/O 接口板,要求:1)8255A 占用的端口地址为 300H-306H,画出原理图。2)设 8255A 的 PA、PB、PC 口均工作在方式 0,PA 口为输入,PB、PC 口均为输出,编写 8255 的初始化程序片段(已知 8255A 控制字为 10010000B) 。3)编写程序片段,将从 PA 口读入的状态送至 PB 口输
20、出。(2)MOV DX, 306H MOV AL, 90HOUT DX, AL3) MOV DX, 300HIN AL, DXMOV DX, 302HOUT DX, AL 5.已知 8255 的控制口地址为 236H,开关信息接在 PB 口,发光二极管接在 PA口,使用 8255 作为接口芯片,读开关量的状态,并用发光二极管显示输出。在将开关的信息存放在 FIRST 单元的同时,发光二极管完成其信息的显示。要求画出完整的线路连接图并设计相应的程序。 (8086 工作在最小模式,8255A 相应的控制字为 82H) 。MOV DX, 236H MOV AL, 82H OUT DX, AL MOV
21、 AX, SEG FIRST MOV DS, AX MOV SI, OFFSET FIRST LOP: MOV DX, 232HIN AL, DXMOV SI, ALMOV DX, 230HOUT DX, A LJMP LOP6 8255A 的工作方式控制字和 C 口的按位置位/复位控制字有何差别?若将C 口的 PC2 引脚输出高电平(置位) ,假设 8255A 控制口地址是 303H,程序段应是怎样的?答:工作方式控制字的最高位为 1,而 C 口的按位置位/复位控制字最高位为 0MOV DX,303HMOV AL,80HOUT DX,ALMOV AL,05HOUT DX,AL7 已知 825
22、5A 的控制口地址为 236H,LED 采用共阳级接法。字型信息接在 PB 口,字位信息接在 PA 口,使用 8255A 作为接口芯片,在两块 LED 上显示自己的学号。要求画出完整的线路连接图并设计相应的程序(8086 工作在最小模式,8255A相应控制字为 80H) 。答案:见图MOV DX,236H LOP: LOOP LOPMOV AL,80H MOV DX,232HOUT DX,AL MOV AL,nn ;学号高位MOV CX,000H OUT DX,ALSTART:MOV DX,232H MOV AL,2MOV AL,nn ; 学号低位 MOV DX,230HOUT DX,AL O
23、UT DX,ALMOV AL,1 LOP1:LOOP LOP1MOV DX,230H JMP STARTOUT DX,AL8.若打印机及其工作时序如图所示,当打印机不忙时(BUSY=0),向它送数据(设每次只传送 1 个字节)并在数据稳定时用 负脉冲将数据存于打印机内部,同时设置打印机忙信号,即 BUSY =1。1)用可编程接口芯片 8255A 将打印机与总线相连接起来。若规定8255A 的地址为 0320H032FH 任选,试画出连接电路图。2)数据段中首地址为 BUFFER 的区域中存放着 100 字节要打印的字符,试编写包括 8255A 初始化的打印程序,并将 100 个字符打印出来。9
24、.在一个系统中,8255A 的四个端口地址分别为:420H、422H、424H 和 426H。要求:1)初始化 8255A,使端口 A、B、C 均工作于方式 0,端口 A 作为输入端口,端口 B 和 C 作为输出端口。2)将端口 A 输入的信息取反后直接输出到端口 B。3)检测端口 A 输入的信息的 PA7 位。当 PA7=1 时,端口 C 输出 FFH,否则,输出 00H。请编写程序段,完成上述功能(程序要加注解) 。答案: 1) MOV AL,90HMOV DX,426HOUT DX,AL2) MOV DX,420HIN AL,DXMOV DX,422HNOT ALOUT DX,AL3)
25、MOV DX,420H ;从端口 A 输入信息IN AL,DX TEST AL,80H ;测试 PA7 是否为 0MOV AL,0JZ KO ;如果为 0,输出 0MOV AL,0FFH ;否则输出 0FFHKO:MOV DX,424H ;端口 C 的地址OUT DX,AL8253 编程题1 设 8253A 三个计数器的端口地址为 100H、101H、102H,控制寄存器端口地址 103H。输入时钟为 2MHz,让 1 号通道周期性的发出方波,其周期为 1ms,试编写初化程序段。答: 要输出脉冲周期为 1ms,输出脉冲的频率是 ,当输入时钟3310频率为 2MHz 时,计数器初值是 。2013
26、使用计数器 1,先加载低 8 位,后加载高 8 位,设为方式 3,二进制计数,控制字是 76H。设控制口的地址是 103H,计数器 1 的地址是 101H。程序段如下:MOV DX,103H MOV AX,2000MOV AL,76H OUT DX,ALOUT DX,AL MOV AL,AHMOV DX,101H OUT DX,AL2某系统中 8253 芯片的通道 0 至通道 2 和控制端口的地址分别为0FFF0H0FFF6H,定义通道 0 工作在方式 2,CLK0=2MHz,要求输出 OUT0 为 1KHz的速率波;定义通道 1 工作方式 0,其 CLK1 输入外部计数事件,每计满 1000
27、个向 CPU 发出中断请求。试写出 8253 通道 0 和通道 1 的初始化程序。MOV DX,0FFF6H MOV DX,0FFF6HMOV AL,35H MOV AL,61HOUT DX,AL OUT DX,ALMOV AX,2000H MOV AL,10HMOV DX,0FFF0H MOV DX,0FFF2HOUT DX,AL OUT DX,ALMOV AL,AHOUT DX,AL3. 若要采用一片 8253 产生近似为 1Hz 的对称方波,已知时钟频率为2MHz,8253 地址为 350-353H,试编写 8253 初始化程序,并说明通道引脚的连接方法。答案: 时钟频率为 2MHz,要
28、分频至 1Hz,分频系数为 2000000。一个8253 的计数器分频系数最大为 65536,所以必须用两个计数器串联起来工作。即将 2MHz 的时钟连接到 0#计数器的输入端 CLK0,OUT0 连接到 CLK1,1Hz 的对称方波由 1#计数器的输出端 OUT1 输出。设 0#计数器分频系数定为 10000,则OUT0 输出 200Hz 波形。1#计数器分频系数定为 200。0#计数器输出的 200Hz 波形作为 1#计数器的时钟信号,经 1#计数器 200 分频后得到 1Hz 的波形。两个计数器均初始化为方式 3,初始化程序如下:MOV DX,353H OUT DX,ALMOV AL,37H OUT DX,ALOUT DX,AL INC DXMOV AL,77H MOV AL,00HOUT DX,AL OUT DX,ALSUB DX,3 MOV AL,02HMOV AL,00H OUT DX,AL