|
发表于 2012-7-15 16:50:49
|
显示全部楼层
- ;用MASM5.0编译通过. 左右光标键变换汉字,【ESC】退出。(另须下载一个16点阵汉字库HZK16)
- ;在DOS下用字符当点阵显示汉字
- data segment
- DISP_C DB 'H' ;填充点阵字符
- DISP_A DB 05 ;属性字节
- qs dw 30h+4*0a0h ;定义显示缓冲区起始位置 30H是列起始位,4为起始行,0A0H
- 为每行字节数(含属性字节)
- file_n db 'hzk16',0
- DB 'HHHHHHHH'
- buf db 32 dup(0)
- DB 'HHHHHHHH'
- err_s db 0dh,0ah,'Open file HZK16 err! 帮你找了下参考代码。
- file_hand dw 0
- data ends
- code segment
- assume cs:code, ds:data
- main proc far
- start:
- push ds
- xor ax,ax
- push ax
- mov ax,data
- mov ds,ax
- MOV AH,0FH ;CLS
- INT 10H
- MOV AH,0
- INT 10H
- ;-------------------------
- mov ah,3dh ;open file
- mov dx ,offset file_n
- mov al,0 ;read
- int 21h
- jNc OPEN_FILE_OK
- mov ah,9
- mov dx,offset err_s ;Open file HZK16 err!
- int 21h
- ret
-
- OPEN_FILE_OK:
- mov file_hand,ax ;save file hand
-
- mov ax,'雅'
- NN:
- PUSH AX ;汉字进栈
- sub ax,0a1a1h
- puSh ax
- xchg ah,al
- xor ah,ah
- mov bl,94 ;汉字共94区,每一区94位
- mul bl
- pop bx
- xor bh,bh
- add ax,bx
- mov bx,32
- mul bx ;待显示汉字在字库的起始位置是:DX:AX
- MOV CX,DX
- MOV DX,AX
- MOV AH,42H ;移动文件指针到CX:DX位置
- MOV AL,0 ;从字库文件HZK16起始位置计算
- MOV BX,FILE_HAND
- INT 21H
- MOV AH,3FH ;READ FILE
- MOV BX,FILE_HAND
- MOV CX,32 ;READ 32 BYTE
- MOV DX,OFFSET BUF
- INT 21H
-
- MOV AX,0B800H ;DISP
- MOV ES,AX
- MOV SI,QS
- MOV BX,OFFSET BUF ;READ 16X16 HZK16
- MOV CX,16 ;每次读入2字节,需读16次 (共32字节)
- N1:
- MOV AX,[BX]
- XCHG AH,AL
- CALL DISP
- INC BX
- INC BX
- ADD SI,0A0H-32 ;DISP NEXT 行
- LOOP N1
- POP DX ;汉字出栈
- K_1:
- MOV AH,1
- INT 16H
- JZ K_1
- CMP AH,4BH ;<<< 前一个汉字
- JZ LEFT
- CMP AH,4DH ;>>> 后一个汉字
- JZ RIGHT
- CMP AL,1BH ;<ESC> TO EXIT
- JZ EXIT
- JMP KEY_C
- LEFT:
- SUB DL,1
- JMP KEY_C
- RIGHT:
- ADD DL,1
- KEY_C: ;清键盘缓冲区
- PUSH DS
- PUSH AX
- PUSH BX
- MOV AX,40H
- MOV DS,AX
- MOV BX,1AH
- MOV AX,[BX]
- ADD BX,2
- MOV [BX],AX
- POP BX
- POP AX
- POP DS
- MOV AX,DX ;循环前将汉字存AX
- JMP NN
-
- EXIT:
- RET
- main endp
- ;========================
- DISP PROC NEAR ;每次显示2个字节共16位
- PUSH CX
- MOV CX,16
- N2:
- ROL AX,1
- JC DISP1
- MOV DL,' '
- JMP DISP_K
- DISP1:
- MOV DL,DISP_C
- DISP_K:
- MOV ES:[SI],DL
- MOV DL,DISP_A
- INC SI
- MOV ES:[SI],DL
- INC SI
- LOOP N2
- POP CX
- RET
- ;========================
-
- code ends
- end start
复制代码 帮你找了下参考代码。
|
|