📄 printer.asm
字号:
;8259 口地址: 20h , 21h
;8255 口地址: 0C0h, 0C1h, 0C2h, 0C3h
data segment para
String db 'Hello!',0,'$' ;0为NULL的ASCII码
IsrOff dw 0 ;保存原0F号中断程序地址偏移量
IsrSeg dw 0 ;保存原0F号中断程序地址段地址
Index dw 0 ;指示打印字符的位置
EndFlag db 0 ;打印结束标志 0:未结束 55h:结束
P8259A0 equ 20h
P8259A1 equ 21h
P8255A0 equ 0C0h
P8255A1 equ 0C1h
P8255A2 equ 0C2h
P8255AC equ 0C3h
data ends
ss_seg segment stack
db 512 dup(0)
ss_seg ends
code segment
assume cs:code,ss:ss_seg,ds:data
main proc far
push ds
xor ax, ax
push ax
mov ax, data
mov ds, ax
cli ;关中断
;保存原来0fh号中断向量
mov al, 0fh ;取0f号中断向量
mov ah, 35h
int 21h ;ES:BX=中断向量
mov IsrSeg, es
mov IsrOff, bx
;安装新中断向量,IR7的中断类型码为0FH
mov dx, offset Isr_Prt
mov ax, seg Isr_Prt
mov ds, ax
mov al, 0fh
mov ah, 25h
int 21h
mov ax, data ;再次设置数据段地址
mov ds, ax
sti ;开中断
;8259 初始化程序段
mov al, 13h ;初始化ICW1
out P8259A0, al ;8259A为单片,上升沿触发,要ICW4
nop
nop
mov al, 8 ;初始化ICW2
out P8259A1, al ;使8259A的IR0的中断类型码为08H
nop
nop
mov al, 1 ;初始化ICW4
out P8259A1, al ;全嵌套,非缓冲方式,中断非自动结束
nop
nop
in al, P8259A1 ;读中断屏蔽寄存器
and al, 7fh
out P8259A1, al ;打开IRQ7的中断申请,写OCW1
;8255 初始化程序段
mov al, 0a0h ;初始化8255,A口:方式1,输出
out P8255AC, al ;B口、下C口:方式0
nop
nop
mov al, 1
out P8255AC, al ;置STB初始为高电平
nop
nop
mov al, 0dh
out P8255AC, al ;置PC6=INTEA=1,允许中断申请
;发送第一个字符
lea bx, String
mov si, Index
mov al, [bx+si] ;从字符串中取字符
or al, al ;判断是否为NULL结束符
jz main_2
inc si
mov Index, si ;Index指向下一个要打印字符
out P8255A0, al
nop ;接口延时
nop
nop
mov al, 0
out P8255AC, al ;置STB为低电平,选通打印机
main_1: ;...... CPU可以在此 处理别的任务
cmp EndFlag, 55h
jnz main_1
;恢复以前的中断向量
main_2: cli
in al, P8259A1 ;读中断屏蔽寄存器
or al, 80h
out P8259A1, al ;屏蔽IRQ7的中断申请
mov dx, IsrOff
mov ax, IsrSeg
mov ds, ax
mov al, 0fh
mov ah, 25h
int 21h
mov ax, data
mov ds, ax
sti
ret
main endp
;打印机中断服务子程序-----------------
Isr_Prt proc far
push ds ;保护现场
push ax
push bx
push si
mov al, 1
out P8255AC, al ;置STB为高电平,数据未准备好
nop
nop
nop
sti ;开中断
mov ax, data ;中断里重新赋DS值,该程序中可不赋
mov ds, ax
lea bx, String
mov si, Index
mov al, [bx+si]
or al, al
jnz Isr_Prt1 ;判断是否为结束符
mov EndFlag, 55h ;若为结束符,置结束标志
jmp Isr_Prt2
Isr_Prt1:
inc si
mov Index, si
out P8255A0, al ;发送打印字符到8255A口
nop ;接口延时
nop
nop
mov al, 0
out P8255AC, al ;置STB为低电平,选通打印机
Isr_Prt2:
cli ;关中断
mov al, 20h ;向8259A发中断结束EOI命令
out P8259A0, al
pop si ;恢复现场
pop bx
pop ax
pop ds
sti ;再次开中断
iret ;中断返回
Isr_Prt endp
code ends
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -