编写、应用中断例程
第一个中断例程:
要求:
编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。
汇编代码:
assume cs:codesg
codesg segment
mov ax, cs
mov ds, ax
mov si, offset print_str ;源地址
mov ax, 0
mov es, ax
mov di, 200h ;目标地址
mov cx, offset print_str_end - offset print_str
cld
rep movsb
mov word ptr es:[7ch*4], 200h
mov word ptr es:[7ch*4+2], 0 ;设置中断向量表
mov ax, 4c00h
int 21h
print_str:
push es
push ax
push bx
push cx
push dx
push di
push si
mov ax, 0b800h
mov es, ax ;初始化显存
mov al, 0a0h
sub dh, 1
mul dh
mov bx, ax ;行计算
sub dl, 1
add dl, dl
mov dh, 0
mov di, dx ;列计算
mov al, cl ;输出颜色
mov cx, 0 ;用作结束判断
mov si, 0 ;字符串指针
print_s:
mov cl, [si]
jcxz print_ok
mov es:[bx][di], cl
mov es:[bx][di+1], al
inc si
add di, 2 ;指针向后偏移
jmp short print_s
print_ok:
pop si
pop di
pop dx
pop cx
pop bx
pop ax
pop es
iret
print_str_end:
nop ;空出一个字节来计算代码长度
codesg ends
end
运行结果:
第二个中断例程:
要求:
编写并安装int 7ch中断例程,功能为完成loop指令的功能。
参数:(cx)=循环次数,(bx)=位移。
汇编代码:
assume cs:code
code segment
start:
mov ax, cs
mov ds, ax
mov si, offset copy_loop
mov ax, 0
mov es, ax
mov di, 200h
mov cx, offset copy_loop_end - offset copy_loop
cld
rep movsb
mov word ptr es:[7ch*4], 200h
mov word ptr es:[7ch*4+2], 0
mov ax, 4c00h
int 21h
------------------------------------------------
--------------------copy_loop-------------------
-------参数:(cx)=循环次数,(bx)=移动位移---------
------------------------------------------------
copy_loop:
push bp
dec cx
jcxz loop_ok ;cx为0,循环结束
add [bp+2], bx ;IP+位移
loop_ok:
pop bp
iret
copy_loop_end:
nop
code ends
end start
运行结果:
第三个中断例程:
空格一:[si]
空格二:[bx]
空格三:inc si
空格四:add bx, 2