ASM-一个简单的中断程序

在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

版权所有,转载请注明出处 luowei.github.io.