環境:
virtual-box:版本 6.0.10 r132072 (Qt5.6.2)運作的的ubuntu18.04系統。
nasm彙編器:NASM version 2.13.02
講述bochs運作一個簡單的引導程式并顯示“Loading system”例子,運作效果如下:
注意:運作bochs後,需要輸入c,才能進入運作狀态。
1)boot.s代碼如下:(nasm文法格式)
沒有自己定義中斷描述表的話,使用BIOS提供的中斷。
BOOTSEG equ 0x07c0 ; BIOS 加載 bootsect 代碼的原始段位址;
start:
jmp BOOTSEG:go ; 段間跳轉。 INITSEG 指出跳轉段位址, 标号 go 是偏移位址。
go:
mov ax,cs ; 段寄存器 cs 值-->ax,用于初始化資料段寄存器 ds 和 es。
mov ds,ax
mov es,ax
mov [msg1+17],ah ; 0x07-->替換字元串中 1 個點符号,喇叭将會鳴一聲。
mov cx,29 ; 共顯示 29 個字元,包括回車換行符。
mov dx,0x1004 ; 字元串将顯示在螢幕第 17 行、第 5 列處。
mov bx,0x000c ; 字元顯示屬性(紅色)。
mov bp,msg1 ; 指向要顯示的字元串(中斷調用要求)。
mov ax,0x1301 ; 寫字元串并移動光标到串結尾處。
int 0x10 ; BIOS 中斷調用 0x10,功能 0x13,子功能 01。
loop1: jmp loop1 ; 死循環。
msg1:
db "Loading Shuaihao system ..." ; 調用 BIOS 中斷顯示的資訊。共 29 個 ASCII 碼字元。
db 13,10
times 510-($-$$) db 0 ; 表示以後語句從位址 510(0x1FE)開始存放。
dw 0xAA55 ; 有效引導扇區标志, 供 BIOS 加載引導扇區使用。
2)Makefile檔案如下:
all:
nasm -f bin boot.s -o boot
dd if=boot of=boot.img
另外提供一下另外一種彙編器as86編寫boot.s檔案
boot.s代碼如下:(as86文法格式)
!
.globl begtext, begdata, begbss, endtext, enddata, endbss ! 全局辨別符,供 ld86 連結使用;
.text ! 正文段;
begtext:
.data ! 資料段;
begdata:
.bss ! 未初始化資料段;
begbss:
.text ! 正文段;
BOOTSEG = 0x07c0 ! BIOS 加載 bootsect 代碼的原始段位址;
entry start ! 告知連結程式,程式從 start 标号處開始執行。
start:
jmpi go,BOOTSEG ! 段間跳轉。 INITSEG 指出跳轉段位址, 标号 go 是偏移位址。
go:
mov ax,cs ! 段寄存器 cs 值-->ax,用于初始化資料段寄存器 ds 和 es。
mov ds,ax
mov es,ax
mov [msg1+17],ah ! 0x07-->替換字元串中 1 個點符号,喇叭将會鳴一聲。
mov cx,#29 ! 共顯示 29 個字元,包括回車換行符。
mov dx,#0x1004 ! 字元串将顯示在螢幕第 17 行、第 5 列處。
mov bx,#0x000c ! 字元顯示屬性(紅色)。
mov bp,#msg1 ! 指向要顯示的字元串(中斷調用要求)。
mov ax,#0x1301 ! 寫字元串并移動光标到串結尾處。
int 0x10 ! BIOS 中斷調用 0x10,功能 0x13,子功能 01。
loop1: jmp loop1 ! 死循環。
msg1:
.ascii "Loading Shuaihao system ..."! 調用 BIOS 中斷顯示的資訊。共 29 個 ASCII 碼字元。
.byte 13,10
.org 510 ! 表示以後語句從位址 510(0x1FE)開始存放。
.word 0xAA55 ! 有效引導扇區标志, 供 BIOS 加載引導扇區使用。
.text
endtext:
.data
enddata:
.bss
endbss: