;***********************************************
;实验一:编写并安装 int 7ch 中断例程
;功能为显示一个用 0 结束的字符串
;中断例程安装在0:200 处
;参数:(dh) = 行号,(dl) = 列号,(cl) = 颜色,
;ds:si 指向字符串首地址
;***********************************************
assume cs:code
data segment
db “Welcome to masn!”, 0
data ends
code segment
start:
mov ax, cs
mov ds, ax
mov si, offset do7c ;ds:si指向源地址
mov ax, 0
mov es, ax
mov di, 200h ;es:di指向目标地址
mov cx, offset do7cend - offset do7c
cld
rep movsb ;安装中断历程完毕
mov dh, 24
mov es, ax
mov word ptr es:[7ch*4], 200
mov word ptr es:[7ch*4+2], 0 ;设定中断向量
mov dh, 24 ;31-39为测试程序
mov dl, 63
mov cl, 4
mov ax, data
mov ds, ax
mov si, 0
int 7ch
mov ax, 4c00h
int 21h
do7c: ;中断例程代码
mov ax, 0b800h
mov es, ax
mov al, 160
mul dh
mov di, ax
mov al, 2
mul dl
add di, ax
mov al, cl
begin:
mov cl, [si]
jcxz ok
mov es:[di], cl
inc di
mov es:[di], cl
inc si
inc di
jmp short begin
ok:
iret
do7cend:
nop
code ends
end start
;*************************************************
;实验二:编写并安装 7ch 中断例程,功能为完成 loop 指令的功能
;参数: (CX) = 循环次数, (BX) = 位移
;*************************************************
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset do7c
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do7ce - offset do7c
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,0b800h
mov es,ax
mov di,160*12
mov bx,offset s - offset se
mov cx,80
s:
mov byte ptr es:[di],’!’
add di,2
int 7ch
se:
nop
mov ax,4c00h
int 21h
do7c:
push bp
mov bp,sp
dec cx
jcxz ok
add [bp+2],bx
ok:
pop bp
iret
do7ce:
nop
code ends
end start
实验3就不写了,就是调用BIOS,或者DOS的中断历程的子程序