call-综合练习1
1. 清屏+打印字符+大写
assume cs:code,ds:data,ss:stack
data segment
db 'conversation',0 ; 0 是为了 jcxz
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start:
mov ax, stack
mov ss,ax
mov sp,128
call init_reg ; 初始化ds:data, es:0B800H的数据
call clear_screen ; 清屏的效果
call show_conversation
call up_letter
call re_show_conversation
testA:
mov ax,1000H
jmp testA
mov ax,4c00h
int 21h
up_letter:
mov si,0
call up_letter1
ret
up_letter1:
push cx
push ds
push si
push di
mov cx,0
up_letter2:
mov cl, ds:[si]
jcxz up_letter3
and byte ptr ds:[si],11011111B
inc si
jmp up_letter2
up_letter3:
pop di
pop si
pop ds
pop cx
ret
show_conversation:
mov si,0
mov di,160*10 + 40*2 ; 0690H
call show_conversation1
ret
re_show_conversation:
mov si,0
mov di,160*11 + 40*2 ; 0690H
call show_conversation1
ret
show_conversation1:
push cx
push ds
push es
push si
push di
mov cx,0
show_conversation2:
mov cl, ds:[si]
jcxz show_conversation3
mov es:[di], cl
add di,2 ; 0692H, 因为07是颜色, 所以加2
inc si
jmp show_conversation2
show_conversation3:
pop di
pop si
pop es
pop ds
pop cx
ret
init_reg:
mov bx, data
mov ds,bx
mov bx,0B800H
; mov bx,2000H ; 先用 2000H 代替显存段
mov es,bx
ret
clear_screen:
mov bx,0
mov dx,0700H ; 00 空字符, 07白色
; 显示缓冲区分为 8 页, 每页 4KB(≈4000B = 80x2x25,80 个字符 => 偶数列, 80 个颜色控制 => 奇数列)
mov cx,2000
clear_screen1:
mov es:[bx],dx ; 用 0007H 替换2000次数据, 一页
add bx,2
loop clear_screen1
ret
code ends
end start