zoukankan      html  css  js  c++  java
  • 获取编译学习笔记 (十三)—— 外部中断

    疯狂暑期学习  汇编入门学习笔记 (十三)——  外中断


    參考: 《汇编语言》 王爽 第15章


    1.外中断信息


    外中断分为可屏蔽中断和不可屏蔽中断


    可屏蔽中断

    先看看内中断所引发的中断过程:

    (1)取中断类型吗n。

    (2)标志寄存器入栈。设置IF=0,TF=0.

    (3)CS、IP入栈

    (4)(IP)=(n*4)。(CS)=(n*4+2)


    可屏蔽中断的中断过程于内中断所引发的中断过程不同的地方仅仅是,第一步不同。可屏蔽中断的中断过程,CPU要先看IF的值。假设IF=0就不运行中断,假设IF=1运行中断。


    不可屏蔽中断

    不可屏蔽中断是CPU必须对应的中断。不可屏蔽中断非常少,所以中断类型吗固定为2,中断过程不须要取中断类型吗

    不可屏蔽中断的中断过程:

    (1)标志寄存器入栈,设置IF=0。TF=0.

    (2)CS、IP入栈

    (3)(IP)=(8)。(CS)=(0AH)


    2. PC机键盘的处理过程


        当我们按下一个键时,键盘上的芯片产生一个扫描码,扫描吗说明了按下键盘的键在键盘的位置。扫描吗被送入主板上的相关接口芯片的寄存器中,该寄存器的port是60h。一般按下一个键的扫描吗叫通吗。松开一个键的扫描吗叫断码,通吗第7位0,断码第7位1。即 断码=通吗 + 80h

        键盘的扫描吗到达60h是,相关芯片就会向CPU发出中断类型吗为9的可屏蔽中断信息。

        int 9 中断例程主要工作:

    (1)读出60hport的扫描吗

    (2)假设是字符键的扫描吗。就将该扫描吗和它所相应的字符吗(ASCII吗)送入内存中的BIOS键盘缓冲区。假设是控制键(如Ctrl)和切换键(如CapsLock)的扫描吗。则将其转变为状态字节(用二进制位记录控制键和切换键状态的字节)写入内存中存储的状态字节单元

    (3)对键盘系统进行相关的控制。

    比方,相相关芯片发出应答信息。


    3. 改动int 9 中断


    先实现,在屏幕中间间隔显示‘a’ ~ 'z' 字符,要实现间隔显示,就要有延时,用循环许多的次数来延时。

    实现代码:

    assume cs:code
    
    code segment
    
    start:
    	mov ax,0b800h
    	mov es,ax
    	mov al,'a'
    s:	
    	mov es:[160*12+40*2],al
    	call delay  ;循环10000000次,用来延时
    	inc al
    	cmp al,'z'
    	jna s
    	
    	mov ax,4c00h
    	int 21h;
    	
    delay:
    	push ax
    	push dx
    	mov dx,1000h   ;外层循环1000h次,内层循环100000h次
    	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
    	
    
    code ends
    
    end start


    再实现按下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
    	
    	mov ax,data
    	mov ds,ax
    	
    	mov ax,0
    	mov es,ax
    
    	push es:[9*4]
    	pop ds:[0]        ;将原来的int 9 中断例程的入口保存到 ds:0、ds:2中
    	push es:[9*4+2]
    	pop ds:[2]  
    	
    	mov word ptr es:[9*4],offset int9   ;在中断向量表中设置新的int 9*4中断例程的入口地址
    	mov es:[9*4+2],cs
    	
    	
    	mov ax,0b800h
    	mov es,ax
    	mov al,'a'
    s:	
    	mov es:[160*12+40*2],al
    	call delay  ;循环10000000次,用来延时
    	inc al
    	cmp al,'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   ;外层循环1000h次。内层循环100000h次
    	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
    	
    	in al,60h
    	
    	pushf       
    	pushf
    	pop bx
    	and bh,11111110b   ;设置IF=0.TF=0
    	push bx
    	popf
    	call dword ptr ds:[0]   ;模拟调用原来的int 9*4中断例程
    	
    	cmp al,1   ;1就是ESC的键盘扫描码
    	jne int9ret
    	
    	mov ax,0b800h
    	mov es,ax
    	inc byte ptr es:[160*12+40*2+1]  ;每次按下ESC键加1,来改变颜色属性
    	
    int9ret:
    	pop es
    	pop bx
    	pop ax
    	iret
    	
    	
    
    code ends
    
    end start






    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    你真的会写二分查找吗
    深入理解C++对象模型
    python监控ip攻击,服务器防火墙
    python操作redis
    python操作mysql
    jmeter_linux下运行
    chales抓包,模拟异常情况
    python正则表达式
    python-笔记(六)模块操作以及常用模块简介
    fpython-笔记(五)装饰器、匿名函数
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4730361.html
Copyright © 2011-2022 走看看