📄 experiment4.asm
字号:
stack segment para 'stack'
dw 200 dup(?)
stack ends
data segment para 'data'
intoa_off dw ?
intoa_seg dw ?
count dw 0
data ends
code segment
assume cs:code,ds:data,es:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov es,ax
mov ax,stack
mov ss,ax
;修改中断向量
mov ax,3571h ;取原71H中断向量,并保存
int 21h ;(段地址--ES,偏移地址--BX)
mov intoa_off,bx
mov bx,es
mov intoa_seg,bx
cli ;置新中断向量之前关中断
mov ax,2571h
mov dx,seg auto_add
mov ds,dx
mov dx,offset auto_add
int 21h ;(段地址--DS,偏移地址--DX)
mov ax,data ;恢复数据段
mov ds,ax
sti ;开中断
;开放IRQ10
in al,0a1h
and al,11111011b ;
out 0a1h,al
;开放IRQ2
in al,21h
and al,1111011b
out 21h,al
begin:
sti ;开中断
hlt ;等待中断
test_exit:
mov ah,0ah ;测试是否有键盘输入
int 21h
cmp al,0
jnz getnumber ;无键盘输入则继续
mov ah,06h
mov dl,ffh
int 21h
cmp al,1bh
jz exit ;为ESC则退出
jmp begin
exit:
cli ;恢复原中断向量关中断
mov ax,2571h
mov dx,intoa_seg
mov ds,dx
mov dx,intoa_off
int 21h
mov ax,data ;恢复数据段
mov ds,ax
sti
;屏蔽中断请求
in al,0a1h
or al,00000100b
out 21h,al ;屏蔽从片82C59 IRQ10
in al,21h
or al,00000100b
out 0a1h,al ;屏蔽主片82C59 IRQ2
;返回D0S
mov ax,4c00h
int 21h
main endp
;中断服务程序
auto_add proc far
mov ch, 4 ;将count输出到屏幕
rotate:
mov cl, 4
rol al, cl
mov dl, al
and dl, 0fh ;保留DL中的后四位
add dl, 30h
cmp dl, 3ah
jl tochar
add dl, 07h
tochar:
mov ah,02h
int 21h ;显示该字符
dec ch
jnz rotate
mov dl,'H'
int 21h ;打印‘H’
mov dl,20h
int 21h ;打印空格
cli ;关中断
inc count
;发中断结束命令
mov al,20h
out 20h,al ;主片82C59A中断结束
mov dx,0a0h
mov al,61h
out dx,al ;从片82C59A中断结束
sti ;开中断
iret ;中断返回
auto_add endp
code ends
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -