实验13.1
编写安装7ch中断,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数:dh=行号,dl=列号,cl=颜色,ds:si指向字符串首地址
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!',0
data ends
stack segment
db 128 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
;安装程序
mov ax,cs
mov ds,ax
mov si,offset show_str_start
mov ax,0
mov es,ax
mov di,200h
mov cx,offset show_str_end - offset show_str_start
cld
rep movsb
;修改中断向量表
mov ax,0
mov es,ax
mov word ptr es:[7ch*4+0],200h ;偏移地址
mov word ptr es:[7ch*4+2],0 ;段地址
mov dh,10 ;行号
mov dl,10 ;列号
mov cl,2 ;颜色
mov ax,data ;
mov ds,ax
mov si,0
int 7ch
mov ax,4c00h
int 21h
show_str_start:
mov ax,0b800h
mov es,ax
mov ax,0
mov al,160
mul dh
mov di,ax
mov ax,0
mov al,10
mul dl
add di,ax
mov ah,cl
mov cx,0
showStr:
mov cl,[si]
jcxz ok
mov al,cl
mov es:[di],ax
inc si
add di,2
jmp short showStr
ok:
iret
show_str_end:
nop
code ends
end start
观察int iret执行时,栈和cs ip变化情况;
int 7ch执行前,栈的数据和CS IP 变化情况
执行后,栈的数据和CS IP 变化情况
执行iret前
执行后:cs ip 恢复到之前的状态
13.2 编写并安装int 7ch中断,功能为完成loop指令
参数:cx = 循环次数,bx=位移
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!',0
data ends
stack segment
db 128 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
;安装程序
mov ax,cs
mov ds,ax
mov si,offset lp
mov ax,0
mov es,ax
mov di,200h
mov cx,offset lpret - offset lp
cld
rep movsb
;修改中断向量表
mov ax,0
mov es,ax
mov word ptr es:[7ch*4+0],200h
mov word ptr es:[7ch*4+2],0
mov ax,0b800h
mov es,ax
mov di,160*12
mov cx,80
mov bx,offset s - offset se
s:
mov byte ptr es:[di],'!'
add di,2
int 7ch
se:
nop
mov ax,4c00h
int 21h
lp:
push bp
mov bp,sp
dec cx
jcxz ok
add [bp+2],bx
pop bp
ok:
iret
lpret:
nop
code ends
end start