117 4G+ 65 12:12 $/4 《微机原理与接口技术》实验指导 书--2021版.doc ; 端口B工作在方式1并作为输入口 ;============================= ========= IOYO EQU 0600H ;片选IOYO对应的端口始地址 MY8255_A EQU IOY0+00H2 ;8255 的A口地址 MY8255_B EQU IOY0+01H2 ;8255的B口地址 MY8255 C ;8255的C口地址 EQU IOY0+02H2 MY8255_MODE EQU IOY0+03H2 ;8255 的控制寄存器地址 STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE START:MOV DX,MY8255_MODE ;初始化8255 工作方式 MOV AL,86H ;工作方式1.A口输出,B口输入 OUT DX,AL MOV DX,MY8255_MODE ;C口 PC2置位 MOV AL,05H OUT DX,AL PUSH DS 19 19 安徽建筑大学电子与信息工程学院 MOV AX, 0000H MOV DS, AX MOV AX, OFFSET MIR7 ;取中断入口地址 MOV SI, 003CH ;中断矢量地址 ;填 IRQ7 的偏移矢量 MOV [SI], AX MOV AX, CS ;段地址 ;填IRQ7的段地址矢量 MOV SI, 003EH MOV [SI], AX CLI POP DS ;初始化主片 8259 MOV AL, 11H OUT 20H, AL ;ICW1 MOV AL, 08H OUT 21H, AL ;ICW2 MOV AL, 04H OUT 21H, AL ;ICW3 MOV AL, 01H OUT 21H, AL ;ICW4 MOV AL, 6FH ;OCW1 OUT 21H, AL AA1: STI NOP JMP AA1 ;读B口 写A口 MIR7:PUSH AX MOV DX,MY8255_B IN AL,DX MOV DX,MY8255_A OUT DX,AL MOV AL,20H OUT 20H,AL POP AX IRET DELAY:PUSH CX MOV CX, OFO0H AAO: PUSH AX POP AX LOOP AAO POP CX RET CODE ENDS END START修改这个代码让它能输出中断次数
时间: 2024-01-13 10:05:00 浏览: 258
微机原理及接口技术实验指导书样本.doc
下面是修改后的代码,增加了中断处理函数和一个计数器变量intCount,每次中断发生时就将中断次数加1并输出:
```
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
intCount DW 0 ; 中断次数计数器
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AX, @DATA ; 初始化数据段寄存器
MOV DS, AX
MOV DX, MY8255_MODE ; 初始化8255 工作方式
MOV AL, 86H ; 工作方式1.A口输出,B口输入
OUT DX, AL
MOV DX, MY8255_MODE ; C口 PC2置位
MOV AL, 05H
OUT DX, AL
MOV AX, 0000H
MOV DS, AX
MOV AX, OFFSET MIR7 ; 取中断入口地址
MOV SI, 003CH ; 中断矢量地址
; 填 IRQ7 的偏移矢量
MOV [SI], AX
MOV AX, CS ; 段地址
; 填 IRQ7 的段地址矢量
MOV SI, 003EH
MOV [SI], AX
CLI ; 关闭中断
POP DS ; 初始化主片 8259
MOV AL, 11H ; ICW1
OUT 20H, AL
MOV AL, 08H ; ICW2
OUT 21H, AL
MOV AL, 04H ; ICW3
OUT 21H, AL
MOV AL, 01H ; ICW4
OUT 21H, AL
MOV AL, 6FH ; OCW1
OUT 21H, AL
; 中断处理函数
MIR7:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
INC intCount ; 中断次数加1
MOV BX, intCount ; 将中断次数存入BX寄存器
MOV CX, 10 ; 将计数器转换为十进制
CALL BCD
MOV DL, [BX+2] ; 输出十位数字
ADD DL, 30H ; 转换为ASCII码
MOV AH, 02H ; 调用DOS中断21H,输出字符
INT 21H
MOV DL, [BX+1] ; 输出个位数字
ADD DL, 30H ; 转换为ASCII码
INT 21H
MOV DL, [BX] ; 输出次数
ADD DL, 30H ; 转换为ASCII码
INT 21H
MOV DL, ' '
INT 21H
POP DX
POP CX
POP BX
POP AX
IRET ; 中断返回
; BCD转换函数
BCD PROC NEAR
PUSH AX
PUSH BX
MOV BX, SP
MOV AX, [BX+4] ; 将计数器存入AX寄存器
MOV BX, 10
DIV BX ; 将计数器除以10
MOV [BX+2], AH ; 余数存入BX+2中,即十位数字
MOV [BX+1], AL ; 商存入BX+1中,即个位数字
MOV AL, AH ; 将余数存回AX中
MOV AH, 0
MOV BX, 10
DIV BX ; 将余数除以10,得到次数
MOV [BX], AL
POP BX
POP AX
RET
BCD ENDP
AA1:
STI
NOP
JMP AA1 ; 读B口 写A口
DELAY:
PUSH CX
MOV CX, 0FO0H
AAO:
PUSH AX
POP AX
LOOP AAO
POP CX
RET
CODE ENDS
END START
```
注意,输出中断次数的代码是在中断处理函数MIR7中编写的,其中还包括了一个BCD转换函数,用于将计数器变量转换为十进制数并输出。
阅读全文