书中P296提供的4个子程序,我在单独测试时就无法得到正常的结果(4个功能都是这样),一运行dos就直接崩掉了,看起来像是系统级的错误导致的,但是找不出原因,请大家帮忙看下。
程序如下:
;=========================
assume cs:code
code segment
start: call sub_1
mov cx, 4c00h
int 21h
;------功能0:清屏-----------
sub_1: push bx
push es
push cx
mov bx, 0B800h
mov es, bx
mov bx, 0
mov cx, 2000
loop_1: mov byte ptr es:[bx], ' ' ;屏幕显示空白
add bx, 2
loop loop_1
pop cx
pop es
pop bx
ret
;------功能1:设置前景色-----------
sub_2: push bx
push es
push cx
mov bx, 0B800h
mov es, bx
mov bx, 1
mov cx, 2000
loop_2: and byte ptr es:[bx], 11111000b ;根据al设置前景色
or es:[bx], al
add bx, 2
loop loop_2
pop cx
pop es
pop bx
ret
;------功能2:设置背景色-----------
sub_3: push bx
push es
push cx
mov cl, 4
shl al, cl
mov bx, 0B800h
mov es, bx
mov bx, 1
mov cx, 2000
loop_3: and byte ptr es:[bx], 10001111b ;根据al设置背景色
or es:[bx], al
add bx, 2
loop loop_3
pop cx
pop es
pop bx
ret
;------功能3:向上滚动1行-----------
sub_4: push cx
push si
push di
push es
push ds
mov bx, 0B800h
mov ds, bx
mov es, bx
mov si, 160
mov di, 0 ;ds:si(B800:160,即屏幕第2行为源数据), es:di(B800:0,即屏幕第1行为目标地址)
cld
mov cx, 24
loop_4: push cx
mov cx, 160
movsb
pop cx
loop loop_4 ;每次复制1行,共复制24次
mov cx, 80
mov si, 0
loop_s: mov byte ptr es:[160*24+si], ' '
add si, 2
loop loop_s
pop ds
pop es
pop di
pop si
pop cx
ret
code ends
end start |