总探声息头领

导航

汇编--中断

中断这玩意,看了很久,终于发现,要写一个中断程序,要不然理解不了所以写一个中断程序,来理解中断

 

pushf 表示寄存器的值入栈

popf从栈中弹出数据,送入标志寄存器中

iret指令:

pop ip

pop cs

popf


DF,方向标志位。在串处理指令中,控制每次操作后si,di的增减

DF=0,每次操作后si,di递增;

DF=1,每次操作后si,di递减;


串传送指令:movsb

功能:执行movsb相当于:

1.((es)*16+(di))=((ds)*16+(si))

2.如果DF=0,则:(si)=(si)+1  (di)=(di)+1


  如果DF=1,则:(si)=(si)-1   (di)=(di)-1 

用汇编语法描述movsb的功能:

mov es:[di],byte ptr ds:[si]  

movsb的功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器DF的值,将si和di递增或递减


cld: clear direction 设置DF=0;

std:set direction 设置DF=1;


rep movsb

用汇编语法来描述:

s:movsb

loop s

rep的作用是根据cx的值,重复执行后面的串传送指令,由于每次执行movsb,指令si和di都会递增或递减指向后一个单元或前一个单元,

则rep  movsb 就可以循环实现(cx)个字符的传送


编程:用串传送指令,将data段中的第一个字符串复制到它后面的空间上

data segment 
    db 'welcome to masm!'
    db 16  dup (0)
data ends

mov ax,data
mov ds,ax
mov si,0         ;ds:si指向data:0
mov es,ax
mov di,16      ;es:di指向data:16
mov cx,16      ;(cx)=16,rep循环16次
cld                 ;设置DF=0,正向传送
rep  movsb



所以对于中断,我们首先要弄明白中断是什么:

http://blog.chinaunix.net/uid-387104-id-1744110.html  这篇文章写的很全面


CPU在执行程序的时候,检测到CPU外部或内部发过来的一种特殊信息,可以立即对这个信息进行处理,处理完之后再接着以前的程序继续执行

这个特殊信息就是中断信息,

所以如果我们要搞清楚中断,就必须搞清几个问题

1.CPU是怎么检测到中断信息的,这个非常重要是连接纽带的关键点

  在微机系统中,对于外部中断,中断请求信号是由外部设备产生,并施加到CPU的NMI或INTR引脚上,CPU通过不断地检测NMI和INTR引脚信号来识 别是否有中断请求发生。(CPU是一块芯片,它是有很多引脚的,比如图片中的,其中有一个引脚就是中断引脚,在每一个周期中,CPU都会去检测这个引脚的值,如果有变化,它就产生反应)

对于内部中断,中断请求方式不需要外部施加信号激发,而是通过内部中断控制逻辑去调用。

(这是一个很粗略的电路图,并非CPU的只是用来解释一下,CPU怎么检测到中断信息而已,如果真的要搞清楚CPU的结构,请你自己去干)


2.中断信息是个什么样子的,

首先我们看一个东西


这个是中断向量表,它存着的就是中断的信息,位置,CPU检测到中断信号之后,那么它就要对中断进行处理,处理程序是早已写好了的(当然我们可以改),那么我们是怎么找到中断处理程序的呢,就是通过中断向量表,这个向量表里有每种不同中断的程序的地址CS:IP这个就是要处理 程序的位置,

我们看到的中断类型就是不同情况引发的中断,不同的情况引发的中断它的类型不同则处理程序也就不同,所以给他们编了号码,其实这是个地址,

这个是其中的几种情况,要想了解的更深,请GOOGLE一下


3 中断是怎么处理的,

上面我们写了call和ret的用法,就是这样,用call调到中断程序,并且把cs:ip入栈,然后执行完了,用ret将CS:IP出栈继续执行原来的程序,当然真正进行中断的时候,我们要保存标志寄存器的信息,因为有一个中断会用到一些个指令,这些指令会改变标志寄存器中的值,所以首先要保存标志寄存器的信息,然后还要设置标志寄存器中TF和IF的值

大概的过程可以用以下来表达


   


.


4.接下来就是怎么写中断处理程序了

不要以为这个好写,这个最麻烦了,什么情况都要考虑,我已经不想把它搞懂了,因为这需要花大量时间对整个硬件进行彻底的了解才能写的很熟练,这个是长期的过程,今天弄一点,明天弄一点,等若干年之后,你就什么都懂了


好了弄通了这几个重要的东西,接下来我们就要写一个真正的中断程序,我们来编写除法溢出中断即0号中断,

首先考虑整个过程, CPU执行div之后,发生了除法溢出错误,产生0号中断信息,引发中断过程,CPU执行0号中断处理程序,在屏幕中间显示“overflow”,然后返回DOS

实在不想写了,









。。。

posted on 2016-06-11 10:26  总探声息头领  阅读(685)  评论(0编辑  收藏  举报