前边我们已经基本学完了8086的语法,接下来进入系统学习阶段。
中断这个概念蕴含的意思想当的多,但是这里我们只考虑8086的中断模式,等后边学到x86的时候在讨论现代计算机系统的中断,一样会以Linux操作系统为例。
这里简要的就跟随王爽的《汇编语言》走了。
内中断的产生:
@除法错误 0
@单步执行 1
@执行into指令 4
@执行int指令 int n (n:整形字节数,告诉CPU 中断号)
中断向量表:
中断向量表在内存中保存,其中存放着256个中断所对应的的中断处理程序入口。
中断过程:
8086CPU中断过程:
1.取的中断类型码
2.pushf 保存标记寄存器值
3.TF = 0,IF = 0
4.push CS
5.push IP
6.ip = N*4 cs = (N*4+2)
中断处理程序的一般常规使用
1.保存用到的寄存器
2.处理中断
3.恢复用到的寄存器
4.使用iret 指令返回
assume cs:code code segment start: mov ax,cs mov ds,ax ;设置代码段,我们需要把代码段的中断处理程序拷贝到向量表可以找到的地方去 mov si,offset do0 mov ax,0 mov es,ax mov di,200h ;将代码拷贝到中断的代码处ds:[si] 的数据到 es:[di] 以cx 为长度 mov cx,offset do0end - offset do0 cld ;设置si,di 每次加1 rep movsb mov ax,0 ;设置中断向量到中段向量表 mov es,ax ;将中段向量的代码CS:IP记录到相应中断号上 mov word ptr es:[0*4],200h ;中断号查找位置N * 4 ,N*4 + 2 mov word ptr es:[0*4+2],0 mov ax,4c00h ;此程序在这里其实就结束了,我们已经将代码放到了,中断向量的地方 int 21h do0: jmp short do0start ;我们必须把字符串放到代码里,不然安装程序结束后代码就内存释放了 db "hello world!" do0start: ;0号中断处理程序,将数据打印到屏幕上 mov ax,cs mov ds,ax mov si,202h mov ax,0b800h mov es,ax mov di,12*160+36*2 ;12行16列 mov cx,12 S:mov al,ds:[si] mov ah,01000010B mov es:[di],ax inc si inc di inc di loop s mov ax,4c00h int 21h do0end:nop code ends end start
本文详细介绍了8086处理器的中断机制,包括内中断产生的原因如除法错误、单步执行等,以及通过执行INT指令触发中断的过程。同时,文章还深入探讨了中断向量表的作用和中断处理程序的实现方式。
1万+

被折叠的 条评论
为什么被折叠?



