這幾天學習了如何用DOS的debug來寫Assembly,老實說,在現階段,我是討厭用compiler的,因為不知道compiler在一些我不知道的地方做過什麼,這令我沒法完全了解背後發生的事,所以在開始的時候,我想盡量用一些最簡單的工具。
所以我用了下面的方法來寫一個新的Boot Loader,先列出我用過的工具:
1. DOS Prompt的debug (打開DOS Prompt,輸入debug)
2. Free Hex Editor XVI32
3. PC模擬器 Bochs (我用的是2.4),直接下載
首先,進入DOS Prompt,去d:\os\,輸入debug。
-a100
0AFB:0100 mov al,41
0AFB:0102 mov ah,e
0AFB:0104 mov bh,0
0AFB:0106 mov bl,7
0AFB:0108 int 10
0AFB:010A jmp 10a
0AFB:010C (按enter)
-nboot.img
-rbx
BX 0000
:0 (輸入0)
-rcx
CX 0000
:c (輸入c)
-w
Writing 0000C bytes
-q
0AFB:0100 mov al,41
0AFB:0102 mov ah,e
0AFB:0104 mov bh,0
0AFB:0106 mov bl,7
0AFB:0108 int 10
0AFB:010A jmp 10a
0AFB:010C (按enter)
-nboot.img
-rbx
BX 0000
:0 (輸入0)
-rcx
CX 0000
:c (輸入c)
-w
Writing 0000C bytes
-q
這樣就做了一個BOOT.IMG。(實際上這是一個可執行的程式,可以試試把其名改為boot.com,以後執行,不過程序會hang機,要關上DOS Prompt重開)
現在要用XVI32把BOOT.IMG的file size增至512 bytes,再在最後2個byte改成0x55 0xAA。
用XVI32打開BOOT.IMG,現在有12 bytes,所以要再加多500 bytes,按一下最後的一個byte,Edit -> Insert string... Hex string: 00,Insert
噢~ 最後的一個byte跳到最後了 @@" 要在EB之後補回FE。
再把最後的2 bytes改為55 AA,Save。
完成! 開Bochs試試(雙擊 d:\os\bochsrc.bxrc),看到「A」了。
還有一件事,我之前是用INT 21來print character的,可是怎樣也print不到,最後才發現,INT 21是DOS service來的,而我做的這個,就是為了代替DOS,當然沒有INT 21可用了 ^^"
沒有留言:
發佈留言