【问题标题】:Appending two .asm files with nasm用 nasm 附加两个 .asm 文件
【发布时间】:2016-07-14 02:10:30
【问题描述】:

因为第一个扇区只有 512 字节,而其余的代码很大,我想我需要一个单独的 .lst 文件的汇编代码。 我不确定这是否称为绑定,但我想在使用 NASM 制作 .img 文件时绑定此汇编程序文件。

第一个

    ORG     0x7c00      
start:
    JMP     entry
    DB      0x90
    ; Start of BIOS Parameter Block         
    DB      "MyOS    "      
    DW      512         
    DB      1           
    DW      1           
    DB      2           
    DW      224         
    DW      2880            
    DB      0xf0            
    DW      9   
    DW      18          
    DW      2           
    DD      0           
    DD      2880            
    DB      0,0,0x29        
    DD      0xffffffff      
    DB      "MyOS-Vol   "       
    DB      "FAT12   "      
    TIMES   18 DB 0         
    ; End of BIOS Parameter Block           

entry:
    MOV     AX, 0           
    MOV     SS,AX
    MOV     SP,0x7c00 
    MOV     DS,AX 
    MOV     ES,AX 
    MOV     SI,msg
loop:
    MOV     AL,BYTE [SI]
    ADD     SI, 1           
    CMP     AL,0
    JE      fin
    MOV     AH, 0x0e        
    MOV     BX, 0xe1        
    INT     0x10            
    JMP     putloop
fin:
    HLT                 
    JMP     fin         

msg:
    DB      0x0a, 0x0a      
    DB      "hello, world"
    DB      0x0a            
    DB      0

maker:      
    TIMES   0x01fe-(maker-start) DB 0   
    DB      0x55, 0xaa      

第二个

DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
TIMES   4600 DB 0
DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
TIMES   1469432 DB 0

如何将第二个代码附加到第一个代码?不是通过复制粘贴文本,而是将目标文件链接在一起。


对于那些正在寻找 fat12 磁盘格式的人。 DOS Boot Record Format for FAT12 and FAT16

【问题讨论】:

  • 我假设您正在谈论在 x86 PC 硬件上启动的限制。没有神奇的方法可以链接事物,以便您可以将第一部分放在引导扇区中,将其余部分放在其他地方。引导加载程序必须处理附加代码的加载并执行它。
  • 我明白你的意思。我想我没有清楚地描述我的观点。对于那个很抱歉。我想问的是这个。如何在加载到硬件之前将 asm 文件绑定在一起?我知道编译器在制作可执行文件之前会链接目标文件。但是汇编程序呢?我想出了让小程序读取文件并将另一个文件附加为字符串函数。但这似乎不是办法。 nasm有什么选择吗?我找不到一个:(
  • 因为您的 asm 文件顶部有 org 0x7c00,这意味着您正在使用 -f bin 选项(如 nasm -f bin boot.asm -o boot.bin)组装代码。 nasm -f bin 的输出已经是一个完全链接的平面二进制图像,不能在传统意义上链接。它实际上是写入引导加载程序(通常使用 DD 之类的工具)。您使用的是 Windows / OSX 还是 Linux?您要使用哪个链接器(LDGCC 等)?
  • 通常你所做的是使用 DD 将引导扇区写入映像,然后使用 DD 将任何其他数据写入磁盘映像.我写了一个Stackoverflow answer,其中包含一些基本信息,如果您有 DD 可能会有所帮助
  • 如果我不了解,您几乎会认为您正在尝试使用第二个文件将磁盘映像预格式化为 FAT12。

标签: macos assembly x86 nasm boot


【解决方案1】:

最简单的方法是将两个汇编文件连接在一起并使用-f bin 选项进行汇编以直接生成软盘映像。列表文件的大小不会有问题,您的第二个文件会生成如下所示的列表文件:

1 00000000 F0FFFF0000000000 DB 0xf0、0xff、0xff、0x00、0x00、0x00、0x00、0x00 2 00000008 00 次 4600 DB 0 3 00001200 F0FFFF0000000000 DB 0xf0、0xff、0xff、0x00、0x00、0x00、0x00、0x00 4 00001208 00 次 1469432 DB 0

如果您想将两个源代码文件分开,您可以使用 NASM 的 %include 指令:

%include "bootsector.asm"
%include "fat12.asm"

或者,您可以使用cat 命令将这两个文件直接组合成二进制文件后将它们连接在一起:

nasm -f bin bootsector.asm -o bootsector.bin
nasm -f bin fat12.asm -o fat12.bin
cat bootsector.bin fat.bin > floppy.img

您不需要使用链接器来创建软盘映像,除非您将引用自身文件之外的符号的文件链接在一起。即使这样,使用%include 指令将所有内容“链接”在一起也会简单得多。走链接器路线意味着编写一个链接器脚本,在这种情况下不值得麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2017-06-25
    • 1970-01-01
    • 2013-11-25
    相关资源
    最近更新 更多