本来按照书上的流程,自己走了一遍,想着是没有问题。可是死活出现不了预想的结果。
在网上查了一下,发现都有这个问题。原因在call word ptr table[bx]这里,对于解析理解的不是很好,只是在setscreen程序之前加上org 200h就可以了。
而org 200的作用是将该指令以后的内容,全部存放在00;[200]起始的位置上。有点纠结。。。
代码如下:
;install int 7ch to realize the test 16
assume cs:code
code segment
start:
;传递int 7ch位置
mov ax,0
mov es,ax
mov ax,0200h
mov di,ax
mov ax,cs
mov ds,ax
mov si,offset setscreen
mov cx,offset setscreenend-offset setscreen
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],0200h
mov word ptr es:[7ch*4 +2],0
mov ah,1
mov al,1
int 7ch
mov ax,4c00h
int 21h
;设置屏幕
org 200h
setscreen:
jmp short set
table dw s1,s2,s3,s4
set:
push bx
cmp ah,3
ja setret
mov bh,0
mov bl,ah
add bx,bx
call word ptr cs:table[bx]
mov ax,4c00h
int 21h
setret:
pop bx
iret
;清屏,将显存中所有字符设置为空格符
s1:
push bx
push es
push cx
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
s1s:
mov byte ptr es:[bx],' '
add bx,2
loop s1s
pop cx
pop es
pop bx
ret
;设置前景色
s2:
push bx
push es
push cx
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
;前景色存放在0,1,2位置,由al决定
s2s:
and byte ptr es:[bx],11111000b
or byte ptr es:[bx],al
add bx,2
loop s2s
pop cx
pop es
pop bx
ret
;设置背景色
s3:
push bx
push es
push cx
mov cl,4
shl al,cl
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
;前景色存放在0,1,2位置,由al决定
s3s:
and byte ptr es:[bx],10001111b
or byte ptr es:[bx],al
add bx,2
loop s3s
pop cx
pop es
pop bx
ret
;向上滚动一行
s4:
push bx
push es
push cx
push di
push si
mov bx,0b800h
mov es,bx
mov ds,bx
mov si,160 ;指向第二行
mov di,0
mov cx,24 ;屏幕共24行
cld
s4s:
push cx
mov cx,160
rep movsb
pop cx
loop s4s
mov si,160*24
mov cx,80
s4ss:
mov byte ptr es:[si],' '
add si,2
loop s4ss
pop si
pop di
pop cx
pop es
pop bx
ret
setscreenend:nop
code ends
end start