一个简单的中断程序

在Masm for Windows 下调试:

 

DATAS SEGMENT

;此处输入数据段代码

DATAS ENDS

 

STACKS SEGMENT

;此处输入堆栈段代码

STACKS ENDS

 

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:

MOV AX,DATAS

MOV DS,AX

;系统默认在内存0000:000到0000:03FE专门存放中断向量表

;第一步:把中断向量表中0号表项的内容进行修改,

;指向我们自己指定的中断处理程序的入口地址

mov ax,0

mov ds,ax

;中断向量表每个表项占四个字节,低字节放偏移地址,高字节放段地址

mov word ptr ds:[0],0200h

mov word ptr ds:[2],0

 

;第三步,把自己写的0号中断处理程序拷贝到中断向量表在0号表项

;所指向的内存地址中0000:0200

;设置程序的源地址,源地址由DS:SI组成,目的地址由ES:DI组成

mov ax,cs

mov ds,ax

mov si,offset int0    ;程序所在地址,即源地址:ds:si

mov ax,0

mov es,ax            ;设置目的地址

mov di,200h

mov cx,offset int0end-offset int0

;CLD指令设置数据拷贝方向是从低字节向高字节,si,di自动增量,STD相反

cld

rep movsb

;第四步,利用代码自动引发0号中断处理程序

mov ax,100h

mov bh,1

div bh    ;除数为1,产生除法溢出错误,中断!调用自己写的中断程序

 

 

;第二步:编写自己的中断处理程序,实现在屏幕中央显示字符串的功能

int0:jmp short int0start    ;这行代码占两个字节

    db "I am student !"

int0start:mov ax,0b800h

mov es,ax    ;配置显存首地址

;要把"I am student !"一个拷贝到显存地址空间中

mov ax,cs    ;把代码段中的内容送到数据段当中去

mov ds,ax    ;0中断程序没区分代码段和数据段

 

mov si,202h    ;因jump short int0start占两字节

mov di,12*160+36*2    

;一个屏幕最大是24行、80列,每行80个字,36是中央偏左一点

 

mov cx,14    ;"I am student !" 点14个字节

 

    ;---------字体属性----------

    ;| 7 6 5 4 3 2 1 0 |

    ;| B L R G B I R G B |

    ;| 闪烁 背景色 高亮 前景色 |

    ;---------------------------

    mov ah,10100100b ;绿底红字

s:mov al,byte ptr ds:[si]    ;将第一个字符存到al中

    mov es:[di],al    ;拷贝字符

    mov es:[di+1],ah ;拷贝字符属性

    inc si        ;源地址指针后移1个字符

    add di,2    ;显存地址加2字节

    loop s

 

MOV AH,4CH

INT 21H

int0end:nop ;nop是空操作指令,占一个字节

 

CODES ENDS

END START

 

 

 

 

 

posted @ 2011-03-12 20:39  维唯为为  阅读(551)  评论(0编辑  收藏  举报