<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 1.BIOS中斷 我們可以為所有中斷類型自定義中斷處理過程,包括內部中斷、硬件中斷和軟中斷。 BIOS中斷,又稱BIOS功能調用,主要是為了方便地使用最基本的硬件訪問功能。通常,為了區分針對同一硬件的不同功能,使用寄存器AH來指定具體的功能編號。 比如說,以下的指令用于從鍵盤讀取一個按鍵: ~~~ mov ah,0x00 ;0功能號對應從鍵盤讀字符 int 0x16 ;鍵盤服務, int 0x16 ; 中斷返回時,字符的ASCII在AL中 ~~~ 需要說明的是,BIOS可能會為一些簡單地外圍設備提供初始化代碼和功能調用代碼,并填寫中斷向量表,但是有一些BIOS中斷是由外部設備接口自己建立的。 首先,每個外部設備接口,包括各種板卡,如網卡、顯卡、鍵盤接口電路、硬件控制器等,都有自己的只讀存儲器(ROM),類似于BIOS芯片,這些ROM中提供了它們自己的功能調用例程,以及本設備的初始化代碼。按照規范,前兩個單元的內容是0x55和0xAA,第三個單元是本ROM中的代碼長度(以512字節為單位);從第四個單元開始,就是實際的ROM代碼。 其次,我們知道,從內存物理地址A0000開始,到FFFFF結束,有相當一部分空間是留給外圍設備的。如果設備存在,那么它自帶的ROM會映射到分配給它的地址范圍內。 在計算機啟動期間,BIOS會以2KB為單位搜索內存地址C0000~E0000之間的區域。當它發現某個區域的前兩個字節是0x55和0xAA時,那意味著該區域有ROM代碼的存在,是有效的。接著,它對該區域做累加和檢查,看結果是否和第三個單元相符。如果相符,就從第四個單元進入。這時候,處理器執行的是硬件自帶的程序指令,這些指令初始化外部設備的相關寄存器和工作狀態。最后,填寫相關的中斷向量表,使其指向自帶的中斷處理過程。 # 2.鍵盤讀字符并顯示的實驗 ### (1)代碼清單 ~~~ ;代碼清單9-2 ;文件名:c09_2.asm ;文件說明:用于演示BIOS中斷的用戶程序 ;創建日期:2012-3-28 20:35 ;=============================================================================== SECTION header vstart=0 ;定義用戶程序頭部段 program_length dd program_end ;程序總長度[0x00] ;用戶程序入口點 code_entry dw start ;偏移地址[0x04] dd section.code.start ;段地址[0x06] realloc_tbl_len dw (header_end-realloc_begin)/4 ;段重定位表項個數[0x0a] realloc_begin: ;段重定位表 code_segment dd section.code.start ;[0x0c] data_segment dd section.data.start ;[0x14] stack_segment dd section.stack.start ;[0x1c] header_end: ;=============================================================================== SECTION code align=16 vstart=0 ;定義代碼段(16字節對齊) start: mov ax,[stack_segment] mov ss,ax mov sp,ss_pointer mov ax,[data_segment] mov ds,ax mov cx,msg_end-message mov bx,message .putc: mov ah,0x0e mov al,[bx] int 0x10 inc bx loop .putc .reps: mov ah,0x00 int 0x16 mov ah,0x0e mov bl,0x07 int 0x10 jmp .reps ;=============================================================================== SECTION data align=16 vstart=0 message db 'Hello, friend!',0x0d,0x0a db 'This simple procedure used to demonstrate ' db 'the BIOS interrupt.',0x0d,0x0a db 'Please press the keys on the keyboard ->' msg_end: ;=============================================================================== SECTION stack align=16 vstart=0 resb 256 ss_pointer: ;=============================================================================== SECTION program_trail program_end: ~~~ ### (2)使用BIOS中斷向屏幕寫字符 關于代碼,頭部的部分和SS,DS的初始化自然不用多說,我們已經很熟悉了。 ~~~ mov cx,msg_end-message mov bx,message .putc: mov ah,0x0e mov al,[bx] int 0x10 inc bx loop .putc ~~~ 首先,把重復次數傳入CX,然后讓BX指向要顯示的信息的首地址。 接下來,我們要利用0x10號中斷的0x0e號功能。 **BIOS中斷顯示服務(Video Service——INT 10H)** 功能描述:在Teletype模式下顯示字符,具體說就是在屏幕的光標處寫一個字符,并推進光標的位置。 入口參數: AH=0EH AL=字符 BH=頁碼 BL=前景色(圖形模式);注意,僅在圖形模式下,設置BL才會改變前景色;在文本模式下,這個參數不起作用(我們的實驗工作在文本模式下) 出口參數:無 ### (3)使用BIOS中斷從鍵盤讀取字符 ~~~ .reps: mov ah,0x00 int 0x16 mov ah,0x0e mov bl,0x07 ;我覺得這句可以不要 int 0x10 jmp .reps ~~~ 前面已經說了,0x16號中斷的0x00號子功能是從鍵盤讀字符。 然后,再次利用0x10號中斷的0x0e號功能,把我們從鍵盤輸入的字符顯示出來。 **BIOS中斷鍵盤服務(Keyboard Service——INT 16H)** 功能描述:從鍵盤讀入字符 入口參數: AH=00H——讀鍵盤 AH=10H——讀擴展鍵盤(可根據0000:0496H單元的內容判斷:擴展鍵盤是否有效 ) 出口參數: AH=鍵盤的掃描碼 AL=字符的ASCII碼 ### (4)實驗結果截圖 [![keyboard](https://box.kancloud.cn/2016-02-29_56d3a8fb42d4d.jpg "keyboard")](http://img.blog.csdn.net/20160103233200929) 上圖就是啟動Bochs后,再按C之后的畫面。接下來,我們就可以嘗試按鍵,看看會發生什么![眨眼](https://box.kancloud.cn/2016-02-29_56d3a8f8abd34.jpg) ? 下一次,我們就開始探索32位的x86了,你是否很期待呢?![大笑](https://box.kancloud.cn/2016-02-29_56d3a8fa14f3c.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看