【问题标题】:Compiling Multiple NASM Files For OS Mac OS X为 OS Mac OS X 编译多个 NASM 文件
【发布时间】:2013-05-25 21:51:17
【问题描述】:

我有两个 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,因此无法获得帮助。

【问题讨论】:

    标签: macos assembly nasm


    【解决方案1】:

    假设您使用的是硬盘而不是软盘映像 (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
    

    【讨论】:

    • 非常感谢!这很有效,正是我想要的!
    【解决方案2】:

    Virtualbox 不会“让”你做什么?

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

    【讨论】:

      猜你喜欢
      • 2013-11-18
      • 2010-12-15
      • 1970-01-01
      • 2013-06-29
      • 2014-10-17
      • 2013-02-06
      • 2012-08-06
      • 2011-02-20
      • 1970-01-01
      相关资源
      最近更新 更多