看看我写的在xp下填充缓冲区显示的例子
>
楼主学习汇编?
话说这个不是用ASC码输出吧?
需要用画出来
我给你个画图 画一竖的程序
其他的还是自己弄吧 既然学汇编还是自己动手下
(还有最后一笔的点阵好难 、)
DATA SEGMENT
ROW DW 50
COL DW 150
COLOR DB 3
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV AH, 15
INT 10H ;取当前显示方式
PUSH AX ;保存数据
MOV AX, 0004H ;设置为四色显示
INT 10H
MOV AH, 0BH ;置彩色调色板
MOV BH, 01H ;置彩色组
MOV BL, 00H ;彩色组为0
INT 10H
PUSH AX
MOV AH, 0CH ;图形方式写像素
MOV AL, COLOR ;彩色值为COLOR
MOV DI, 100 ;
MOV DX, ROW ;第ROW行开始
@@1: MOV SI, 20
MOV CX, COL ;列为COL
@@2: INT 10H
INC CX ;右边一个像素继续涂色
DEC SI
JNZ @@2 ;列数为20列
INC DX ;下一行进行涂色
DEC DI ;涂完100行结束
JNZ @@1
POP AX
mov ah,01h ;键盘输入并回显
int 21h
POP AX ;取出AX
MOV AH, 0H ;设置文本显示方式为320200 4色图
INT 10H
MOV AH, 4CH ;结束程序
INT 21H
CODE ENDS
END START
; 演示文本方式下显示汉字的汇编源程序
;
; 文件名:mynameasm
;
;
; 说明: 本程序通过调用BIOS 10h替换系统字模来显示汉字
; 入口: ax=1100h
; bh=字模的高度(有效值:0~20h,默认值:10h)
; bl=被替换的字模集代号(有效值:0~7)
; cx=要替换的字模数
; dx=被替换的第一个字模所对应的字符的ASCII
; es:bp=新字模起始地址
; int 10h
; 要恢复系统字符集,可作如下调用:
; ax=1104h
; bl=字模集代号(有效值:0~7)
; int 10h
;
; 使用方法:
; masm myname;;
; link myname;;
; exe2bin mynameexe mynamecom
;
; 注意:本程序未按该字的机内码替换字模,因此不能运行在汉字 *** 作系统下; 也就是说,要想让程序在中英文下都能正常显示汉字,那么就要汉字的内码进行替换
codeseg segment public 'code'
;==============================
org 100h
assume es:codeseg,ss:codeseg
assume cs:codeseg,ds:codeseg,es:codeseg
;-----------------------------
main proc near
mov ax,1100h
mov bh,10h
mov bl,0
mov cx,6
mov dx,200
lea bp,mode
int 10h
mov ah,09h
lea dx,myname
int 21h
mov ah,7
int 21h
mov ax,1104h
mov bl,0
int 10h
mov ax,4c00h
int 21h
;(or int 20h)
main endp
;---------------------
mode db
100B,100B,111111B,100B,100B,11111111B,1B,11111B,10001B,11111B,10001B,11111B,10000B,100B,11000B,1100000B
db
01000000B,01010000B,11111000B,01000000B,01000100B,11111110B,00010000B,11111000B,00010000B,11110000B,00010000B,11110000B,00000000B,01100000B,00011000B,00000100B
db
1B,1B,1B,11111111B,1B,1B,1B,111111B,0B,10B,10001B,1010000B,1010000B,10010000B,1111B,0B
db
00000000B,00000000B,00000100B,11111110B,00000000B,00000000B,00010000B,11111000B,0B,00000000B,10000000B,10000100B,00010010B,00010010B,11110000B,0B
db
0B,100000B,10001B,0B,11111100B,1011B,1001000B,101000B,101001B,10001B,101001B,100101B,1000101B,10000001B,11B,0B
db
10000B,00010000B,11110100B,10010B,00010000B,11111110B,00010000B,01010000B,01010000B,01110000B,01010000B,01001000B,01001000B,01101010B,10000110B,10B
myname db 200,201,202,203,204,205,'$'
;======================
codeseg ends
end main
我用C语言写有一个程序可以直接从ucdos字库中读取指定的汉字的字模,并按汇编或C语
言数据格式存放到文件中,将它们放到相应的源程序中就可以了。
显示汉字的程序如下,可以在 PC 机上正常显示。
emu8086,能否显示,就不知道了。
;======================================================
CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 100H
START:
PUSH CS
POP DS
MOV AH, 0FH ;读取当前显示方式
INT 10H
PUSH AX
MOV AX, 12H ;设置点阵显示
INT 10H
MOV AX, 0A000H ;显示缓存段地址
MOV ES, AX
CLD
LEA SI, DOT
MOV DI, (30 80 + 10) 2
MOV CX, CNT / 2 ;=16
Q1:
; MOVSB ;SI加一, DI加一
; MOVSB ;SI加一, DI加一
MOVSW
ADD DI, 78 ;相当是加上80
LOOP Q1
MOV AH, 0 ;等待按键
INT 16H
POP AX
MOV AH, 00H ;恢复原来的显示方式
INT 10H
MOV AH, 4CH
INT 21H
;字模点阵 32字节, 是一个1616的汉字
;
DOT DB 00H, 3CH, 47H,0C0H, 32H, 48H, 11H, 50H, 8FH,0FEH, 61H, 50H, 22H, 48H, 0CH, 44H
DB 17H,0FEH, 24H, 44H,0E4H, 44H, 27H,0FCH, 24H, 44H, 24H, 44H, 27H,0FCH, 24H, 04H
;
DB 01H, 00H, 7FH,0FCH, 01H, 00H, 3FH,0F8H, 00H, 00H, 1FH,0F0H, 10H, 10H, 1FH,0F0H
DB 04H, 40H,0FFH,0FEH, 10H, 00H, 7EH,0F8H, 12H, 88H, 12H, 88H, 22H,0F8H, 4CH, 88H
;
DB 10H, 10H, 10H, 18H, 1CH, 14H, 23H,0FEH, 22H, 10H, 7EH, 10H, 92H, 10H, 13H,0D4H
DB 0FEH, 54H, 12H, 54H, 12H, 54H, 17H, 48H, 1AH, 98H, 12H, 2AH, 04H, 46H, 08H, 02H
CNT EQU $ - DOT ;=32
CODE ENDS
END START
;======================================================
程序中,DB 后面的数字0,代表的是:
汉字的点阵码。
楼主显示的代码,有些错误。
有些空格,被缩减了。
修改正确之后,运行结果是:
C:\MASM>WW
00000000 0
0000000
000000000
0
000000000
0
0 0
0 0
0 0
0 00
在写汉字之前的代码是不是确定了输出的位置,解决的思路:先把一行汉子写完(目前的代码功能?),然后,直接写第二次,只是位置向右偏移一列,然后顺便把最左边一列清除。感觉是这是dos下的com可执行文件。
以上就是关于用汇编显示汉字,图案全部的内容,包括:用汇编显示汉字,图案、汇编显示一个字符串的程序、汇编语言,用*显示汉字尹 大神帮帮忙吧,才做的任务求的分等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)