一步步编写操作系统 75 从显卡读取光标位置1
我們?cè)诖蛴∽址麜r(shí),通常都不用指定字符顯示的坐標(biāo)位置,大家也沒(méi)覺(jué)得有什么奇怪,原因是字符是在當(dāng)前光標(biāo)的位置處顯示的,而且光標(biāo)的位置會(huì)一直更新順延,我們的字符一直跟著光標(biāo)走,似乎光標(biāo)就是字符的導(dǎo)航一樣,而我們已經(jīng)習(xí)慣了跟隨光標(biāo)。我想大伙兒已經(jīng)清楚了光標(biāo)和字符的關(guān)系了,對(duì),它們的關(guān)系就是沒(méi)有任何關(guān)系^_^。“光標(biāo)在哪字符就在哪”,這是我們?nèi)藶橛幸庠O(shè)置的,我們是在光標(biāo)處打印字符。也就是說(shuō),我們也可以不在光標(biāo)處打印字符,讓光標(biāo)和字符的位置分開(kāi)。這一點(diǎn)在理論上就能證明,我們知道打印字符本質(zhì)上就是把字符寫(xiě)入在顯存中的某個(gè)地址處。在文本模式80*25下的顯存可以顯示80*25=2000個(gè)字符,每個(gè)字符占2字節(jié),低字節(jié)是字符的ascii碼,高字節(jié)是前景色和背景色屬性,所以在4000字節(jié)的顯存空間中,只要起始地址為偶數(shù)的任意2字節(jié)我們都可以寫(xiě)入字符,您看,這哪里是光標(biāo)能限制的。光標(biāo)只是個(gè)亮點(diǎn),用來(lái)吸引用戶眼球的,它能夠幫助咱們快速找到屏幕上的活躍位置,它本身與字符顯示的位置沒(méi)有關(guān)系。
話雖然這么說(shuō),但光標(biāo)的作用已經(jīng)被認(rèn)同為當(dāng)前可輸入或顯示字符的位置,字符在光標(biāo)處顯示,這已經(jīng)成了字符打印的傳統(tǒng)觀念,所以在咱們的實(shí)現(xiàn)中也要傳承復(fù)制這種觀念。
光標(biāo)是什么?不要感到奇怪,我是很認(rèn)真的說(shuō)。
我們Linux用戶最熟悉了,就是屏幕上那一小白豎塊,和文本軟件中的小豎線是一回事,它們都是用來(lái)告訴用戶當(dāng)前文本輸入點(diǎn)在哪里。光標(biāo)是字符的坐標(biāo),只不過(guò)該坐標(biāo)不是二維的,而是一維的線性坐標(biāo),是屏幕上所有字符以0為起始的順序。在默認(rèn)的80*25模式下,每行80個(gè)字符共25行,屏幕上可以容納2000個(gè)字符,故該坐標(biāo)值的范圍是0~1999。第0行的所有字符坐標(biāo)是0~24,第1行的所有字符坐標(biāo)是25~49,以此類推,最后一行的所有字符是1975~1999。由于一個(gè)字符是占用2字節(jié),所以光標(biāo)乘以2后才是字符在顯存中的地址。
光標(biāo)的坐標(biāo)位置是存放在光標(biāo)坐標(biāo)寄存器中的,當(dāng)我們?cè)谄聊簧蠈?xiě)入一個(gè)字符時(shí),光標(biāo)的坐標(biāo)并不會(huì)自動(dòng)+1,因?yàn)楣鈽?biāo)跟隨字符并不是必要的,比如我們想刪除文本中的某個(gè)字符時(shí),咱們就可以把光標(biāo)移動(dòng)到該字符后面,再按下delete鍵,這樣字符就被刪除了,這就是光標(biāo)與字符分離的應(yīng)用之一。所以,光標(biāo)位置并不會(huì)自動(dòng)更新,因?yàn)楣鈽?biāo)坐標(biāo)寄存器是可寫(xiě)的,如果需要的話,程序員可以自己來(lái)維護(hù)光標(biāo)的坐標(biāo)。
為了在光標(biāo)處打印字符,咱們得先知道光標(biāo)在哪,所以第一件事就是讀取光標(biāo)坐標(biāo)寄存器,獲取光標(biāo)坐標(biāo)值。
好了,以上是理論,下節(jié)咱們實(shí)戰(zhàn),下班吃飯。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的一步步编写操作系统 75 从显卡读取光标位置1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 银行客服的一个电话 差点让我损失1600
- 下一篇: 一步步编写操作系统 51 加载内核4