日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用BIOS以及直接写显存绘制图形

發(fā)布時(shí)間:2025/6/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用BIOS以及直接写显存绘制图形 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

注:以下程序系由相應(yīng)的Intel格式匯編改編而來(lái),略有修改,若發(fā)現(xiàn)bug,歡迎指正。若有問(wèn)題,歡迎交流。若能幫助一二訪客,幸甚。


一年前仿照Skelix 寫過(guò)一個(gè)簡(jiǎn)單的內(nèi)核,并命名為BabyOS。當(dāng)時(shí)代碼大部分用的Skelix的,終究有些遺憾,所以想趁今年寒假--工作前最后一個(gè)假期,重新實(shí)現(xiàn)一下BabyOS,力求盡量用自己的代碼實(shí)現(xiàn)。所以前幾天學(xué)習(xí)了一下AT&T 匯編、內(nèi)聯(lián)匯編及C與匯編的相互調(diào)用。下一個(gè)問(wèn)題就是顯示,經(jīng)過(guò)許多考慮,這次準(zhǔn)備嘗試一下圖形界面的系統(tǒng)(因?yàn)榭瓷先ジ腥ば?#xff09;,或許有點(diǎn)舍本求末的嫌疑,但我寫個(gè)OS kernel主要是好玩,從未想有正式應(yīng)用,所以怎么好玩就怎么來(lái)。

昨晚研究了下BIOS INT 0x10顯示字符,今晚決定不管有用沒有先學(xué)習(xí)一下BIOS INT 0x10及實(shí)模式下寫顯存來(lái)顯示圖形的知識(shí)。

1.繪制像素

[cpp] view plaincopyprint?
  • -----------------------------------------------------------------------??
  • ????????????????????????INT?0x10可識(shí)別的視頻圖形模式??
  • --------------------------------------------------------------------??
  • 模式??????????分辨率(列*行,像素)???顏色數(shù)??
  • 6???????????????????640x200?????????????????2??
  • 0DH?????????????????320x200?????????????????16??
  • 0EH?????????????????640x350?????????????????16??
  • 0FH?????????????????640x350?????????????????2??
  • 10H?????????????????640x200?????????????????16??
  • 11H?????????????????640x480?????????????????2??
  • 12H?????????????????640x480?????????????????16??
  • 13H?????????????????320x200?????????????????256??
  • 6AH?????????????????800x600?????????????????16??
  • -----------------------------------------------------------------------??
  • 當(dāng)視頻控制器處于圖形模式時(shí),INT 0x10的功能0CH在屏幕上繪制一個(gè)像素點(diǎn)。(功能0CH執(zhí)行的相當(dāng)慢)

    [cpp] view plaincopyprint?
  • -----------------------------------------------------------------------??
  • ????????????????????????INT?0x10?功能0CH??
  • ---------------------------------------------------------------??
  • 描述:??
  • ????寫像素??
  • 接受參數(shù):??
  • ????AH??????????0CH??
  • ????AL??????????像素值??
  • ????BH??????????視頻頁(yè)??
  • ????CX??????????X坐標(biāo)??
  • ????DX??????????Y坐標(biāo)??
  • 返回值:??
  • ????無(wú)??
  • 注意:??
  • ????視頻顯示必須處于圖形模式下。像素值的范圍和坐標(biāo)范圍與當(dāng)前的圖形模式有關(guān)。??
  • ????如果AL的位7置位,新的像素同當(dāng)前像素的內(nèi)容進(jìn)行異或運(yùn)算。??
  • -------------------------------------------------------------------------??

  • 示例,畫線程序:
    [cpp] view plaincopyprint?
  • #?This?program?draws?a?straight?line?in?graphics?mode.??
  • #?2012-12-24?20:42??
  • #?guzhoudiaoke@126.com??
  • ??
  • .section?.text??
  • .global?_start??
  • .code16??
  • ??
  • _start:??
  • ????jmp?????main??
  • ??
  • clear_screen:???????????????#?清屏函數(shù)??
  • ????movb????$0x06,??%ah?????#?功能號(hào)0x06??
  • ????movb????$0,?????%al?????#?上卷全部行,即清屏??
  • ????movb????$0,?????%ch?????#?左上角行??
  • ????movb????$0,?????%ch?????#?左上角列????
  • ????movb????$24,????%dh?????#?右下角行??
  • ????movb????$79,????%dl?????#?右下角列??
  • ????movb????$0x07,??%bh?????#?空白區(qū)域?qū)傩??
  • ????int?????$0x10??
  • ????ret??
  • ??
  • main:??
  • ????movw????%cx,????%ax??
  • ????movw????%ax,????%ds??
  • ????movw????%ax,????%es??
  • ??
  • ????call????clear_screen????#?清屏??
  • ??
  • ????#?設(shè)置成圖形模式,0x6a為800x600,?16種顏色??
  • ????movb????$0,?????%ah?????#?功能號(hào)0x0??
  • ????movb????$0x6a,??%al?????#?顯示模式??
  • ????int?????$0x10??
  • ??
  • ????#?畫一條直線??
  • ????movb????$0x0,???%bh?????#?視頻頁(yè)??
  • ????movw????$300,???%dx?????#?y坐標(biāo)??
  • ????movw????$100,???%cx?????#?x坐標(biāo)??
  • ????movb????$0x0c,??%ah?????#?功能號(hào)??
  • ????movb????$9,?????%al?????#?像素值(顏色)??
  • 1:????
  • ????int?????$0x10??
  • ????incw????%cx?????????????#?下一個(gè)像素??
  • ????cmpw????$700,???%cx?????#?是否到了結(jié)束位置??
  • ????jne?????1b??
  • ??
  • 1:??
  • ????jmp?????1b??
  • ??
  • ????.org????0x1fe,??0x90??
  • ????.word???0xaa55??

  • 結(jié)果:


    2.圖形模式用功能0x13顯示字符串

    [cpp] view plaincopyprint?
  • #?This?program?draws?text?and?a?straight?line?in?graphics?mode.??
  • #?2012-12-24?20:42??
  • #?guzhoudiaoke@126.com??
  • ??
  • .section?.text??
  • .global?_start??
  • .code16??
  • ??
  • _start:??
  • ????jmp?????main??
  • ??
  • clear_screen:???????????????#?清屏函數(shù)??
  • ????movb????$0x06,??%ah?????#?功能號(hào)0x06??
  • ????movb????$0,?????%al?????#?上卷全部行,即清屏??
  • ????movb????$0,?????%ch?????#?左上角行??
  • ????movb????$0,?????%ch?????#?左上角列????
  • ????movb????$24,????%dh?????#?右下角行??
  • ????movb????$79,????%dl?????#?右下角列??
  • ????movb????$0x07,??%bh?????#?空白區(qū)域?qū)傩??
  • ????int?????$0x10??
  • ????ret??
  • ??
  • main:??
  • ????movw????%cx,????%ax??
  • ????movw????%ax,????%ds??
  • ????movw????%ax,????%es??
  • ??
  • ????call????clear_screen????#?清屏??
  • ??
  • ????#?設(shè)置成圖形模式,0x6a為800x600,?16種顏色??
  • ????movb????$0,?????%ah?????#?功能號(hào)0x0??
  • ????movb????$0x6a,??%al?????#?顯示模式??
  • ????int?????$0x10??
  • ??
  • ????#?顯示文字??
  • ????movw????$msgstr,%ax??
  • ????movw????%ax,????%bp??
  • ????movw????len,????%cx??
  • ????movb????$0x13,??%ah??
  • ????movb????$0,?????%al??
  • ????movb????$0x04,??%bl??
  • ????movb????$0x0,???%bh??
  • ????movb????$0x02,??%dh??
  • ????movb????$0x04,??%dl??
  • ????int?????$0x10??
  • ??
  • ????#?畫一條直線??
  • ????movb????$0x0,???%bh?????#?視頻頁(yè)??
  • ????movw????$300,???%dx?????#?y坐標(biāo)??
  • ????movw????$100,???%cx?????#?x坐標(biāo)??
  • ????movb????$0x0c,??%ah?????#?功能號(hào)??
  • ????movb????$9,?????%al?????#?像素值(顏色)??
  • 1:????
  • ????int?????$0x10??
  • ????incw????%cx?????????????#?下一個(gè)像素??
  • ????cmpw????$700,???%cx?????#?是否到了結(jié)束位置??
  • ????jne?????1b??
  • ??
  • 1:??
  • ????jmp?????1b??
  • ??
  • msgstr:??
  • ????.asciz??"line:?start(100,?300),?end(700,?300)\n"??
  • len:??
  • ????.int????.?-?msgstr??
  • ??
  • ????.org????0x1fe,??0x90??
  • ????.word???0xaa55??

  • 結(jié)果:


    3.內(nèi)存映射圖形

    對(duì)于內(nèi)存映射圖形視頻模式0x13最容易使用。這時(shí)屏幕像素映射為一個(gè)字節(jié)數(shù)組,每個(gè)像素一個(gè)字節(jié)。
    共有320*200個(gè)像素,因?yàn)橛?56種顏色,所以每個(gè)像素一個(gè)字節(jié)。左上角像素對(duì)應(yīng)地址0xa0000。
    模式0x13中,每個(gè)整數(shù)色彩值表示調(diào)色板的色彩表的索引。調(diào)色板中每個(gè)項(xiàng)都由三個(gè)獨(dú)立的整數(shù)(0~63)構(gòu)成,稱為RGB值。調(diào)色板的第0項(xiàng)控制著屏幕的背景色。
    有兩個(gè)輸出端口用于控制視頻調(diào)色板:送往端口0x3c8的值表示要修改的調(diào)色板表項(xiàng),送往端口0x3c9的是要修改的顏色值。
    示例:
    [cpp] view plaincopyprint?
  • #?This?program?draws?color?pixels?at?mode?0x13??
  • #?2012-12-24?21:31??
  • #?guzhoudiaoke@126.com??
  • ??
  • .section?.text??
  • .global?_start??
  • .code16??
  • ??
  • _start:??
  • ????jmp?????main??
  • ??
  • #--------------------------------------------------------------??
  • #?清屏函數(shù):??
  • #???設(shè)置屏幕背景色,調(diào)色板的索引0指代的顏色為背景色??
  • clear_screen:???????????????#?清屏函數(shù)??
  • ????movb????$0x06,??%ah?????#?功能號(hào)0x06??
  • ????movb????$0,?????%al?????#?上卷全部行,即清屏??
  • ????movb????$0,?????%ch?????#?左上角行??
  • ????movb????$0,?????%ch?????#?左上角列????
  • ????movb????$24,????%dh?????#?右下角行??
  • ????movb????$79,????%dl?????#?右下角列??
  • ????movb????$0x07,??%bh?????#?空白區(qū)域?qū)傩??
  • ????int?????$0x10??
  • ????ret??
  • ??
  • #----------------------------------------------------------------??
  • #?設(shè)置顯示模式函數(shù)??
  • set_video_mode:??
  • ????movb????$0,?????????%ah?????????#?功能號(hào)0x0??
  • ????movb????$MODE_0X13,?%al?????????#?顯示模式??
  • ????int?????$0x10??
  • ????ret??
  • ??
  • #---------------------------------------------------------------??
  • #?顯示一些文字函數(shù):??
  • #???使用INT?0x10中斷0x13功能,顯示計(jì)算機(jī)當(dāng)前工作的顯示模式??
  • draw_some_text:??
  • ????movw????$msg_str,???%bp?????????#?ES:BP為字符串地址??
  • ????movw????msg_len,????%cx?????????#?顯示字符數(shù)??
  • ????movb????$0x13,??????%ah?????????#?功能號(hào)??
  • ????movb????$0,?????????%al?????????#?顯示模式??
  • ????movb????$TEXT_COLOR,%bl?????????#?屬性值??
  • ????movb????$0,?????????%bh?????????#?視頻頁(yè)??
  • ????movb????$TEXT_ROW,??%dh?????????#?顯示起始行??
  • ????movb????$TEXT_COL,??%dl?????????#?顯示起始列??
  • ????int?????$0x10??
  • ??
  • ????ret??
  • ??
  • #----------------------------------------------------------------??
  • #?設(shè)置背景顏色為深藍(lán)色??
  • set_screen_bk_color:??
  • ????movw????$VIDEO_PALLETE_PORT,????%dx??
  • ????movb????$PA_INDEX_BACKGROUND,???%al??
  • ????outb????%al,????????????????????%dx??
  • ??
  • ????movw????$COLOR_SELECTION_PORT,??%dx??
  • ????movb????$0,?????????????????????%al?????#?紅??
  • ????outb????%al,????????????????????%dx??
  • ????movb????$0,?????????????????????%al?????#?綠??
  • ????outb????%al,????????????????????%dx??
  • ????movb????$18,????????????????????%al?????#?藍(lán)(亮度18/63)??
  • ????outb????%al,????????????????????%dx??
  • ????ret??
  • ??
  • #----------------------------------------------------------------??
  • #?通過(guò)寫顯存繪制一些像素點(diǎn):??
  • #???首先設(shè)置調(diào)色板索引1處的顏色為白色??
  • #???然后通過(guò)寫顯存的方式,向ES:DI寫入數(shù)據(jù)(PA_INDEX_WHITE)??
  • draw_some_pixels:??
  • ????#?把索引1處的顏色改為白色(63,63,63)??
  • ????movw????$VIDEO_PALLETE_PORT,????%dx??
  • ????movb????$PA_INDEX_WHITE,????????%al??
  • ????outb????%al,????????????????????%dx??
  • ????movw????$COLOR_SELECTION_PORT,??%dx??
  • ????movb????$63,????????????????????%al?????#?紅??
  • ????outb????%al,????????????????????%dx??
  • ????movb????$63,????????????????????%al?????#?綠??
  • ????outb????%al,????????????????????%dx??
  • ????movb????$63,????????????????????%al?????#?藍(lán)??
  • ????outb????%al,????????????????????%dx??
  • ??
  • ????#?設(shè)置ES的值??
  • ????movw????$VIDEO_SEG_GRAPHIC,?????%ax??
  • ????movw????%ax,????????????????????%es??
  • ??
  • ????#?設(shè)置要顯示的像素位置的顯存地址(目的地址)??
  • ????movw????$(PIXEL_ROW_ST*320?+?PIXEL_COL_ST),?%di??
  • ????movb????$PA_INDEX_WHITE,????????%al??
  • ????movw????$PIXEL_COUNT,???????????%cx??
  • ??
  • draw_a_pixel:??
  • ????stosb??
  • ????addw????$5,?????????????????????%di??
  • ????loop????draw_a_pixel??
  • ??
  • ????ret??
  • ??
  • main:??
  • ????movw????%cx,????%ax??
  • ????movw????%ax,????%ds??
  • ????movw????%ax,????%es??
  • ??
  • ????call????clear_screen????????#?清屏??
  • ????call????set_video_mode??????#?設(shè)置顯示模式??
  • ????call????set_screen_bk_color?#?設(shè)置背景顏色??
  • ????call????draw_some_text??????#?繪制字符串??
  • ????call????draw_some_pixels????#?繪制像素??
  • ??
  • 1:??
  • ????jmp?????1b??
  • ??
  • #?常量定義:??
  • ????VIDEO_SEG_TEXT??????=?0xb800??
  • ????VIDEO_SEG_GRAPHIC???=?0xa000??
  • ??
  • ????VIDEO_PALLETE_PORT??=?0x3c8??
  • ????COLOR_SELECTION_PORT=?0x3c9??
  • ??????
  • ????MODE_0X13???????????=?0x13??
  • ??
  • ????PA_INDEX_BACKGROUND?=?0x0??
  • ????PA_INDEX_WHITE??????=?0x1??
  • ??
  • ????TEXT_ROW????????????=?0x01??
  • ????TEXT_COL????????????=?0x00??
  • ????TEXT_COLOR??????????=?0x04??
  • ??
  • ????PIXEL_ROW_ST????????=?100??
  • ????PIXEL_COL_ST????????=?160-5*10??
  • ????PIXEL_COUNT?????????=?20??
  • ??
  • msg_str:??
  • msg_mode:??
  • ????.asciz??"video?mode:?0x13"??
  • ????.org????msg_mode+40,????????0??
  • msg_scr_res:??
  • ????.asciz??"screen?resolution:320x200"??
  • ????.org????msg_scr_res+40,?????0??
  • msg_color_num:??
  • ????.asciz??"color?num:256"??
  • ????.org????msg_color_num+40*4,?0??
  • msg_babyos:??
  • ????.asciz??"The?new?Baby?OS?will?have?a?GUI,but?now?it?can?only?draw?some?pixels,?haha..And?merry?Christmas!"??
  • msg_len:??
  • ????.int????.?-?msg_str?-?1??
  • ??
  • ????.org????0x1fe,??0x90??
  • ????.word???0xaa55??

  • 結(jié)果:


    注釋:

    文字是用的BIOS INT 0x10顯示的,VGA的0x13模式下顯示的文字為40列x25行,字符框8x8,看上去有點(diǎn)丑,以后再研究下超級(jí)VGA(SVGA)吧~


    總結(jié)

    以上是生活随笔為你收集整理的使用BIOS以及直接写显存绘制图形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。