实验十六_编写包含多个功能子程序的中断例程

安装一个新的int 7ch中断例程,为显示输出
提供如下功能子程序:
(1)清屏。
(2)设置前景色。
(3)设置背景色。
(4)向上滚动一行。
入口参数说明:
(1)用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,
3表示向上滚动一行:
(2)对于2、3号功能,用al传送颜色值,(al)属于集合{0,1,2,3,4,5,6,7}

分析:
首先:搭建框架:
        
        int 7ch例程安装

        设置中断向量表
        
        程序返回
int7:
        寄存器入栈

        入口地址直接定值,sub 1、2、3、4

        寄存器出栈
int7end:nop

其次:编写测试程序测试上述功能,前提是先加载int 7ch例程。
    可以直接在debug中通过设置al和ah的值然后掉用int 7ch来实现。

补充:
向上滚动代码实现分析:
        第n+1(n从1开始)行的字符一个个覆盖第n行的字符,反复循环,循环次数80*24(屏幕行数减一)

完整程序如下:

assume cs:code 
code segment 
start:  mov ax,cs 
        mov ds,ax 
        mov si,offset int7;ds:si指向源地址 
        mov ax,0 
        mov es,ax 
        mov di,200h;es:si指向目的地址 
        mov cx,offset int7end - offset int7 
        cld 
        rep movsb 
         
        mov es:[7CH*4],200h 
        mov es:[7CH*4+2],0 

        mov ax,4c00h 
        int 21h 
         
int7:   push bx 
        jmp short begin 
        dw sub1-int7+200h, sub2-int7+200h, sub3-int7+200h, sub4-int7+200h;有无offset操作符皆可,这里为了程序看起来简洁,先略去 
  begin:cmp ah,3 
        ja int7ret 
        mov bl,ah 
        add bl,bl 
        mov bh,0 

        call cs:[bx+203h];push bx,jmp short begin占三个机器码 
         
int7ret:POP bx 
        mov ax,4c00h 
        int 21h 
;---------------------------------------------------         
sub1:   push ax 
        push cx 
        push es 
        push di 
         
        mov ax,0b800h 
        mov es,ax 
        mov di,0 
        mov cx,2000 
sub1_s:mov byte ptr es:[di],' ' 
        add di,2 
        loop sub1_s 
         
        pop di 
        pop es 
        pop cx 
        pop ax 
        ret 
;---------------------------------------------------         
sub2:   push ax 
        push cx 
        push es 
        push di 

        mov cx,0b800h 
        mov es,cx 
        mov di,1 
        mov cx,2000 
sub2_s:and byte ptr es:[di],11111000B 
        or byte ptr es:[di],al 
        add di,2 
        loop sub2_s 

        pop di 
        pop es 
        pop cx 
        pop ax 
        ret 
;------------------------------------------------- 
sub3:   push ax 
        push cx 
        push es 
        push di 

        mov cx,0b800h;注意这里不能用ax,因为al用来传递参数,当然也可以使用,不过要采取其他的手段,就显得麻烦了 
        mov es,cx 
        mov di,1 
        mov cl,4 
        shl al,cl 
        mov cx,2000 
sub3_s:and byte ptr es:[di],10001111B 
        or byte ptr es:[di],al 
        add di,2 
        loop sub3_s 

        pop di 
        pop es 
        pop cx 
        pop ax 
        ret 
;---------------------------------------------------- 
sub4:   push ax 
        push cx 
        push es 
        push di 
  
        mov ax,0b800h 
        mov es,ax 
        mov di,0 
        mov cx,80*24 
sub4_s:mov al,es:[di+160] 
        mov es:[di],al 
        add di,2 
        loop sub4_s 

        pop di 
        pop es 
        pop cx 
        pop ax 
        ret 
;------------------------------------------------------ 
int7end:nop 
code ends 
end start 


 

原文地址:https://www.cnblogs.com/xpjiang/p/4524427.html