汇编--中断
中断这玩意,看了很久,终于发现,要写一个中断程序,要不然理解不了所以写一个中断程序,来理解中断
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
实在不想写了,
。。。