请问在纯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

编译之后,这个“我是李生”是乱码,请教如何才能显示汉字?
谢谢先
...全文
728 25 打赏 收藏 转发到动态 举报
写回复
用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)
NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多 的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16 位的'OBJ'和'Win32'。它还可以输出二进制文件。它的语法设计得相当的简 洁易懂,和Intel语法相似但更简单。它支持'Pentium','P6','MMX','3DNow!', 'SSE' and 'SSE2'指令集, 1.1.1 为什么还需要一个汇编器? NASM当初被设计出来的想法是'comp.lang.asm.x86'(或者可能是'alt.lang.asm' ,我忘了),从本质上讲,是因为没有一个好的免费的x86系例的汇编器可以使用, 所以,必须有人来写一个。 (*)'a86'不错,但不是免费的,而且你不可能得到32位代码编写的功能,除非你 付费,它只使用在dos上。 (*) 'gas'是免费的,而且在dos下和unix下都可以使用,但是它是作为'gcc'的一 个后台而设计的,并不是很好,'gcc'一直就提供给它绝对正确的代码,所以它的 错误检测功能相当弱,还有就是对于任何一个想真正利用它写点东西的人来讲, 它的语法简直太可怕了,并且你无法在里面写正确的16位代码。 (*) 'as86'是专门为Minix和Linux设计的,但看上去并没有很多文档可以参考。 (*) 'MASM'不是很好,并且相当贵,还且只能运行在DOS下。 (*) 'TASM'好一些,但却极入与MASM保持兼容,这就意味着无数的伪操作码和繁琐 的约定,并且它的语法本质上就是MASM的,伴随着的就是一些自相矛盾和奇怪的 东西。它也是相当贵的,并且只能运行在DOS下。 所以,只有NASM才能使您愉悦得编程。目前,它仍在原型设计阶段-我们不期望它 能够超越所有的这些汇编器。但请您发给我们bug报告,修正意见,和其他有用的 信息,还有其他任何你手头有的对我们有用的信息(感谢所有已经这样在做了的 人们),我们还会不断地改进它。

21,458

社区成员

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

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