为OS Mac OS X编译多个NASM文件

时间:2013-05-25 21:51:17

标签: macos assembly nasm multiple-files

我有两个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

SIDE注意:我在Mac OS X Mountain Lion上,所以我最终得到了帮助。

2 个答案:

答案 0 :(得分:2)

假设您使用的是硬盘而不是软盘映像( image.hdd ),您首先想要像这样更改 boot.asm :< / p>

;--------------------------------------------
; '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.bin 8 字节且 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

答案 1 :(得分:1)

Virtualbox不会“让”你做什么?

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