标签:字符 off 内存 ovs 产生 溢出 事件 pre bsp
小编也是最近学习到中断知识,学到如何创建0号中断.
0号中断属于除法溢出中断.当CPU处理程序时,发生除法溢出错误,间产生中断类型码为0的中断信息,然后根据中断向量表查找到IP,CS地址,进而转去执行相应的中断程序.
过程为:
(1) 取得中断类型吗
(2) pushf(标志寄存器入栈)
(3) TF(防止陷入单步中断循环),IF置0.
(4)CS入栈
(5)IP入栈
接下来,我们重写程序.
内存0000:0000~0000:03E8,大小约为1KB的空间时系统存放中断处理程序入口地址的中断向量表.8086支持256个中断,但是,实际上,系统要处理的中断事件没有达到256个.所以,有许多的单元是空的.一般情况下,0000:0200~0000:0300的256个字节空间所对应的向量表项都是空的.
(1) 编写可以显示"overflow!"的中断处理程序:do0;
(2)将do0送入内存0000:0200处;
(3) 境do0的入口地址0000:0200存储在中断向量表的-号表项中.
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 MOV CX,DO0 OFFSET DO0END-OFFSET DO0;代码长度 CLD REP MOVSB 设置中断向量表 MOV AX,4CH INT 21H DO0: DO0END:NOP CODE ENDS END START
DO0的主要任务就是显示字符串:
DO0:设置ds:si指向字符串 MOV AX,0B800H MOV ES,AX MOV DI,12*160+36*2 MOV CX,9 S:MOV AL,[SI] MOV ES:[DI],AL INC SI ADD DI,2 LOOP S MOV AH,4CH INT 21H DO0END:NOP CODE ENDS END START
注意:我们的字符串也应该存放到代码程序里面,而不是数据段
DO0:jmp SHORT DO0START DB "OVERFLOW !","$" DO0START:MOV AX,CS MOV DS,AX MOV SI,202H ;设置es:di指向显存空间的中间位置
接下里,设置中断向量:
将do0的入口地址0:200写入到中断向量表中,使得do成为0号中断处理程序.
0:0存放偏移地址,0:2存放段地址.
MOV AX,0 MOV ES,AX MOV WORD PTR ES:[0*4],200H MOV WORD PTR ES:[0*4+2],0 MOV AX,4CH INT 21H
完整代码:
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 MOV CX,DO0 OFFSET DO0END-OFFSET DO0;代码长度 CLD REP MOVSB MOV AX,0 MOV ES,AX MOV WORD PTR ES:[0*4],200H MOV WORD PTR ES:[0*4+2],0 MOV AX,4CH INT 21H DO0:jmp SHORT DO0START DB "OVERFLOW !","$" DO0START:MOV AX,CS MOV DS,AX MOV SI,202H MOV AX,0B800H MOV ES,AX MOV DI,12*160+36*2 MOV CX,9 S:MOV AL,[SI] MOV ES:[DI],AL INC SI ADD DI,2 LOOP S MOV AH,4CH INT 21H DO0END:NOP CODE ENDS END START
标签:字符 off 内存 ovs 产生 溢出 事件 pre bsp
原文地址:https://www.cnblogs.com/a-runner/p/12942820.html