A. 如何使用匯編語言程序設計方法在屏幕上輸出漢字
通過實踐,大概了解圖形模式下的工作方式,和漢字支持的基本實現方法。我的工作是讓系統啟動後在屏幕上顯示「漢字操作系統」五個漢字
說明:這里只介紹使用點陣字型檔。
准備工作:
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 ;640*480*16色模式下一條掃描線佔用的位元組數
;=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,因為是16*16點陣
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:
;對640*480*16和320*論200*256是標准VGA模式,在各種VGA上都分別為12h和13h
mov ax, 12h
int 10h 19_24.rar (39.92 KB)
關於中文支持的幾點想法:
1、「字元集」只是面向用戶的對問題的高層次的抽象。
當你把中文文檔保存在軟盤上帶回家時,上面存放著的是「字元集」中編碼的集合,它們以一種成為標準的方式定義著唯一的一個現實世界存在的漢字。但另一方面,這些編碼本身並不說明任何其它關於這個漢字的信息,比如發音?偏旁?等等,當你在另外一台機器上查看這個文檔時,必需有一個「顯示層」處在人和計算機之間,而這個顯示層如何實現並不重要,唯一重要的是它也必需知道編碼與漢字的對應關系,當它讀到一個處於某個「字元集」的編碼時,它就通過自身維護著的一個代碼轉換表將標準的編碼轉換成自己的字形信息碼,這是一個查表的過程,之後它根據查找到的信息「繪制」出一個特定的漢字。
2、這就意味著重要的是標准,而不是實現,當你要在一個英文平台上顯示漢字時,唯一困難的是確定一個相互不沖突的標准字元集,至於要顯示出什麼形狀根本不是問題。
3、為了確保兼容和跨平台,從軟體的角度說最好自帶字型檔,通過這個實例清楚了如何做到自帶字型檔,事實上因為這里實現的程序是以字而不是象通常那樣以位元組為單位讀字形信息,造成通常點陣字型檔中的編碼無法直接拿來用,那樣字的兩邊恰好顛倒,必須對每兩個位元組交換一次才能被它正確顯示出來。但是不難通過修改DispZhC中的代碼實現通用。
4、要實現矢量字形原理是一樣的,但是需要較多的數學方法,這就知道了理論的用途。想想為什麼一些計算機大師最初的動力竟是因為酷愛游戲。
B. 電腦是如何將字母轉換成漢字的
計算機時依靠漢字編碼的。
計算機一開始發明的時候,只是用來解決數字計算的問題。後來人們發現,計算機還可以做更多的事,正所謂能力越大,責任越大。但由於計算機只識「數」,因此人們必須告訴計算機哪個數字來代表哪個特定字元。
於是除了0、1這些阿拉伯數字,像a、b、c這樣的52個字母(包括大小寫),還有一些常用的符號(例如*、#、@等)在計算機中存儲時也要使用二進制數來表示,而具體用哪些二進制數字表示哪個符號,理論上每個人都可以有自己的一套規則(這就叫編碼)。
(2)如何將程序漢字化擴展閱讀
漢字涉及的編碼也比較多,包括區位碼、國標碼、機內碼、輸入碼、字形碼等。
1、區位碼
該標准收入了6763個常用漢字(其中一級漢字3755個,按漢語拼音排序;二級漢字3008個,按偏旁部首排序),以及英、俄、日文字母與其它符號682個,共計7445個字元,是中文信息處理的基礎。
整個字元集分成94個區,每區有94個位,每個區位上有一個漢字字元,共94*94=8836個漢字字元,用所在的區和位對漢字進行編碼,稱為區位碼。
2、國標碼
當時在制定GB2312之前,就決定覆蓋掉ASCII中符號和英文字母部分,所以將其中的英文字母和符號重新編入GB2312中。
而對於ASCII中前32個控制字元則繼續沿用。所以保留前32字元,就需要將漢字編碼向後偏移32,十六進制就是20H,也就是要對區碼和位碼分別加上20H,即區位碼加上2020H,得到的新的編碼就是國標碼。
C. 如何讓匯編程序顯示漢字 就是用cmd打開匯編程序,讓提示信息用漢字顯示
需要有中文DOS環境,利用int 21中斷顯示字元串