安装一个新的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