0

我有两个 NASM 文件,用于我正在用汇编语言编写的操作系统,我几乎 100% 肯定它们可以工作,但我不知道,因为我不知道如何编译它们。我知道如何使用命令nasm -f bin boot.asm -o boot.bincat boot.bin > image.hdd,但现在我有两个文件要使用,我不知道如何链接它们。我尝试将它们中的两个编译成单独的 .bin 文件,然后使用cat boot.bin other.bin > image.hdd,但是当我尝试用 VirtualBox 打开它(我用它来测试我的操作系统的东西)它不会让我。

如果您需要查看它们,这是我在两个汇编文件中的代码

;--------------------------------------------
; '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)在两个 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

填充是504字节,因为load.bin8字节并且512 - 8 = 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不会“让”你做什么?

除了 Scottt 的建议之外,我还要指出您正在读取load.bin段 0x8000 偏移 0,并跳转到段 0x8000 偏移 0,但load.asm指定org 0x8000. 这是不正确的。在这个基本程序中它不会打扰你,但是一旦你尝试 print msg,它就会失败。与普通的编程环境不同,在引导环境中没有操作系统来管理你的段寄存器——你需要自己保持它们的顺序。cs由远跳设置(或者我们正在执行一些其他代码!)但 ds (等)取决于你。一个理智的ss:sp人也不会是一个坏主意。你还不需要这个,但你很快就会。

于 2013-05-26T10:20:48.863 回答