汇编语言(王爽)-第十五章

发布时间:2017-6-24 16:52:46 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"汇编语言(王爽)-第十五章",主要涉及到汇编语言(王爽)-第十五章方面的内容,对于汇编语言(王爽)-第十五章感兴趣的同学可以参考一下。

第十五章 外中断 *外设接口芯片的内部的寄存器,CPU将这些寄存器当作端口来处理;CPU和外设直接的输入输出都是通过这些端口(即寄存器)来传递的。 *可屏蔽中断:CPU依据IF标志位决定是否响应可屏蔽中断;IF=1,则响应;IF=0则不响应。sti指令表示置if位为1;cli指令表示置if为0.回想下内中断的过程:在pushf后会将TF和IF位置0,TF置0的原因已经知道了;IF置0就是在产生内中断的时候使CPU不去理会可屏蔽中断。可屏蔽中断的类型码通过数据总线传给CPU;这里需要注意的是内中断的类型码是在CPU内部产生的。 *不可屏蔽中断:该类中断的类型码固定为2,则不可屏蔽中断的处理例程入口为CS=(0000:8),IP=(0000:0ah). *外中断的处理过程:1、pushf;TF=0,IF=0;2、push CS、push IP;3、设置cs-ip. *键盘输入 一、处理过程 1、通码与断码:按下一个键位时,键盘芯片产生的扫描码称为通码,同时该码被送入相关接口芯片的寄存器,对应端口地址为60h;松开一个键位时芯片产生的扫描码成为断码,同样被送入60h端口。通码和断码均为一个字节,通码最高位为0,同一键位对应的断码=通码+80h。即断码最高位为1. 2、外中断<此处即为9号中断>的引发:当键盘输入到达60h端口后,相关芯片通过数据总线向CPU发出类型码为9的可屏蔽中断信息。CPU接收后检测若IF=1则响应,否则反之。 3、9号中断例程功能:(1)读出60h端口中的扫描码;如果是字符键,则将该扫描码和其对应字符的ASCII码送入BIOS系统的键盘输入缓冲区,如果是控制/切换类键(如Caps/Ctrl)则将其转变为状态字节写入内存中存储状态字节的单元(0040:17)。(2)对键盘进行相关控制。 二、相关 1、BIOS系统键盘输入缓冲区:系统启动后,BIOS用于存放9号中断例程接收的键盘输入的内存区,可存储15个键盘输入,每个键盘输入包括扫描码和其对应ASCII码,因此一个键盘输入占用一个字单元。高位存放扫描码,低位存放ASCII码。 2、0040:17内存单元存储键盘状态字节。 三、安装新9号中断例程,摁“F1”键满屏背景色变化  assume cs:code,ss:stack stack segment dw 128 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,128 ;安装新9号中断例程 mov ax,cs mov ds,ax mov si,offset new9 mov ax,0 mov es,ax mov di,204h mov cx,offset new9end-offset new9 cld rep movsb ;暂存原9号中断入口地址 push es:[4*9+2] push es:[4*9] pop es:[200h] pop es:[202h] ;设置新9号入口地址 cli mov word ptr es:[4*9],204h mov word ptr es:[4*9+2],0 sti mov ax,4c00h int 21h ;新9号中断例程 new9: push ax push bx push cx in al,60h pushf call dword ptr cs:[200h] cmp al,03bh jne int9ok mov ax,0b800h mov ds,ax mov bx,1 mov cx,2000 sint9: inc byte ptr ds:[bx] add bx,2 loop sint9 int9ok: pop cx pop bx pop ax iret new9end: nop code ends end start *重要疑问: 王爽书里十五章新9号例程中出入栈的疑问 书上新例程的结构大致如下(列出主要涉及栈操作的代码): { push ax push bx push es ... pushf call dword ptr...    (这步是结合检测点15.1之后做的精简) ... pop es pop bx pop ax iret } 首先,CPU检测到中断后,取中断类型码,然后: pushf  (TF=IF=0) push cs push ip 接着转到中断例程入口地址;中断例程通过iret返回,iret相当于: pop ip  pop cs popf 这个顺序应该没有问题吧。那结合开始提到的新例程,举个例子,如果CPU检测并转到新例程去执行,那完整的出入栈是否应该如下: { pushf  (TF=IF=0) push cs push ip      (以上是CPU检测到中断取类型码之后进行的操作,下面转入新例程) push ax push bx push es ... pushf (call dword ptr...    这步调用原中断例程,其中出入栈指令为iret,这步对栈的操作即等同于:) pop ip pop cs popf ... pop es pop bx pop ax iret } 可这样看下来整个出入栈顺序不就都乱了么?当然,我知道一定是哪里自己的理解有误了。。。MARK一下吧。 --------------------------------------------------------------------------------------------------------------------------------------------------------- 时隔数月,重新看到这章,来回答一下自己当初的疑问 先梳理一下这个程序的处理过程:程序显示a~z,在显示过程中响应键盘输入外中断,进行相关操作后进入自编9号外中断,自编9号外中断又通过call指令去执行了原先的9号中断例程。 步骤上分为: 1、得到外中断信息(键盘输入),在进入中断例程处理前pushf,push cs,push ip 2、进入自编9号外中断 其中上述第2步涉及出入栈操作又有以下几步: 2.1先pushf暂存标志寄存器 2.2call 原先9号中断例程 2.3iret 上述2.2又由以下组成: 2.2.1push cs/push ip 2.2.2iret 因此,上述整个过程,对栈的操作顺序如下: 1pushf,push cs,push ip 2.1pushf 2.2.1 push cs/push ip 2.2.2iret(pop ip,pop cs,popf) 2.3 iret(pop ip,pop cs,popf) 可见,整个出入栈过程是闭合的,没有问题的。 --------------------------------------------------------------------------------------------------------------------------------------- 检测点15.1(2) 依据提示,则在相应代码段前后分别设置IF为0,1。顺便把这次重复习的程序贴出如下 assume cs:code,ss:stack,ds:data stack segment db 32 dup (0) stack ends data segment dw 0,0 data ends code segment start: mov ax,stack mov ss,ax mov sp,32 mov ax,data mov ds,ax mov ax,0 mov es,ax push es:[9*4] pop ds:[0] push es:[9*4+2] pop ds:[2] ;暂存9号中断原例程 cli ;置IF位为0,不响应键盘输入 mov word ptr es:[9*4],offset newint9 mov word ptr es:[9*4+2],code ;新例程入口设置 sti ;恢复IF位 mov ax,0b800h mov es,ax mov bp,160*12+80 mov al,'a' s: mov es:[bp],al inc al call mydelay cmp al,'z' jna s push ds:[0] pop es:[9*4] push ds:[2] pop es:[9*4+2] ;恢复原9号中断入口 mov ax,4c00h int 21h mydelay: push ax push cx mov ax,0 mov cx,65535 s1: push cx mov cx,2000 s2: inc ax loop s2 pop cx loop s1 pop cx pop ax ret newint9: push ax push bx push es in al,60h ;读取扫描码 pushf ;标志寄存器入栈 pushf pop bx and bh,11111100B push bx popf ;IF=TF=0 call dword ptr ds:[0] ;调用原9号中断进行相关处理 cmp al,1 jne ok1 mov ax,0b800h mov es,ax inc byte ptr es:[160*12+80+1] ok1: pop es pop bx pop ax iret code ends end start    

上一篇:div css技巧,25个css样式技巧分享
下一篇:Maven介绍(创建工程项目以及下载所…

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。