簡體   English   中英

實模式組裝:在引導時不使用INT指令將字符打印到屏幕

[英]Real Mode Assembly: Print Char to Screen without INT Instruction on Boot

以下站點“編寫引導扇區代碼”提供了一個代碼示例,可在系統引導時將“A”打印到屏幕上。 從我一直在閱讀的不是你必須使用INT操作碼讓BIOS做某些事情? 以下代碼如何從上面引用的站點工作而不使用中斷? 代碼的哪一部分實際告訴硬件將“A”打印到屏幕上?

有問題的代碼:

.code16
.section .text
.globl _start
_start:
  mov $0xb800, %ax
  mov %ax, %ds
  movb $'A', 0
  movb $0x1e, 1
idle:
  jmp idle 

附加原始問題

如果我使用以下代碼,BIOS調用是否會為我寫入文本緩沖區? 緩沖區從地址0xb800開始?

   # Author: Matthew Hoggan
   # Date Created: Tuesday, Mar 6, 2012
   .code16                        # Tell assembler to work in 16 bit mode (directive)
   .section .text
   .globl _start                  # Help linker find start of program
   _start:
       movb $0x0e,     %ah        # Function to print a character to the screen                 
       movb $0x00,     %bh        # Indicate the page number
       movb $0x07,     %bl        # Text attribute
       mov  $'A',      %al        # Move data into low nibble                   
       int  $0x10                 # Video Service Request to Bios                             
   _hang:                         
       jmp  _hang                 
       .end   

直接回答你的問題:行“movb $'A',0”有效地完成了對屏幕的打印(以下行,“movb $ 0x1e,1”指定它應該是什么顏色)。

更長的答案:視頻硬件根據內存的內容繪制屏幕。 在文本模式下,視頻硬件基於內存段0xB800開始繪制。 無論字節0是什么,都定義了要在屏幕上的第一個文本單元格繪制的字符。 下一個字節定義屬性(前景色,背景色和閃爍狀態)。 這種模式在整個屏幕上重復(char - attr - char - attr)。

所以,從技術上講,我的直接回答並非如此。 2'movb'語句只是將字母“A”打印出來。 在下次硬件根據內存刷新顯示屏之前,不會打印“A”。

在啟動時,您處於默認屏幕模式 - 在這種情況下是文本屏幕模式。 您的示例程序直接寫入屏幕上顯示的字符緩沖區,用於該文本屏幕模式。 將數據段寄存器設置為0xb800可將設置為指向該緩沖區。 有關更多信息,請查看本教程

基本上當你調用INT 10h時,BIOS會通過將字符及其屬性寫入視頻內存來執行幾乎完全相同的例程。 然而,知道如何自己編寫和執行這些例程是很有用的,所以當你決定將CPU切換到32位保護模式時,你仍然可以在屏幕上打印字符,因為在那種模式下你將不再能夠調用BIOS中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM