?? boot.asm
字號:
; ==================================================== ;
; .: keenjoy95 2007 :. ;
; .: keenjoy95_at_gmail_dot_com :. ;
; ---------------------------------------------------- ;
; 代碼描述 : 引導扇區演示程序 ;
; 編譯方法 : nasm boot.asm -o boot.bin ;
; ==================================================== ;
org 07c00h ; ORG偽指令也被稱為程序起始地址偽指令 / 定位偽指令
; 該偽指令用于指示編譯器(鏈接器)將其后續代碼(段)定位于指定地址
; 由于本示例是引導扇區演示程序,所以目標定位地址為0000:7c00h
jmp MYOS_ENTRY ; 無條件跳轉到程序的入口點MYOS_ENTRY標號處
BootMessage:
db 0x07 ; "Beep"
dw 0x1048 ; "H" (藍底 黑字)
dw 0x1465 ; "e" (藍底 紅字)
dw 0x1f6c ; "l" (藍底 白字)
dw 0x126c ; "l" (藍底 綠字)
dw 0x166f ; "o" (藍底 棕字)
dw 0xfc2c ; "," (白底淺紅字)
dw 0xf020 ; " " (白底 黑字)
dw 0x4b4d ; "M" (紅底淺青字)
dw 0x4179 ; "y" (紅底 藍字)
dw 0x404f ; "O" (紅底 黑字)
dw 0x4f53 ; "S" (紅底 白字)
dw 0x4c21 ; "!" (紅底淺紅字)
db 0x07 ; "Beep"
ScrollWindows:
mov ax, 0600h ; AH 賦值為功能號06h(窗口上滾) (BIOS INT 10-06h 定義參數)
; AL 賦值為0, 窗口信息全部移出(清屏) (BIOS INT 10-06h 定義參數)
mov bx, 0700h ; BH 底部空白行屬性賦值為黑底灰白字 (BIOS INT 10-06h 定義參數)
; BL 保留
mov cx, 0000h ; 窗口左上角的行列、號賦值為00h 00h (BIOS INT 10-06h 定義參數)
mov dx, 184fh ; 窗口右下角的行列、號賦值為18h 4fh (BIOS INT 10-06h 定義參數)
; ---------------------------------------------------
; 0(00h) 79(4fh)
; 0(00h)┏━━━━━━━━━━━━━━━━┓
; ┃ ┃
; ┃ ┃
; ┃ ┃
; ┃ 顯示器 25*80 顯示方式 ┃
; ┃ ┃
; ┃ ┃
; 24(18h)┗━━━━━━━━━━━━━━━━┛
;
int 10h ; BIOS 10h號中斷-06h號功能 (清屏功能調用)
ret ; 子程序無參數返回
DisplayString:
mov ax, BootMessage ; 取字符串數據(段)的首地址
mov bp, ax ; ES:BP 賦值為待顯示字符串的首地址 (BIOS INT 10-13h 定義參數)
mov cx, 14 ; CX 賦值為字符串長度(此處為固定值) (BIOS INT 10-13h 定義參數)
mov ax, 01303h ; AH 賦值為功能號13h(顯示字符串) (BIOS INT 10-13h 定義參數)
; AL 輸出模式參數賦值為03h (BIOS INT 10-13h 定義參數)
; ---------------------------------------------------
; 第 0 位 : 在輸出之后更新光標位置
; 第 1 位 : 字符串包含交替的字符和屬性
;
mov bx, 0000h ; BH 頁號賦值為0 (BIOS INT 10-13h 定義參數)
; BL 屬性賦值為黑底淺紅字(屬性字BL使用的前提為AL的高位置0)
; ---------------------------------------------------
; 16位色彩編碼表 (D7 D6 D5 D4為背景色,D3 D2 D1 D0為前景色)
; ┏━━━━━━━━━━━┳━━━━━━━━━━━┓
; ┃ 0 0 0 0 黑 ┃ 1 0 0 0 灰 ┃
; ┃ 0 0 0 1 藍 ┃ 1 0 0 1 淺藍 ┃
; ┃ 0 0 1 0 綠 ┃ 1 0 1 0 淺綠 ┃
; ┃ 0 0 1 1 青 ┃ 1 0 1 1 淺青 ┃
; ┃ 0 1 0 0 紅 ┃ 1 1 0 0 淺紅 ┃
; ┃ 0 1 0 1 品紅 ┃ 1 1 0 1 淺品紅 ┃
; ┃ 0 1 1 0 棕 ┃ 1 1 1 0 黃 ┃
; ┃ 0 1 1 1 灰白 ┃ 1 1 1 1 白 ┃
; ┗━━━━━━━━━━━┻━━━━━━━━━━━┛
;
mov dx, 0000h ; DX 賦值為字符串顯示的起始行、列號 (BIOS INT 10-13h 定義參數)
int 10h ; BIOS 10h號中斷-13h號功能 (字符串屏顯功能調用)
ret ; 子程序無參數返回
MYOS_ENTRY:
mov ax, cs ; ┓
mov ds, ax ; ┣ 段寄存器初始化
mov es, ax ; ┛
call ScrollWindows ; 調用清除屏幕子程序
call DisplayString ; 調用字符串顯示子程序
jmp $ ; 主程序進入無限循環
MYOS_PAD:
times 510-($-$$) db 0 ; 循環填充剩余空間,使生成的二進制代碼大小恰好為一個扇區(512Byte)
dw 0xAA55 ; 引導扇區結束標志
; ---8<--------------- [Cut Here] --------------->8--- ;
; .: keenjoy95 2007 :. ;
; .: keenjoy95_at_gmail_dot_com :. ;
; ! NO rights reserved ! ;
; ---------------------------------------------------- ;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -