assume cs:code
code segment
start:
mov ax, cs
mov ds, ax
mov si, offset setscreen
mov ax, 0h
mov es, ax
mov di, 200h
mov cx, offset setscreenend - offset setscreen
cld
rep movsb
mov word ptr es:[7ch*4], 200h
mov word ptr es:[7ch*4+2], 0h
mov ax, 4c00h
int 21h
setscreen:
jmp short set
;由于中断例程运行时,没有了本程序的开头部分(start:),
;此时要注意由于数据标号table、四个子程序sub1,sub2,sub3,sub4
;他们代表的地址在编译期间已经由编译器确定的,就是相对于本程序起始地址的偏移量
;即相对于start地址的偏移量。所以如果直接使用编译器计算的地址(本章的例子就是这样的)
;就会出现错误,为此只有我们自己计算地址才行。
table dw offset sub1 - offset setscreen + 200h, offset sub2 - offset setscreen + 200h, offset sub3 - offset setscreen + 200h,offset sub4 - offset setscreen + 200h
set:
push bx
cmp ah, 3
ja sret
mov bl, ah
mov bh, 0
add bx, bx
call word ptr cs:202h[bx]
sret:
pop bx
iret
sub1:
push bx
push cx
push es
mov bx, 0b800h
mov es, bx
mov bx, 0
mov cx, 2000
sub1s:
mov byte ptr es:[bx], ' '
add bx, 2
loop sub1s
pop es
pop cx
pop bx
ret
sub2:
push bx
push cx
push es
mov bx, 0b800h
mov es, bx
mov bx, 1
mov cx, 2000
sub2s:
mov byte ptr es:[bx], 11111000b
or es:[bx], al
add bx, 2
loop sub2s
pop es
pop cx
pop bx
ret
sub3:
push bx
push cx
push es
mov cl, 4
shl al, cl
mov bx, 0b800h
mov es, bx
mov bx, 1
mov cx, 2000
sub3s:
and byte ptr es:[bx], 10001111b
or es:[bx], al
add bx, 2
loop sub3s
pop es
pop cx
pop bx
ret
sub4:
push cx
push si
push di
push es
push ds
mov si, 0b800h
mov es, si
mov ds, si
mov si, 160
mov di, 0
cld
mov cx, 24
sub4s:
push cx
mov cx, 160
rep movsb
pop cx
loop sub4s
mov cx, 80
mov si, 0
sub4s1:
mov byte ptr [160*24+si], ' '
add si, 2
loop sub4s1
pop ds
pop es
pop di
pop si
pop cx
ret
setscreenend:
nop
code ends
end start
- [qiangzi] 楼主有空的话能帮我装一下dos吗?我一直装不上,qq519710391,先谢谢! 02/06 20:34
- [zwz_good] 看到自己的注释能给别人带来帮助,心里非常高兴,也许这就是帮助别人的快乐吧。 10/20 16:23
- [游客] 程序测试了一下,没什么问题。 10/20 14:25
- [游客] 博主程序中的那部分注释说明非常重要,非常有用,非常有帮助。好啊。 10/20 14:15
- [zwz_good] 谢谢你的鼓励。 10/10 20:56
- [游客] 自己实现更能体会过程,有好处,做完了再做便捷的就知道便捷在哪了。 顶博主! 10/10 14:25
- [zwz_good] 噢,习惯了使用这个子程序了,再来一个使用INT 21H中断的,谢谢提醒。 10/09 20:25
- [tinyparticle] ;名称:show_str 显示字符串子程序 ;功能:在指定的位置,用指定的颜色,显示一个用0 10/09 20:17
- [tinyparticle] 同意楼上 10/08 22:56
- [20081148] 你的7ch中断例程有问题,题目要求实现无条件段内近转移 jmp near ptr s指令,可你的代码 10/08 22:24
- [20081148] 你的虚拟机从哪下的啊?我下了好几个,都不能用,无语了。 10/21 08:53