资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。
某应用系统以8255A作为接口, 采集一组开关S7~S0 的状态, 然后经过一组发光二极管LED7~LED0显示开关状态,(Si闭合, 则对应LEDi亮, Si断开, 则对应的LEDi灭) 电路连接如下图3所示,
1).写出8255四个端口的地址。
2).写出8255工作方式控制字。
3).写出实现给定功能的汇编语言程序。
1) A口、 B口、 C口和控制口的地址分别是
330H、 331H、 332H和333H。
2) A口工作在方式0输入, B口工作在方式0输出, C口空闲, 因此其控制字是10010000b=90H
3) 程序如下:
MOV AL, 90H ;置方式字
MOV DX, 333H ;置控制端口地址
OUT DX, AL
L1: MOV DX, 331H ;置B口地址
IN AL, DX ;读开关状态( 1断, 0通)
NOT AL ;状态取反
MOV DX, 330H ;置A口地址
OUT DX, AL ;输出( 1亮, 0灭)
JMP L1
四、 以下为8088系统中以8255A 为输入设备和输出设备的查询方式接口电路的部分硬件图。( 18分)
1、 试述8088CPU和输入设备进行数据传送的工作过程。( 6分)
输入设备要将数据传送给CPU时, 先将数据输出给8255A的PA0-PA7, 然后经过ACK端输出脉冲信号将数据锁存于锁存器, 同时将触发器置1。 而CPU要不断查询设备的状态, 执行读8255A C口操作, 判断从C口读入数据的D1位是1还是0, 若为0表示设备未准备好, 则等待后再查询; 若为1表示设备已将数据送出, CPU 从 8255A的 A口读入数据, 然后经过PC 6输出负脉冲将状态触发器清0。之后重复以上的操作, 周而复始。
2、 以下是8088CPU将存于以BLOCK为首址的内存单元区域中100个数据依次传送给输出设备的程序段, 请在划线处填入内容。
BLOCK DB a1,a2,……a100
COUNT EQU $-BLOCK
START: LEA SI, BLOCK ; 置数据单元首址指针
MOV CX , COUNT
MOV DX, 383H ; 8255A初始化设置
MOV AL, 91H
OUT DX, AL
MOV DX, 383H ; 置PC7为低电平
MOV AL, 0EH
OUT DX, AL
AGAIN: MOV DX, 382H ; 查询输出设备状态
IN AL, DX
TEST AL, 04H
JNZ AGAIN
MOV AL, [SI] ; 取数据传送给输出设备
INC SI
MOV DX, 381H
OUT DX, AL
MOV DX, 383H ; 置PC7产生高电平
MOV AL, 0FH
OUT DX, AL
NOP
NOP
MOV AL, 0EH ; 置PC7为低电平
OUT DX, AL
LOOP AGAIN
RET
8255A方式控制字 8255A C口复位/置位控制字
1 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 D3 D2 D1 D0
A口方式
00 方式0 A口 C口下半口
01 方式1 0 输出 0 输出 000 PC0 0复位
1× 方式2 1 输入 1 输入 001 PC1 1 置位
B口 010 PC2
C口上半口 B口方式 0 输出 ∶ ∶
0 输出 0 方式0 1 输入 111 PC7
1 输入 1 方式1
五、 分析以下汇编语言源程序, 根据要求在划线处填上适当内容:
DATA SEGMENT AT H
ORG 0100H
TABLE DB 66, 76, 87, 89, 96, 79, 64, 62, 57, 49, 85, 75, 60, 77, 58
COUNT EQU $-TABLE
NUM1 DB 0
NUM2 DB 0
NUM3 DB 0
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
TOP DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA, SS: STACK
MAIN : MOV AX, DATA
MOV DS, AX
MOV SI, OFFSET TABLE
MOV CX, COUNT
LOP1: MOV AL, [SI]
CMP AL, 85
JA HIGH
CMP AL, 70
JBE LOW
INC NUM2
JMP NEXT
HIGH: INC NUM1
JMP NEXT
LOW: INC NUM3
NEXT: INC SI
LOOP LOP1
MOV AH, 4CH
INT 21H
CODE ENDS
END MAIN
(1) 画出数据段中数据定义语句实现的内存分配图。
(2) 执行程序后, 结果为:
OFFSET TABLE = 0100H , SEGMENT NUM2 = H ,
AL= 58 (3AH) , DS= H , CX= 0 ,
( 6H)= 64 (40H) , ( FH)= 03H , ( 1H)= 07H ,
在以BLOCK为首址的内存区域中, 存放着一组无符号的字节数据, 数据个数存于COUNT单元中, 试编制程序段从中找出最大数和最小数, 并分别存放于MAX和MIN单元中。
程序段为:
BLOCK DB a1,a2, ┉ an
COUNT DB N
MAX DB 0
MIN DB FFH
LEA SI, BLOCK
MOV CX, COUNT
AGAIN: MOV AL, [SI]
CMP AL, MAX
JBE NEXT1
MOV MAX, AL
NEXT1: CMP AL, MIN
JAE NEXT2
MOV MIN, AL
NEXT2: INC SI
LOOP AGAIN
HLT
在数据段中从0500H单元开始存放着100个带符号数(16位), 要求把其中的正数传送至1000H开始的存储区; 负数传送至1100H开始的存储区, 且分别统计正数和负数的个数, 并将正数和负数的个数分别存入1200H和1201H单元中。(要求: 写出完整程序并画出流程图)
DATA SEGMENT
ORG 0500H
N0 DW X1, X2, …, X100 ; 自定义100个带符号数
COUNT EQU $-BUFFER/2
N1 DW 1000H ; 保存正数
N2 DW 1100H ; 保存负数
N3 EQU 1200H ; 保存个数
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
MAIN PROC
START: MOV AX, DATA
MOV DS, AX
MOV CX, COUNT
XOR DX,DX
LEA SI,N0 ; 首地址→SI
LEA BX,N1
LEA DI,N2
AGAIN: MOV AX, [SI]
AND AX,AX
JS NEXT1 ; 负转
MOV [BX],AX
INC DH
INC BX
INC BX
JMP NEXT2
NEXT1: MOV [DI],AX
INC DI
INC DI
INC DL
NEXT2: LOOP AGAIN ; 循环
MOV N3, DX ; N3←存正、 负数个数
MOV AH, 4CH
INT 21H ; 返回DOS
MAIN ENDP
CODE ENDS
END START
六. 接口题: 某8255的A口、 B口连接八个LED显示器(如图所示, 共阴极), 请设计一程序, 使这八个LED显示器DG0~DG7分别循环显示0~7, 每个LED每次只显示一秒钟(有1秒钟延时子程序”D1STIME”可调用)。(15分)
8255A工作方式控制字如下∶
D7
D6
D5
D4
D3
D2
D1
D0
特征位
A组方式
A口
C4~7
B组方式
B口
C0~3
LED数码管段码表( 共阴)
p g f e d c b a
TAB 0
0 0 1 1 1 1 1 1
1
0 0 0 0 0 1 1 0
2
0 1 0 1 1 1 0 1
3
0 1 0 0 1 1 1 1
4
0 1 1 0 0 1 1 0
5
0 1 1 0 1 1 0 1
6
0 1 1 1 1 1 0 1
7
0 0 0 0 0 1 1 1
8
0 1 1 1 1 1 1 1
9
0 1 1 0 0 1 1 1
……
MOV DX,30FH
MOV AL,80H
OUT DX,AL
L1: MOV CX,8
LEA SI,TAB
MOV BL,0FEH
L2: MOV AL,[SI]
MOV DX,30CH
OUT DX,AL
MOV AL,BL
MOV DX,30DH
OUT DX,AL
CALL D1STIME
INC SI
ROL BL
LOOP L2
JMP L1
HLT
五、 ( 15分) 已知某8255A在系统中占用88~8BH号端口地址, 现欲安排其PA, PB, PC口全部为输出, PA, PB口均工作于方式0模式, 并将PC6置位, 使PC3复位, 试编写出相应的初始化程序。
五、 MOV AL, 80H
OUT 8BH, AL
MOV AL, ODH
OUT 8BH, AL
MOV AL, 06H
OUT 8BH, AL
四、 ( 15分) 用其它指令完成和下列指令一样的功能:
(1) REP MOVSB (2) REP LODSB (3) REP STOSB (4) REP SCASB
(1) LOOP1:
MOV AL,BYTE PTR [SI]
MOV ES:BYTE PTR [DI], AL
INC SI 或: DEC SI
INC DI 或: DEC DI
LOOP LOOP1
(2) LOOP1:
MOV AL, BYTE PTR [SI]
INC SI 或: DEC SI
LOOP LOOP1
(3) LOOP1:
MOV ES:BYTE PTR [DI], AL
INC DI 或: DEC DI
LOOP LOOP1
(4) LOOP1:
CMP AL,ES:BYTE PTR [DI]
JE EXIT
INC DI 或: DEC DI
LOOP LOOP1
EXIT:
五、 ( 15分) 根据下列要求编写一个汇编语言程序::
代码段的段名为COD_SG
数据段的段名为DAT_SG
堆栈段的段名为STK_SG
变量HIGH_DAT所包含的数据为95
将变量HIGH_DAT装入寄存器AH, BH和DL
程序运行的入口地址为START
DAT_SG SEGEMNT
HIGH_DAT DB 95
DAT_SG ENDS;
STK_SG SEGMENT
DW 64 DUP(?)
STK_SG ENDS;
COD_SG SEGMENT
MAIN PROC FAR
ASSUME CS: COD_SG, DS: DAT_SG, SS: STK_SG
START: MOV AX, DAT-SG
MOV DS, AX
MOV AH, HIGH_DAT
MOV BH, AH
MOV DL, AH
MOV AH, 4CH
INT 21H
MAIN ENDP
COD_SG ENDS
END START
在1000H和1064H单元开始, 放有各为100字节的组合后的BCD数( 地址最低处放的是最低位字节) , 求它们的和, 且把和放在1100H开始的单元中。(要求写出完整程序)
DATA SEGMENT
ORG 1000H
STRING1 DB nn, nn, …
STRING2 DB nn, nn, …
COUNT EQU $-STRI NG2
RESUT DB 101 DUP ( )
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(? )
STACK ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA, SS: STACK
BEGIN: MOV AX, DATA
MOV DS, AX
MOV CX, COUNT ; (100)
LEA SI, STRING1 ; (1000H)
XOR AX, AX
AGAIN: MOV AL, [SI]
ADC AL, [SI+64H]
DAA
MOV [SI+100H], AL
INC SI
LOOP AGAIN
JNC END1
MOV [SI+100H], 1
END1: MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN
展开阅读全文