通过实践,大概了解图形模式下的工作方式,和汉字支持的基本实现方法。我的工作是让系统启动后在屏幕上显示“汉字 *** 作系统”五个汉字
说明:这里只介绍使用点阵字库。
准备工作:
1、首先必须创建相应的点阵信息
我们来创建一个16×16的两个汉字的点阵,其实很简单,你在纸上画一个行列
各有16个格子的方块出来,然后按其大小,在里面写一个字,比如”成“,建
议你写得粗一点,这时你会发现有些格子中被字的笔画穿过,有的仍是空格
子,现在你把没有笔画穿过的记为0,有笔画的记为1,从第一行开始,将这个
16×16的“点阵”的信息记下来,由于每行有16个位,所以需要2个字节来记录一
行,共16行,所以共需2×16=32个字节来保存一个字的“点阵”
比如:汉-->00000h,04008h,037fch,01008h,08208h,06208h,02210h,00910h
01120h,020A0h,0E040h,020A0h,02110h,02208h,0240Eh,00804h
当然我这个“点阵”是从别的字库里载取出来的,但上面的方法绝对是可行的
点阵本质上就是这样生成的。
2、编写一个显示一个像素的子程序
面临的任务:在图形模式下,在屏幕上打印一个像素点
分析:
所需的变量:初始的左上角的坐标值x0,y0
默认参数: 默认分辨率为640×480×16色模式
(因为这是VGA标准BIOS支持的模式)
默认颜色为黑底黄字
实现:(参考了《VGA实用编程技术》罗健军 清华大学出版社 1995)
;功能:
; 在指定的屏幕位置用指定的颜色画一个点
;入口参数:
; bx = x0 象素在屏幕上的X坐标
; ax = y0 象素在屏幕上的Y坐标
; cl = color 象素的颜色值
writePix proc
linelen = 80 ;64048016色模式下一条扫描线占用的字节数
;=Width/8
;计算象素点的位置
push es
push bp
push dx
push ax
push di
push cx
push bx
mov bp,sp
mov cl,3
shr bx,cl ;X0/8
mov cx,linelen
mul cx
add ax,bx ;至此ax中为像素点的偏移,dx为页号
mov di,ax
;设置映象屏蔽寄存器
mov dx,sequen_ctl
mov al,2
out dx,al
inc dx
mov al,0fh ;四个位面全部充许写
out dx,al
;选择写方式2
mov dx,graphi_ctl
mov al,5
out dx,al
inc dx
mov al,2
out dx,al
;计算屏蔽码,并设置位屏蔽寄存器
dec dx
mov al,8
out dx,al
mov cx,[bp] ;取出X坐标
and cl,7
mov al,80h
shr al,cl
inc dx
out dx,al
;写数据
mov ax,vgaseg ;ES段指向显存地址0a000h
mov es,ax
mov ax,[bp+2] ;取颜色值
mov ah,es:[di] ;读一次使屏蔽寄存器有效
mov es:[di],al ;写入显示存储器
pop bx
pop cx
pop di
pop ax
pop dx
pop bp
pop es
ret
writePix endp
3、编写一个输出一个汉字图形字符的子程序,有了2的基础这一步显得比较容易,实现
如下:
;在图形模式下显示一个汉字
;输入参数:
; BX=x0 初始左上角X坐标
; AX=y0 初始左上角Y坐标
; CX=color 其实只是cl表示颜色
; ds:si=buff 字符点阵信息首地址
;返回值:无
DispZhC proc
push si
push bp
push ax
push bx
push cx
push dx
mov bp,sp
xor dx,dx ;dx 当前行
jmp a1
Disp:
inc si
inc si ;指向下一个字
inc dx ;行记数加一
a1:
cmp dx,16 ;当前行为0-15,因为是1616点阵
je Done
xor cx,cx ;cx 当前列初始化
mov bx,word ptr [si] ;读入一行的点阵信息,一行两个字节表示
DispL:
cmp cx,16
je Disp ;换行
or cx,cx ;清零CF
shl bx,1
jc DispP ;如果当前位是1,显示一个点
inc cx
jmp DispL
DispP:
push ax
push bx
push cx
mov ax,[bp+6]
add ax,dx
mov bx,[bp+4]
add bx,cx
mov cx,[bp+2] ;颜色值在cl中
call writePix
pop cx
inc cx
pop bx
pop ax
jmp DispL
Done:
pop dx
pop cx
pop bx
pop ax
pop bp
pop si
ret
DispZhC endp
4、编写一个输出一个字符串的子程序
面临的任务:你已经拥有显示一个字符的子程序,现在要对它连续调用,完整
地显示缓冲区中的全部汉字点阵。
分析:
所需的变量:整个字符串初始的左上角坐标x0,y0
字符串长度
在显示每个字符时传递给子程序的左上角坐标x1,y1
默认参数: 默认为16点阵
默认字间距为5个像素
程序主要结构:
一个单重循环,按字符串长度进行循环。
我的实现:
;在图形模式下显示指定长度的字符串
;输入参数:
; ds:si 字符串点阵缓冲区的首地址
; ax=y0 字符串第一个字符左上角的Y坐标
; bx=x0 字符串第一个字符左上角的X坐标
; ch=n
; cl=color
;返回值:无
DefDis = 5 ;每两个符号间的默认间距为5个像素
CharWidth = 16 ;默认为16点阵,这也是每个字符的像素宽度
DispZhS proc
push bp
push ax
push bx
push ds
push si
push cx
push dx
mov bp,sp
xor dx,dx
jmp s1
nextChar: ;指向下一个要输出的字符
add si,32
add bx,DefDis+CharWidth
s1:
cmp dh,ch ;是否已经输出了指定个数的字符
je Dones
call DispZhc
inc dh
jmp nextChar
Dones:
pop dx
pop cx
pop si
pop ds
pop bx
pop ax
pop bp
ret
DispZhS endp
5、标准VGA进入图形模式的方法
;进入640×480×16色模式
;setmode:
;对64048016和320论200256是标准VGA模式,在各种VGA上都分别为12h和13h
mov ax, 12h
int 10h 19_24rar (3992 KB)
关于中文支持的几点想法:
1、“字符集”只是面向用户的对问题的高层次的抽象。
当你把中文文档保存在软盘上带回家时,上面存放着的是“字符集”中编码的集合,它们以一种成为标准的方式定义着唯一的一个现实世界存在的汉字。但另一方面,这些编码本身并不说明任何其它关于这个汉字的信息,比如发音?偏旁?等等,当你在另外一台机器上查看这个文档时,必需有一个“显示层”处在人和计算机之间,而这个显示层如何实现并不重要,唯一重要的是它也必需知道编码与汉字的对应关系,当它读到一个处于某个“字符集”的编码时,它就通过自身维护着的一个代码转换表将标准的编码转换成自己的字形信息码,这是一个查表的过程,之后它根据查找到的信息“绘制”出一个特定的汉字。
2、这就意味着重要的是标准,而不是实现,当你要在一个英文平台上显示汉字时,唯一困难的是确定一个相互不冲突的标准字符集,至于要显示出什么形状根本不是问题。
3、为了确保兼容和跨平台,从软件的角度说最好自带字库,通过这个实例清楚了如何做到自带字库,事实上因为这里实现的程序是以字而不是象通常那样以字节为单位读字形信息,造成通常点阵字库中的编码无法直接拿来用,那样字的两边恰好颠倒,必须对每两个字节交换一次才能被它正确显示出来。但是不难通过修改DispZhC中的代码实现通用。
4、要实现矢量字形原理是一样的,但是需要较多的数学方法,这就知道了理论的用途。想想为什么一些计算机大师最初的动力竟是因为酷爱游戏。
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 7; j++) // 打印每行的个数
{
if (i == 1 || i == 2) {
if (j == 7) {
Systemoutprint(" J");
}
}
if (i == 3) {
if (j == 1) {
Systemoutprint("J ");
}
if (j == 5) {
Systemoutprint("J");
}
}
if (i == 4) {
if (j == 1) {
Systemoutprint(" J ");
}
if (j == 4) {
Systemoutprint("J ");
}
}
}
for (int j = 1; j <= 7; j++) // 打印每行的个数
{
if (i == 1 && j == 1) {
Systemoutprint(" A ");
}
if (i == 2 && j == 1) {
Systemoutprint(" A A ");
}
if (i == 3 && j == 1) {
Systemoutprint(" AAAAA ");
}
if (i == 4 && j == 1) {
Systemoutprint(" A A ");
}
}
for (int j = 1; j <= 7; j++) // 打印每行的个数
{
if (i == 1 && j == 1) {
Systemoutprint("V V");
}
if (i == 2 && j == 1) {
Systemoutprint(" V V ");
}
if (i == 3 && j == 1) {
Systemoutprint(" V V ");
}
if (i == 4 && j == 1) {
Systemoutprint(" V ");
}
}
for (int j = 1; j <= 7; j++) // 打印每行的个数
{
if (i == 1 && j == 1) {
Systemoutprint(" A ");
}
if (i == 2 && j == 1) {
Systemoutprint(" A A ");
}
if (i == 3 && j == 1) {
Systemoutprint(" AAAAA ");
}
if (i == 4 && j == 1) {
Systemoutprint(" A A ");
}
}
Systemoutprintln();
}
矢量图不是怎么画的问题,首先你得先知道什么是矢量图
计算机中显示的图形一般可以分为两大类——矢量图和位图。矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真。Adobe公司的Freehand、Illustrator、Corel公司的CorelDRAW是众多矢量图形设计软件中的佼佼者。大名鼎鼎的FlashMX制作的动画也是矢量图形动画。
矢量图像,也称为面向对象的图像或绘图图像,在数学上定义为一系列由线连接的点。矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。既然每个对象都是一个自成一体的实体,就可以在维持它原有清晰度和弯曲度的同时,多次移动和改变它的属性,而不会影响图例中的其它对象。这些特征使基于矢量的程序特别适用于图例和三维建模,因为它们通常要求能创建和 *** 作单个对象。基于矢量的绘图同分辨率无关。这意味着它们可以按最高分辨率显示到输出设备上。
矢量图与位图最大的区别是,它不受分辨率的影响。因此在印刷时,可以任意放大或缩小图形而不会影响出图的清晰度
矢量图:是根据几何特性来绘制图形,矢量可以是一个点或一条线,矢量图只能靠软件生成,文件占用内在空间较小,因为这种类型的图像文件包含独立的分离图像,可以自由无限制的重新组合。它的特点是放大后图像不会失真,和分辨率无关,文件占用空间较小,适用于图形设计、文字设计和一些标志设计、版式设计等。
点阵0~9显示
TIM EQU 30H
CNTA EQU 31H
CNTB EQU 32H
ORG 0000H
LJMP START
;
ORG 0BH ;//定时中断0 中断向量地址
;
LJMP T0_Inter;
ORG 30H
START: MOV TIM,#00H
MOV CNTA,#00H
MOV CNTB,#00H
MOV TMOD,#01H
MOV TH0,#(65536-4000)/256
MOV TL0,#(65536-4000) MOD 256
SETB TR0
;开启T0中断
SETB ET0 ; 允许T0中断
SETB EA ;开总中断
SJMP $ ;原地踏步
;定时中断服务程序
T0_Inter:
MOV TH0,#(65536-4000)/256
MOV TL0,#(65536-4000) MOD 256
MOV DPTR,#TAB
MOV A,CNTA
MOVC A,@A+DPTR
MOV P2,A
MOV DPTR,#DIGIT
MOV A,CNTB
MOV B,#8
MUL AB
ADD A,CNTA
MOVC A,@A+DPTR
MOV P0,A
INC CNTA
MOV A,CNTA
CJNE A,#8,NEXT
MOV CNTA,#00H
NEXT: INC TIM
MOV A,TIM
CJNE A,#250,NEX
MOV TIM,#00H
INC CNTB
MOV A,CNTB
CJNE A,#10,NEX
MOV CNTB,#00H
NEX: RETI
TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
DIGIT: DB 00H,00H,3EH,41H,41H,41H,3EH,00H
DB 00H,00H,00H,00H,21H,7FH,01H,00H
DB 00H,00H,27H,45H,45H,45H,39H,00H
DB 00H,00H,22H,49H,49H,49H,36H,00H
DB 00H,00H,0CH,14H,24H,7FH,04H,00H
DB 00H,00H,72H,51H,51H,51H,4EH,00H
DB 00H,00H,3EH,49H,49H,49H,26H,00H
DB 00H,00H,40H,40H,40H,4FH,70H,00H
DB 00H,00H,36H,49H,49H,49H,36H,00H
DB 00H,00H,32H,49H,49H,49H,3EH,00H
END
你用什么软件做标志
矢量文件,比如:CDR,AI,EPS等格式文件
文件无限放大,没有马赛克
矢量图
计算机中显示的图形一般可以分为两大类——矢量图和位图。矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真。Adobe公司的Illustrator、Corel公司的CorelDRAW是众多矢量图形设计软件中的佼佼者。大名鼎鼎的FlashMX制作的动画也是矢量图形动画。
矢量图像,也称为面向对象的图像或绘图图像,在数学上定义为一系列由线连接的点。矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。既然每个对象都是一个自成一体的实体,就可以在维持它原有清晰度和弯曲度的同时,多次移动和改变它的属性,而不会影响图例中的其它对象。这些特征使基于矢量的程序特别适用于图例和三维建模,因为它们通常要求能创建和 *** 作单个对象。基于矢量的绘图同分辨率无关。这意味着它们可以按最高分辨率显示到输出设备上。
1、首先我们打开电脑里的PS软件,双击PS的图表打开PS这个软件,新建一个大小为300800像素,分辨率为72像素每英寸,点击确定进行创建。
2、长按PS工具栏中的文字工具,在d出的文字工具组中选择“直排文字工具”,选择这种文字工具就可以在PS画布中输入竖版文字了,在PS画布中输入文字内容“我爱你”。
3、选中文字图层,用鼠标左键双击该图层,选中所有文字内容,找到并打开“字符”窗口,设置文字的字体,字号等属性。
4、找到我们事先准备好的你喜欢的,将直接拖入到PS中或者通过PS文字菜单中的导入命令也可以将导入到PS中。
5、上一步中导入的,我们发现大小是不合适的,所有将鼠标贴近的四角位置,按住shift键将该旋转90度,在同比进行放大,放大到直到将文字内容全部覆盖住即可。
6、将导入的图层前面的小眼睛点击关闭,从而将该图层进行隐藏,选中文字图层,按住辅助键Ctrl键单击文字图层,产生一个文字范围的选区。
7、在将图层前面的小眼睛点开,将图层进行显示,选中该图层,单击图层下方的“添加矢量蒙版”命令,给图层添加一个蒙版。
8、在上一步添加蒙版之后,其实效果就已经出来了,我们会发现一个填充了的文字就出现了,至此,一个可以随意填充自己喜欢的的文字效果就制作完成了。
以上就是关于如何使用汇编语言程序设计方法在屏幕上输出汉字全部的内容,包括:如何使用汇编语言程序设计方法在屏幕上输出汉字、用java编写程序显示字符编排图案、矢量图怎么画等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)