⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 printer.asm

📁 一些汇编语言的实验设计源代码
💻 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 + -