请问在纯DOS汇编,如何才能显示汉字?

imur2008 2009-02-12 04:16:37
请问在纯DOS汇编,如何才能显示汉字?

.model small
.stack 200h
.data
szMsg db 'Hello World!我是李生',13,10,'$'

.CODE
START:
mov ax,@data
mov ds,ax
lea dx,szMsg
mov ah,9
int 21h

;暂停,任意键关闭
mov ah,1
int 21h
mov ah,4ch ;结束,可以修改al设置返回码
int 21h

END START

编译之后,这个“我是李生”是乱码,请教如何才能显示汉字?
谢谢先
...全文
919 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangjieest 2012-01-06
  • 打赏
  • 举报
回复
文本模式如何装入字模啊...
imur2008 2009-02-17
  • 打赏
  • 举报
回复
结贴致谢!!!
子然在打码 2009-02-14
  • 打赏
  • 举报
回复
学习了~~~
ahjoe 2009-02-13
  • 打赏
  • 举报
回复
中文DOS下 (比如CCDOS, TWAY32, UCDOS等), 直接输出字符串(含汉字)即可。
如果你不用中文系统,有两种方式:
一种是文本模式显示汉字,有点复杂,将一个汉字拆分成两个字符并将其字模写入显卡的字符发生器;
另一种简单点,是图形模式下在屏幕上画出汉字的每一点。
imur2008 2009-02-13
  • 打赏
  • 举报
回复
这个步骤应该是多余的
tc安装好了应该不要设置,可以直接使用的吧?
tc本身都有complie,build等菜单命令
xtdumpling 2009-02-13
  • 打赏
  • 举报
回复
nmake.exe在masm或者vc的bin目录下面有
给它设置路径,如set path=%toolpath%\msvc\bin;%toolpath%\masm\bin;%toolpath%\tc\bin;%path%

运行setEnv.bat后运行nmake,nmake会默认使用makefile编译链接.


当然,用TC也行,在Options->Linker->Libraries里,把Graphices library选上,应该就可以编译了.


用makefile比较自由,方便;有兴趣可以google nmake看看.
imur2008 2009-02-13
  • 打赏
  • 举报
回复
hanzi.c这个我保存,修改了那个安装目录
直接在tc3.0下编译,不能通过
请问老大,我的qq 27 1937 025,能不能加我的帮看看?谢谢先
搞定加300分
imur2008 2009-02-13
  • 打赏
  • 举报
回复
谢谢老大!我现在在测试
请问makefile是什么文件,是不是bat文件?编译的时候,不是tc可以自动完成吗?为什么要使用这个makefile呢?
运行nmake all ==这个nmake我目录下没有呢?

请教,谢谢先
xtdumpling 2009-02-13
  • 打赏
  • 举报
回复
可能还要修改这一行
initgraph(&gd,&gm,"E:\\Tools\\ptools\\tc\\bgi"); /*这里是我的tc安装路径中的bgi目录*/
xtdumpling 2009-02-13
  • 打赏
  • 举报
回复
/* hanzi.c */
#include <graphics.h>
#include <stdio.h>
#define ROW 1
#define COL 2
int main(void)
{
int x,y;
char *s="文字显示示例,这是一行文字。";/*汉字中不能夹杂英文*/
FILE *fp;
char buffer[32];
register m,n,i,j,k;
unsigned char qh,wh;
unsigned long offset;
int gd=DETECT,gm=0;

initgraph(&gd,&gm,"E:\\Tools\\ptools\\tc\\bgi"); /*这里是我的tc安装路径中的bgi目录*/
if ((fp=fopen("hzk16","rb"))==NULL) /* put this file to your project directory */
{
printf("Can't open hzk16,Please add it");
getch();
closegraph();
exit(1); /*好处?*/
}
x=20; y=100;
while(*s)
{
qh=*(s)-0xa0;
wh=*(s+1)-0xa0;
offset=(94*(qh-1)+(wh-1))*32L; /*16*16点阵*/
fseek(fp,offset,SEEK_SET);/*在字库文件中定位当前位置*/
fread(buffer,32,1,fp); /*从当前位置读取数据*/
for (i=0;i <16;i++) /*16行*/
for(n=0;n <ROW;n++)
for(j=0;j <2;j++) /*每行2个字节*/
for(k=0;k <8;k++) /*每个字节8位*/
for(m=0;m <COL;m++)
if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL) /*i=0,j=0,k=0*/
putpixel(x+8*j*COL+k*COL+m,y+i*ROW+n,GREEN);/*32*16显示,横向拉长一倍*/
s+=2; x+=32;
}
getch();
closegraph();
return 0;
}


Makefile,自动编译文件
[code=BatchFile]#/******************************************************************************
#
# Module description:Turbo C++ Makefile for Hanzi.exe code.
#
#*******************************************************************************/

#/*----------------------------------------------------------
# Copyright (c) 2006 by
# All rights reserved.
#*-----------------------------------------------------------

#*********************************************
#* path define
#*********************************************
#*INCPATH and LIBPATH are defined in build.bat
#*

CC = tcc.exe
LINK = tlink.exe
AS = ml.exe
PROGRAMS = Hanzi

CFLAGS = -c -I$(INCPATH)
LFLAGS = /m /L$(LIBPATH)

MAIN_OBJS = $(PROGRAMS).obj

LIBS= emu.lib maths.lib cs.lib GRAPHICS.LIB

#*******************************************************************************


all: $(PROGRAMS).exe


#*******************************************************************************
# SOURCE and OBJECT FILE DEPENDENCIES
#*******************************************************************************

.c.obj:
$(CC) $(CFLAGS) $*.c


#*******************************************************************************
# EXE & COM FILE DEPENDENCIES
#*******************************************************************************

$(PROGRAMS).exe : $(MAIN_OBJS)
@echo >nul @<<$(PROGRAMS).CRF
$(LIBPATH)\c0s.obj +
$(MAIN_OBJS)
$(PROGRAMS).EXE
$(PROGRAMS).MAP
emu.lib+
maths.lib+
cs.lib+
GRAPHICS.LIB
<<
$(LINK) $(LFLAGS) @$(PROGRAMS).CRF

$(PROGRAMS).obj:$(PROGRAMS).c
$(CC) $(CFLAGS) $*.c


#*******************************************************************************
# CLEANUP COMMANDS
#*******************************************************************************

clean:
@if EXIST *.obj del *.obj
@if EXIST *.map del *.map
@if EXIST *.exe del *.exe
@echo Clean complete![/code]

setEnv.bat,设置环境参数:(nmake.exe 和 TC 3.0的)
[code=BatchFile]@echo off
set toolpath=E:\Tools\ptools
set path=%toolpath%\msvc\bin;%toolpath%\masm\bin;%toolpath%\tc\bin;%path%
set INCPATH=%toolpath%\tc\include
set LIBPATH=%toolpath%\tc\lib
@echo on[/code]

1.自己修改setEnv.bat里面的参数
2.CMD进到源文件目录,运行nmake all

Win 2000 + TC 3.0 编译,链接,运行通过.
捕鲸叉 2009-02-12
  • 打赏
  • 举报
回复
我以前一个同事用turboc在没有中文DOS的情形下显示出有限个的汉字,应该是硬画出来的。
xtdumpling 2009-02-12
  • 打赏
  • 举报
回复
C的是有,汇编的没见过

适用于C语言编程中汉字显示程序。以下是使用范例:
http://download.csdn.net/source/604747
imur2008 2009-02-12
  • 打赏
  • 举报
回复
采用外部调用.EXE文件?请问能不能细点说说?

谢谢先
imur2008 2009-02-12
  • 打赏
  • 举报
回复
源代码见:http://download.csdn.net/source/604747

从http://download.csdn.net/source/604747下载的字库我改名为dianzhen.hzk,发到和t.c一个目录下C:\Program Files\WINYES\TC201E

/*源代码我只是修改2个地方,我改过的如下:*/
#include <graphics.h>
#include <stdio.h>
#define ROW 1
#define COL 2
void main()
{
int x,y;
char *s="文字显示示例,这是一行文字。";/*汉字中不能夹杂英文*/
FILE *fp;
char buffer[32];
register m,n,i,j,k;
unsigned char qh,wh;
unsigned long offset;
int gd=DETECT,gm=0;
/*
initgraph(&gd,&gm,"C:\\TURBOC2"); /*这里是tc安装路径中的bgi目录,请替换为您的安装路径*/
if ((fp=fopen("C:\\TURBOC2\\dianzhen.hzk","rb"))==NULL)
*这两行是原来的,我改成下面的2行,其它的代码没有动/
initgraph(&gd,&gm,"C:\\Program Files\\WINYES\\TC201E\BGI"); /*这里是我的tc安装路径中的bgi目录*/
if ((fp=fopen("dianzhen.hzk","rb"))==NULL)
{
printf("Can't open dianzhen.hzk,Please add it");
getch();
closegraph();
exit(0); /*好处?*/
}
x=20; y=100;
while(*s)
{
qh=*(s)-0xa0;
wh=*(s+1)-0xa0;
offset=(94*(qh-1)+(wh-1))*32L; /*16*16点阵*/
fseek(fp,offset,SEEK_SET);/*在字库文件中定位当前位置*/
fread(buffer,32,1,fp); /*从当前位置读取数据*/
for (i=0;i<16;i++) /*16行*/
for(n=0;n<ROW;n++)
for(j=0;j<2;j++) /*每行2个字节*/
for(k=0;k<8;k++) /*每个字节8位*/
for(m=0;m<COL;m++)
if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL) /*i=0,j=0,k=0*/
putpixel(x+8*j*COL+k*COL+m,y+i*ROW+n,GREEN);/*32*16显示,横向拉长一倍*/
s+=2; x+=32;
}
getch();
closegraph();
}
BAYNPU 2009-02-12
  • 打赏
  • 举报
回复
可以采用外部调用.EXE文件,来显示'Hello World!我是李生'信息.
imur2008 2009-02-12
  • 打赏
  • 举报
回复
安装UCDOS,是不是一定要运行才能使用他的字库?
我见过一个DOS下的管理系统,黑黑的屏幕可以显示汉字和英文字母

UCDOS运行的时候,屏幕下面有一条淡蓝色的显示汉字的条子

请教有没有不是UCDOS的方法?

谢谢先
lbh2001 2009-02-12
  • 打赏
  • 举报
回复
可以使用UCDOS
killbug2004 2009-02-12
  • 打赏
  • 举报
回复
系统中断提供的是ascii,要用第三方的库,如c的dos16运行库
BAYNPU 2009-02-12
  • 打赏
  • 举报
回复
你把源程序贴出来看看。
imur2008 2009-02-12
  • 打赏
  • 举报
回复
现在是只有c文件,编译提示成功了
但是看不到exe文件,不知是不是没有真正编译成功?

请教
加载更多回复(5)

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧