0

アセンブリで書いている私の OS 用に 2 つの NASM ファイルがあり、それらが動作することはほぼ 100% 確信していますが、それらをコンパイルする方法が正確にわからないため、わかりません。コマンドnasm -f bin boot.asm -o boot.binと の使用方法は知っていますcat boot.bin > image.hddが、使用するファイルが 2 つになり、それらをリンクする方法がわかりません。それらの2つを別々の.binファイルにコンパイルしてから使用cat boot.bin other.bin > image.hddしようとしましたが、VirtualBoxで開こうとすると(OSのテストに使用します)、できません。

それらを見る必要がある場合は、2 つのアセンブリ ファイルにあるコードを次に示します。

;--------------------------------------------
; 'boot.asm'
; loaded from BIOS

 [org 0x7C00]
 [bits 16]

;--------------------------------------------

 main:
  mov ah, 0x0E  ; print function
  mov al, '.'   ; ascii char
  int 0x10   ; IO int

 resetdisk:
  mov ah, 0x00  ; reset function
  mov dl, 0x00  ; drive
  int 0x13   ; disk int
  jc resetdisk

 readdisk:
  mov bx, 0x8000  ; segment
  mov es, bx
  mov bx, 0x0000  ; offset

  mov ah, 0x02  ; read function
  mov al, 0x03  ; sectors
  mov ch, 0x00  ; cylinder
  mov cl, 0x02  ; sector
  mov dh, 0x00  ; head
  mov dl, 0x00  ; drive
  int 0x13      ; disk int
  jc readdisk
  db 0eah
  dw 00000h     ; offset
  dw 08000h     ; segment

;--------------------------------------------

 times 510 - ($ - $$) db 0x00
 db 0x55, 0xAA

;--------------------------------------------
 ; 'load.asm'
 ; loaded from 'boot.asm'

 [org 0x8000]
 [bits 16]

 ;--------------------------------------------

 main:
  mov ah, 0x0E  ; print function
  mov al, '.'   ; ascii char
  int 0x10   ; IO int

  jmp $    ; hang

補足: 私は Mac OS X Mountain Lion を使用しているので、どうにかして助けを求めています。

4

2 に答える 2

2

フロッピー イメージ ( image.hdd )の代わりにハードディスクを使用していると仮定すると、最初にboot.asmを次のように変更する必要があります。

;--------------------------------------------
; 'boot.asm'
; loaded from BIOS

 [org 0x7C00]
 [bits 16]

;--------------------------------------------

 main:
  mov ah, 0x0E  ; print function
  mov al, '.'   ; ascii char
  int 0x10   ; IO int

 resetdisk:
  mov ah, 0x00  ; reset function
  mov dl, 0x80  ; drive
  int 0x13   ; disk int
  jc resetdisk

 readdisk:
  mov bx, 0x8000  ; segment
  mov es, bx
  mov bx, 0x0000  ; offset

  mov ah, 0x02  ; read function
  mov al, 0x01  ; sectors
  mov ch, 0x00  ; cylinder
  mov cl, 0x02  ; sector
  mov dh, 0x00  ; head
  mov dl, 0x80  ; drive
  int 0x13      ; disk int
  jc readdisk
  db 0eah
  dw 00000h     ; offset
  dw 08000h     ; segment

;--------------------------------------------

 times 510 - ($ - $$) db 0x00
 db 0x55, 0xAA

ドライブ ( dl ) とセクター カウント ( al ) は、2 つの int 0x13 呼び出しの前に変更されていることに注意してください。次に、次のように 512 バイトの倍数のイメージを作成します。

$ nasm -f bin boot.asm -o boot.bin
$ nasm -f bin load.asm -o load.bin
$ dd if=/dev/zero of=pad504 bs=1 count=504
$ cat boot.bin load.bin pad504 > image.hdd

load.bin8バイトで512 - 8 = 504であるため、パディングは504バイトです。したがって、load.asmを変更するときに、コマンドを変更して適切なサイズのパディングを生成する必要があります。

$ dd if=/dev/zero of=padding bs=1 count=$((512 - $(ls -l load | cut -d ' ' -f 5) % 512))
$ cat boot.bin load.bin padding > image.hdd
于 2013-05-26T05:10:40.433 に答える
1

Virtualbox で「させない」ことは何ですか?

load.binScottt の提案に加えて、セグメント 0x8000 オフセット 0 を読み取り、セグメント 0x8000 オフセット 0 にジャンプしていることを指摘しますがload.asmorg 0x8000. これは正しくありません。この初歩的なプログラムでは問題ありませんが、印刷しようとするとすぐにmsg失敗します。通常のプログラミング環境とは異なり、ブート環境では、セグメント レジスタを管理する OS はありません。自分でそれらを整理する必要があります。csfar jump によって設定されます (または、他のコードをまとめて実行しています!) が、ds (など) はあなた次第です。正気ss:spであることも悪い考えではありません。これはまだ必要ありませんが、すぐに必要になります。

于 2013-05-26T10:20:48.863 に答える