(2011.11.07) 汇编_王爽_第15章_学习小结
本章内容:
1. 外中断的概念及应用
2. PC机对键盘的处理过程。
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
一。什么是外中断
1. PC向外设的输出也不是直接送入外设,而是先送入端口中,再由相关芯片送到外设。
即:CPU通过端口和外部设备进行联系。
2. 外中断信息,来源于CPU外部,当CPU外部有需要处理的事情发生时,CPU处理完当前的指令后,可以检测到发送过来的中断信息,引发中断过程,处理外设的输入。
3. 外中断源,分为两种:
第一种是:可屏蔽中断,当IF = 0时不响应可屏蔽中断,IF = 1 则执行完当前指令后响应。
第二种是:不可屏蔽中断,CPU执行完当前指令后必须立即响应。
二。 PC机对键盘的处理.
1. 每按下一个键,芯片会产生一个送到主板寄存器端口为60h的扫描码。
2. 通码:按下键时,产生的扫描码。
3. 断码:松开键时,产生的扫描码。
4. 断码 = 通码 + 80h
5. 键盘输入到达60h端口时,CPU会从相关芯片中接到断类型码为9的可屏蔽中断信息。
6. 系统启动后,BIOS键盘缓冲区中,一个字单元存放一个键盘输入,高字节:扫描码,低字节:字符码。
三。 CPU对键盘输入的处理过程:
1. 键盘产生扫描码
2. 扫描码送入60h端口
3. 引发9号中断
4. CPU执行int9中断例程处理键盘输入
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:1504_编写调用BIOS的int 9例程_响应输入的程序.asm ; 程序功能:当输出时遇到Esc的扫描码时,改变显示的颜色后返回 ; ------------------------------------------------------------------------------------------------ the whole program start--- assume cs:code ; -------------------------------------------------------------------------------------------statement start --- ; 段名:ss:stack ; 功能: 用于临时保存各个寄存器的数据 ; 大小:共占用了128个字节,即64个字 ; ---------statement end------------------------ stack segment db 128 dup (0) stack ends ;-------------------------------------------------------------------------------------------- program end--- ; -------------------------------------------------------------------------------------------statement start --- ; 段名: ds:data ; 功能:用于保存int9中断例程的入口地址 ; 大小:共占用两个字,即四个字节 ; ---------- statement end -------------------------------- data segment dw 0, 0 data ends ; ------------------------------------------------------------------------------------------- program end --- code segment start: mov ax, stack ; 先设置好堆栈的地址 mov ss, ax ; 让ss:sp指向stack段的末端 mov sp, 128 mov ax, data ; 然后设置ds的地址,让其指向data段 mov ds, ax ; 目的是存放原中断向量表的地址 mov ax, 0 ; 之后是设置es的地址,令es作为段地址可以指向中断向量表 mov es, ax push es:[9*4] ; 将中断向量表中int9的地址放入堆栈中 pop ds:[0] ; 再将地址取出放入data段中 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 ; 将es指向显示缓存区的地址 mov es, ax mov ah, 'a' s: mov es:[160*12+40*2], ah ; 将设定的字母移到显示缓存区中 call delay ; 其中调用了delay子程序,目的是让显示延迟 inc ah cmp ah, 'z' jna s ; s段的作用是显示字母a~z mov ax, 0 ; 再次将es设为段地址0,目的是设置中断向量表中的地址 mov es, ax push ds:[0] pop es:[9*4] push ds:[2] pop es:[9*4+2] ; 将中断向量表中int 9中断例程的入口恢复为原来的地址 mov ax, 4c00h ; 程序返回,程序结束 int 21h ; --------------------------------------------------------------------------------------------statement start --- ; 子程序名称:delay ; 子程序的功能:不断地执行空循环,目的是时间延迟 ; ---------------------statement end --- delay: push ax push dx mov dx, 0 ; 循环次数2X次。 mov ax, 0 s1: inc dx add ax, dx cmp ax, 1000H ; 此处设置重复的X次 jne s1 s2: dec dx cmp dx, 0 jne s2 pop dx pop ax ret ; -----------------------------------------------------------------------------------------------program end ---- ; --------------------------------------------------------------------------------------------statement start --- ; 子程序名称:新int 9中断例程段 ; 子程序功能:设置新的int9例程,并模拟中断过程。 ; 子程序分析:子程序一共分为四大步骤 ; 1. 标志寄存器入栈 2. IF = 0, TF = 0 3. CS、IP入栈 ; 4. (IP) = ((ds)*16+0), (CS) = ((ds)*16 +2) ; -------------statement end --------------------------------- int9: push ax push bx push es in al, 60h ; 此处为了引发9号中断 ; 当键盘的输入到达60h端口时 ; 相关的芯片就会向CPU发出中断类型码为9的可屏蔽中断信息 ; 如果IF = 1, 则响应中断,转去执行int9中断例程 pushf ; 此步模拟第1步,标志寄存器入栈 pushf ; 此处开始第2步,将IF及TF置零 pop bx ; 将flag寄存器中的数据从堆栈中取出,并且下面进行修改 and bh, 11111100b ; 将IF和TF置0 push bx ; 第2 步结。修改以后再将flag寄存器中的数据放回堆栈中 popf ; 第1步结. call dword ptr ds:[0] ; 第3步,CS:IP入栈.对int指令进行模拟,调用原来的int 9中断指令 cmp al, 1 ; 扫描al的值是否为“ESC“的扫描码 jne int9ret mov ax, 0b800h mov es, ax inc byte ptr es:[160*12+40*2+1] ; 将属性值加1, 改变颜色 int9ret: pop es pop bx pop ax iret ; ----------------------------------------------------------------------------------------------------program end ---------------- code ends end start ; ------------------------------------------------------------------------------------- the whole program end ----------------