用户:
鹅少GL查看:0 回复:0 评论:0 创建时间:2022-04-06T20:19:16
众所周知编程语言大多都是老外编写在低层语言汇编之中使用的编码是ASCLL无法显示中文字符以及汉字等注:图形化操作系统同原理 如果你是要显示汉字或者图形 就得向0x800的显卡内存缓冲区域写入字模点以及像素点让bios以及芯片来处理 //以下是字模点生成 #include<stdio.h> intmain(void) {undefined FILE*fphzk=NULL; errno_terr; inti,j,k,offset; intflag; unsignedcharbuffer[32]; unsignedcharword[3]=“我”; unsignedcharkey[8]={undefined 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 }; //fphzk=fopen("D:/hzk16k","rb"); err=fopen_s(&fphzk,"D:/hzk16k","rb");//楷体显示的字符 if(fphzk==NULL){ fprintf(stderr,"errorhzk16\n"); return1; } offset=(94*(unsignedint)(word[0]-0xa0-1)+(word[1]-0xa0-1))*32; fseek(fphzk,offset,SEEK_SET); fread(buffer,1,32,fphzk); for(k=0;k<32;k++){ printf("%02X",buffer[k]); } for(k=0;k<16;k++){ for(j=0;j<2;j++){ for(i=0;i<8;i++){ flag=buffer[k*2+j]&key[i]; printf("%s",flag?"●":"○"); } } printf("\n"); } fclose(fphzk); fphzk=NULL; return0; ;接着是DB让喵U分配安全内存 WORD1DB01H,00H,01H,00H,01H,20H,05H,10H,19H,00H,09H,70H,0FH,80H,38H,90H,0AH,0A0H,0CH,40H,38H,0C0H,0CBH,24H,18H,14H,08H,0CH,00H,04H,00H,00H WORD2DB00H,00H,00H,20H,08H,20H,08H,40H,10H,58H,2CH,0E8H,75H,08H,46H,88H,74H,48H,44H,48H,44H,08H,3CH,08H,24H,28H,00H,10H,00H,00H,00H,00h WORD3DB00H,40H,10H,40H,08H,40H,00H,40H,00H,40H,30H,7CH,0D3H,0C0H,10H,40H,10H,40H,14H,40H,18H,40H,10H,40H,00H,40H,00H,40H,00H,40H,00H,00H word4db08H,58H,0FH,60H,08H,90H,15H,00H,23H,0C0H,04H,40H,07H,40H,04H,40H,07H,0C0H,04H,7EH,7FH,0C0H,04H,40H,04H,40H,08H,40H,10H,40H,00H,00H word5db10H,00H,10H,00H,10H,00H,10H,70H,1CH,90H,70H,0A0H,10H,0A0H,18H,0A0H,34H,0A0H,51H,22H,91H,22H,12H,1EH,14H,00H,10H,00H,00H,00H,00H,00H word6db00H,00H,00H,00H,00H,00H,00H,0E0H,0FH,00H,01H,00H,01H,00H,01H,00H,01H,00H,01H,00H,01H,0FCH,7EH,00H,00H,00H,00H,00H,00H,00H,00H,00H word7db00H,40H,08H,40H,08H,80H,08H,9CH,11H,0E0H,31H,40H,52H,40H,94H,78H,10H,40H,10H,40H,10H,78H,10H,40H,10H,40H,00H,40H,00H,40H,00H,00H word8db00H,00H,00H,00H,00H,0F0H,0FH,00H,01H,00H,01H,00H,09H,30H,09H,0C0H,09H,00H,09H,00H,09H,00H,09H,0FCH,0FEH,00H,00H,00H,00H,00H,00H,00H word9db01H,20H,09H,40H,05H,00H,0FH,0F8H,70H,08H,4FH,0D0H,48H,80H,07H,00H,01H,0E0H,0FH,20H,09H,20H,09H,60H,09H,20H,01H,00H,01H,00H,00H,00H 接下里就是那些汇编程序: DATASSEGMENT ;字模数据,可用字模生成程序生成,替换掉此处即可,此处使用的是16*16的黑体字模,3喵yte/字 TWDB01H,00H,01H,00H,01H,20H,05H,10H,19H,00H,09H,70H,0FH,80H,38H,90H,0AH,0A0H,0CH,40H,38H,0C0H,0CBH,24H,18H,14H,08H,0CH,00H,04H,00H,00H DB00H,00H,00H,20H,08H,20H,08H,40H,10H,58H,2CH,0E8H,75H,08H,46H,88H,74H,48H,44H,48H,44H,08H,3CH,08H,24H,28H,00H,10H,00H,00H,00H,00h DB00H,40H,10H,40H,08H,40H,00H,40H,00H,40H,30H,7CH,0D3H,0C0H,10H,40H,10H,40H,14H,40H,18H,40H,10H,40H,00H,40H,00H,40H,00H,40H,00H,00H db08H,58H,0FH,60H,08H,90H,15H,00H,23H,0C0H,04H,40H,07H,40H,04H,40H,07H,0C0H,04H,7EH,7FH,0C0H,04H,40H,04H,40H,08H,40H,10H,40H,00H,00H db10H,00H,10H,00H,10H,00H,10H,70H,1CH,90H,70H,0A0H,10H,0A0H,18H,0A0H,34H,0A0H,51H,22H,91H,22H,12H,1EH,14H,00H,10H,00H,00H,00H,00H,00H db00H,00H,00H,00H,00H,00H,00H,0E0H,0FH,00H,01H,00H,01H,00H,01H,00H,01H,00H,01H,00H,01H,0FCH,7EH,00H,00H,00H,00H,00H,00H,00H,00H,00H db00H,40H,08H,40H,08H,80H,08H,9CH,11H,0E0H,31H,40H,52H,40H,94H,78H,10H,40H,10H,40H,10H,78H,10H,40H,10H,40H,00H,40H,00H,40H,00H,00H db00H,00H,00H,00H,00H,0F0H,0FH,00H,01H,00H,01H,00H,09H,30H,09H,0C0H,09H,00H,09H,00H,09H,00H,09H,0FCH,0FEH,00H,00H,00H,00H,00H,00H,00H db01H,20H,09H,40H,05H,00H,0FH,0F8H,70H,08H,4FH,0D0H,48H,80H,07H,00H,01H,0E0H,0FH,20H,09H,20H,09H,60H,09H,20H,01H,00H,01H,00H,00H,00H DATASENDS STACKSSEGMENT DW10DUP(?) STACKSENDS CODESSEGMENT ASSUMECS:CODES,DS:DATAS,SS:STACKS START: MOVAX,DATAS MOVDS,AX; MOVAX,STACKS MOVSS,AX;设置栈段寄存器 MOVSP,20;设置栈顶偏移地址 MOVAH,0FH INT10H;读当前显示方式至AX中 PUSHAX;当前显示方式入栈 MOVAX,12H INT10H;设置显示方式为VGA彩色 MOVDI,(30*80+10)*2;DI控制显示位置,喵0*480分辨率,可显示80*60字节,第i行汉字写入时DI为80*16*i~80*16*i+78,相邻汉字DI差2 CALLDISPLAY;调用显示过程 MOVAH,01 INT21H;等待输入,暂停作用 POPAX;AX出栈 MOVAH,00H INT10H;恢复原来显示方式 MOVAX,4C00H;退出程序 INT21H DISPLAY: ;输出‘我的计算机工作正常’-------------------- MOVAX,0A000H;VGA写入起始段地址 MOVES,AX;设置传送目标段地址 CLD;CLD指令使DF=0,正向传输字 MOVCX,9;连续的字数,此处“我的计算机工作正常”共9字 LEASI,TW;需写入汉字字模的首地址 DIS1: PUSHCX;多重循环,CX入栈 PUSHSI PUSHDI MOVCX,16 DISWORD1: MOVSW ADDDI,78;转到下一行字模写入位置,一个汉字16*16,故需写16行 LOOPDISWORD1 POPDI POPSI POPCX ADDSI,32;读取下一个汉字的字模数据,由于一个汉字占用3喵yte,故加上32 ADDDI,2;开始写下一个汉字,默认写在上一个字右边 LOOPDIS1 RET ;-----------------------------