注:本次實踐參考《orange’s一個操作系統的實現》
第一段引導代碼
boot.asm
org 07c00h
mov ax,cs
mov ds,ax
mov es,ax
call DispStr
jmp $
DispStr:
mov ax,BootMessage
mov bp,ax
mov cx,16
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
ret
BootMessage:
db "Hello! HackoooX!"
times 510-($-$$) db 0
dw 0xaa55
nasm boot.asm -o boot.bin
sudo dd if=boot.bin of=/dev/fd0 bs=512 count=1
實踐結果:
實踐環境:Ubuntu 13.10
問題:
沒有軟盤?
- 用虛擬機vmware,添加一個軟盤,創建的文件格式爲.flp,1.44Mb.重啓虛擬機裏面的系統。
- 把上述代碼刻錄到軟盤後,.flp文件就可以用來做啓動引導了,虛擬機直接新建一個系統,帶軟驅的,然後軟驅選擇剛纔創建的文件,啓動,OK。
爲什麼用ORG僞指令?有什麼作用?
簡單來說,彙編在編譯的時候,那些標號,實際上是指標號在當前文件的偏移。假設上面DispStr
的偏移地址是 0xa(我沒去算,這裏只是假設),編譯完DispStr
就用 0000h(基址)+0xa(偏移地址) 代表。
如果加上org 0x7c00h 僞指令,編譯完DispStr
就用 0x7c00h(基址)+0xa(偏移地址) 代表。
用軟驅啓動時,bios把軟盤的第一個扇區的內容加載到0x7c00h的位置,call DispStr
和mov ax,BootMessage
才能正確執行。
參考文章:
ORG: Binary File Program Origin(這個是manual裏的,靠譜)
boot.asm爲什麼要使用org彙編指令
ORG指令詳解(彙編)$$
代表啥?
原來學AT&T彙編沒注意,$
代表當前位置,$$
代表段開始的位置,$-$$
就是當前位置在段內的偏移量。軟盤的結構如何?
參考文章
軟盤結構及軟盤數據的讀取- 爲什麼軟盤的內外圈面積不一樣,但是存儲的字節大小一樣?
參考裏面採納的答案:
一張磁片,各磁道周長不同,爲什麼每磁道扇區數相同,且每扇區容量相同?