code segment
assume cs:code, ds:code
begin:
;----使文本显示模式扩展为全屏----
mov ax,12h
INT 10H ;置图形模式
mov ax, 3
INT 10H ;置文本模式
;-----设置数据段、扩展段初值------
mov bx, cs
mov ds, bx
mov es, bx
;-----从显示字库A处替换为“长春大学”字模-----
lea bp, buffer ;取字模首址
mov dx, 41h ;从显示字库A处替换
mov cx, 8 ;换8个字
mov bx, 1000h
mov ax, 1100h ;装入用户字体
int 10h
;-------扩展段值指向显存地址-------
mov ax,0b800h
mov es,ax
;------ 显示指针指向左上角 ------
mov dx,0 ;显示指针指向左上角
next:
cld ;正序显示
mov di,dx ;
lea si,string ;指向串首
mov ah,07 ;字色为白
mov cx,10 ;10个字符
he:lodsb ;取一字
stosw ;存入显存
loop he ;显示下一字
;-------------------------------
mov ah,1
int 16h ;有按键按下吗?
jz new
mov ah,0
int 16h ;取其键值
cmp al,0dh ;是回车吗?
jz exit
new:
call delay
add dx,2 ;后移一个位置(2/-2)
num:
cmp dx,0 ;已到最左边了吗?
jz kkk
cmp dx,140 ;已到最右边了吗?
jnz it
kkk:
neg byte ptr cs:[num-1] ;2/-2互换
it: jmp next ;在新位置重新显示
exit:
mov ah,4ch
int 21h ;返回DOS
DELAY PROC
push dx
push cx
push ax
mov cx,10
@t:
mov dx,3dah
ta: in al,dx
test al,8
jnz ta
tb: in al,dx
test al,8
jz tb
loop @t
pop ax
pop cx
pop dx
ret
DELAY ENDP
string db ' ABCDEFGH '
;------以下为长春大学 16X16 字模点阵数据-----------
buffer db 5 dup(8), 9, 8, 0FFh, 2 dup(9), 3 dup(8)
db 9, 0Eh, 8, 0, 10h, 30h, 40h, 80h, 0, 4
db 0FEh, 2 dup(0), 80h, 40h, 20h, 1Ch, 8
db 0, 1, 7Fh, 1, 3Fh, 2, 0FFh, 4, 8, 1Fh
db 28h, 0C8h, 0Fh, 2 dup(8), 0Fh, 8, 0, 0FCh
db 0, 0F8h, 0, 0FEh, 40h, 20h, 0F0h, 2Eh
db 24h, 0E0h, 2 dup(20h), 0E0h, 20h, 5 dup(1)
db 0FFh, 1, 3 dup(2), 2 dup(4), 8, 10h, 60h
db 5 dup(0), 4, 0FEh, 0, 2 dup(80h), 2 dup(40h)
db 20h, 10h, 0Eh, 4, 0, 22h, 2 dup(11h)
db 0, 7Fh, 40h, 80h, 1Fh, 0, 1, 0FFh, 3 dup(1)
db 5, 2, 2 dup(8), 10h, 20h, 0FEh, 2, 4
db 0E0h, 40h, 84h, 0FEh, 6 dup(0)
;****************
code ends
end begin
大哥们谁能告诉我下mov ax, 1100h。。。中的1100H是什么得出来的。还有mov ax,0b800h
。。是怎么算出来的。。。
------解决方案--------------------------------------------------------
mov ax, 1100h ;装入用户字体
int 10h
;这个调用提供的功能是设置与获取MCGA或VGA+上的字符生成属性。这里,AH=11,表示的是字符生成功能,AL=00,表示转入用户字体。BH=每个字符的字节数(1-12),BL=字节页,CX=要装入的字体字符数,DX=表中的字符号(0-255),ES:BP=字体表的首地址。这些都是dos调用手册里所解释的。
mov ax,0b800h;这个值表示的是显存地址,也是固定的