如何用汇编语言显示汉字

如何用汇编语言显示汉字,第1张

用汇编语言显示汉字,也就是把汉字当作中文字符卖码串,因为定义缓烂字符串时,看到的是中文,实际存储的是中文内码,一个汉字占两个字节;当输出到屏幕上时,只要是中文系统平台,显示的就是汉字,在不是中文系统的中哪哪平台上,则显示乱码。

以下是示例程序:

data

segment

string

db

'山花烂漫$'

data

ends

code

segment

assume

cs:code,ds:data

main

proc

far

start:

mov

ax,data

mov

ds,ax

mov

dx,offset

string

mov

ah,09h

int

21h

mov

ah,4ch

int

21h

ret

main

endp

运用int 10h中断……

比如要显示“一”,则先编码:

00000000 00

00000000 00

00000000 00

00000000 00

11111111 ff

00000000 00

00000000 00

00000000 00

然后再写:

one db 00h,00h,00h,00h,0ffh,00h,00h,00h

mov ax, ds

mov es, ax

mov ah, 10h 子功能号

mov al, 00h 加载自定义字符

mov bh, 08h 每个字符占字节数

mov bl, 00h 字符表

mov cx, 01h 自定义字符数量

mov dx, 41h 自定义字符ASCII开始值,这里是从'A'开始

lea bp, one 指针es:bp指向自定义字符表

int 10h 执行修改……

然后输出字符'A'就是自己定义的“一”字了,举唤拍用同样的方法定义其他汉正羡字……

一般汉字是一个ASCII占半个汉字,也就是先编码左半边,再编链租码右半边……

http://hi.baidu.com/hnhhww/blog/item/5f018a32b61f0283a9018ef6.html?timeStamp=1321491942953

在DOS下用字符当衡禅点阵显示汉字

可用左右光标键翻页,<ESC>退出

需下载HZK16点阵字库支持

data segment

DISP_C DB 'H' 填充点阵字符

DISP_A DB 05 属性字节

qs dw 30h+4*0a0h 定义显示缓冲区起始位置 30H是列起始位,4为起始行,0A0H

为每行字节数(含属性字节)

file_n db 'hzk16',0

buf db 32 dup(0)

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12406460.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存