環境:
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: