mov dx, ;8259奇地址,设置ICW4 mov al, ;自动清除中断,8086CPU out dx,al mov dx, ;设置OCW1 mov al,00h ;OCW1, 开放所有中断 out dx,al
时间: 2024-01-24 18:03:55 浏览: 47
在这段代码中,缺少了一些操作数,需要根据上下文补充完整。补全后的代码如下:
mov dx, 21h ;8259奇地址,设置ICW4
mov al, 1 ;自动清除中断,8086CPU
out dx,al
mov dx, 21h ;设置OCW1
mov al, 0FFh ;OCW1, 开放所有中断
out dx,al
相关问题
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修改这个代码让它能输出中断次数
下面是修改后的代码,增加了中断处理函数和一个计数器变量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转换函数,用于将计数器变量转换为十进制数并输出。
请帮我在下面程序成添加一段8259a芯片的中断代码stack segment sta db 100dup(0) top1 equ 100 stack ends data segment data ends code segment assume cs:code,ss:stack,ds:data iocon equ 8006h ioa equ 8000h iob equ 8002h ioc equ 8004h start: ; set segment registers: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov ax,top1 mov sp,ax mov al,90h mov dx,iocon out dx,al nop nop test_bu: mov dx,ioa in al,dx mov dx,ioa in al,dx nop test_1: test al,01h je mot1 test_2: test al,02h je mot2 test_3: test al,04h je mot3 jmp test_bu mot1: mov al,0feh mov dx,iob out dx,al mov dx,ioa in al,dx test al,02h je mot2 test al ,04h je mot3 jmp mot1 mot2: mov al,0fdh mov dx,iob out dx,al mov dx,ioa in al,dx test al,01h je mot1 test al ,04h je mot3 jmp mot2 mot3: mov al,0ffh mov dx,iob out dx,al mov dx,ioa in al,dx test al,01h je mot1 test al ,02h je mot2 jmp mot3 code ends end start ; set entry point and stop the assembler.
在上述程序中添加8259a芯片的中断代码的步骤如下:
1. 在 data 段中定义中断服务程序的入口地址:
```asm
isr_vector dw 0 ; 中断向量表,存储中断服务程序入口地址
```
2. 在 code 段中编写中断服务程序:
```asm
isr:
; 中断服务程序的代码
; 这里可以实现你想要的功能,例如控制直流电机正反转
iret ; 中断服务程序结束,执行 iret 指令返回主程序
```
3. 在主程序中初始化 8259a 芯片,并将中断向量表中的入口地址设置为中断服务程序的地址:
```asm
start:
; 初始化 8259a 芯片
mov al, 0Bh
out 20h, al ; ICW1
mov al, 20h
out 21h, al ; ICW2
mov al, 04h
out 21h, al ; ICW3
mov al, 01h
out 21h, al ; ICW4
; 将中断向量表中的入口地址设置为中断服务程序的地址
mov ax, isr ; 获取中断服务程序的地址
mov [isr_vector], ax
mov ax, cs
mov [isr_vector+2], ax
; 开启中断
sti
; 主程序的代码
; 这里可以实现你的主要功能
; 等待中断
hlt ; 等待中断发生,停止 CPU 执行
jmp $ ; 跳转回当前地址,继续等待中断
```
注意,在中断服务程序中,一定要使用 iret 指令来结束中断服务程序,否则中断处理程序不会正确结束,导致系统出现异常。另外,本示例中的中断向量表只存储了一个中断服务程序的地址,如果需要处理多个中断,需要使用更为复杂的中断向量表。