アセンブリを使用してブートストラップを作成する練習をしています (AT&T 構文と gnu/gas)。小さなプログラムが組み立てられてリンクされ、仮想ディスクの最初のセクターにコピーされます。BIOS はそれを にロードしますが0000:7c00
、ここで問題が発生します。は、実行中に からにcall hello
変換されます。しかし、は移転しません。は、まだありません。その結果、画面上で を作成できません。代わりに、ランダムなデータが画面に表示されます。call 0010
call 7c10
movw $message, %as
ax
0026
7c26
Hello World
0000:0026
起動時に正しくするにはどうすればよいですか? いくつかのディレクティブを使用して asm ソース コードを変更する必要がありますか? または、リンク スクリプトを変更する必要がありますか?
ありがとうございました!
.text
.global _start
.code16
_start:
movw %cs, %ax
movw %ax, %ds
movw %ax, %es
call hello
jmp .
.org 0x10
hello:
movw $message, %ax
movw %ax, %bp
movw $13, %cx
movw $0x1301, %ax
movw $0x000c, %bx
movb $0, %dl
int $0x10
ret
message:
.ascii "Hello, World!"
.org 0x01fe
.byte 0x55
.byte 0xaa
次のアセンブルおよびリンク スクリプトを使用します。
as -o boot.o boot.s
//generate object code
ld -Ttext 0x0 -e _start -s -o boot.out boot.o
//relocate .text to 0x0
//entry is _start
objcopy -O binary -j .text boot.out boot
//copy .text section to boot
vboxmanage convertfromraw boot boot.vdi --format VDI
//create vdi for virtual box