我是靠谱客的博主 彪壮鲜花,最近开发中收集的这篇文章主要介绍8086外中断处理8086外中断处理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

8086外中断处理

机理类似于内中断,8086外中断针对于CPU外部

1、可屏蔽中断

依据对 IF 不同设置,cpu检测到外中断信息,判定IF = 1,cpu在执行完当前指令后响应外中断,引发中断过程,IF = 0,则不响应此中断

设置IF指令:sti---->IF = 1;cli---->IF = 0

取得中断类型码

pushf IF = 0 TF = 0

push cs

push ip

( IP ) = ( nx4 ) ( CS ) = ( nx4+2 )

2、不可屏蔽中断

cpu必须响应,中断类型码固定为2

pushf IF = 0 TF = 0

push cs

push ip

( IP ) = ( 8h ) ( CS ) = ( 0Ah )

3、PC机键盘外中断处理

扫描码,键开关扫描,通码,按下键产生的扫描码,断码,松开键产生的扫描码

断码 = 通码 + 80h

引发9号中断,键盘输入到达60h端口,端口向cpu发出中断类型码为9的可屏蔽中断信息(9x4 9x4+2)

in al,60H

BIOS键盘缓冲区,用于存放 int 9 中断例程所接受键盘输入

一个键盘输入用一个字节存放,高字节存放扫描码,低字节存放字符码

①读取60H端口扫描码

②如果是字符键的扫描码,将扫描码与对应ASCII放入键盘缓冲区;如果是控制键,shift则将其转变状态字节(子单元)

③对键盘系统响应

ESC扫描码改变显示颜色后返回

assume cs:code 
​
stack segment
        db 128 dup (0)
stack ends
​
data segment
        dw 0,0
data ends
​
code segment
start:  mov ax,stack
        mov ss,ax       
        mov sp,128      ;ss:sp指向栈顶
        
        mov ax,data
        mov ds,ax       ;ds--->data段
        
        mov ax,0
        mov es,ax       ;es--->中断安装区段
        
        push es:[9*4]
        pop ds:[0]
        push es:[9*4+2]
        pop ds:[2]      ;int 9 中断例程入口地址保存在ds:0---ds:2单元
        
        mov word ptr es:[9*4],offset int9
        mov es:[9*4+2],cs       ;设置新的int 9 中断例程入口
        
        mov ax,0b800h
        mov es,ax
        mov ah,'a'      
        
s:      mov es:[160*12+40*2],ah     ;在es:[160*12+40*2]显示a
        call delay                  ;延迟
        inc ah
        cmp ah,'z'
        jna s
        
        mov ax,0
        mov es,ax
        
        push ds:[0]
        pop es:[9*4]
        push ds:[2]
        pop es:[9*4+2]
        
        mov ax,4c00h
        int 21h
        
delay:  push ax             ;循环延迟
        push dx
        mov dx,1000h        
        mov ax,0
        
s1:     sub ax,1
        sbb dx,0
        cmp ax,0
        jne s1
        cmp dx,0
        jne s1
        pop dx
        pop ax
        ret
        
;================================================
int9:   push ax
        push bx
        push es         ;ax,bx,es入栈
        
        in al,60h       ;读60h键盘地址端口
        
        pushf           ;标志寄存器入栈
        pop bx
        and bh,11111100b;设置TF = 0和IF = 0,分别为标志寄存器第八、九位
        push bx
        popf
        call dword ptr ds:[0]
        
        cmp al,1
        jne int9ret
        
        mov ax,0b800h   ;显示段
        mov es,ax
        inc byte ptr es:[160*12+40*2+1]     ;显示字节
        
int9ret:pop es 
        pop bx
        pop ax          ;ax,bx,es出栈
        iret            ;cs:ip出栈返回
        
code ends
end start

最后

以上就是彪壮鲜花为你收集整理的8086外中断处理8086外中断处理的全部内容,希望文章能够帮你解决8086外中断处理8086外中断处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部