用汇编语言写8259中断控制实验并且显示中断次数
时间: 2024-02-27 09:51:35 浏览: 139
以下是一个用汇编语言编写的 8259 中断控制实验程序,同时实现了中断次数的显示:
```assembly
section .data
count db 0 ; 定义计数器
section .text
handler:
pusha ; 保存通用寄存器
inc byte [count] ; 每次中断,计数器加一
mov al, 0x20
out 0x20, al ; 发送中断结束命令
popa ; 恢复通用寄存器
iret ; 中断返回指令
global _start
_start:
; 初始化主片和从片
mov al, 0x11 ; ICW1: 边沿触发模式,级联8259,需要ICW4
out 0x20, al ; 主片ICW1
out 0xa0, al ; 从片ICW1
mov al, 0x20 ; ICW2: 设置主片中断向量号为0x20~0x27
out 0x21, al ; 主片ICW2
mov al, 0x28 ; ICW2: 设置从片中断向量号为0x28~0x2f
out 0xa1, al ; 从片ICW2
mov al, 0x04 ; ICW3: 设置从片连接到主片的IR2
out 0x21, al ; 主片ICW3
mov al, 0x02 ; ICW4: 8086模式
out 0x21, al ; 主片ICW4
out 0xa1, al ; 从片ICW4
; 设置中断向量表
mov al, 0x08
mov ah, 0x35
mov dx, handler
int 0x21
; 开启中断
sti
; 循环显示计数器
loop:
mov al, byte [count]
call print_num
call print_nl
jmp loop
print_num:
; 将数字转为字符串
push ax
push bx
push cx
push dx
xor bx, bx
mov cx, 10
div cx
add ax, 0x3030
mov byte [num_str+1], al
mov byte [num_str], ah
mov ah, 0x09
mov dx, num_str
int 0x21
pop dx
pop cx
pop bx
pop ax
ret
print_nl:
; 输出换行符
mov ah, 0x02
mov dl, 0x0a
int 0x21
mov dl, 0x0d
int 0x21
ret
section .bss
num_str resb 2 ; 存储数字字符串的缓冲区
```
在中断服务程序 `handler` 中,每次中断时计数器 `count` 加一,并发送中断结束命令。在 `_start` 函数中,先初始化 8259 芯片,然后设置中断向量表、开启中断,并通过一个无限循环不断显示计数器的值,同时调用 `print_num` 函数将数字转为字符串并输出,再调用 `print_nl` 函数输出换行符,以避免过于频繁的输出。
需要注意的是,在实际的应用场景中,8259 芯片可能已经被 BIOS 或操作系统初始化,这时需要根据实际情况进行调整。
阅读全文