【问题标题】:How to successfully compile this bootloader code?如何成功编译此引导加载程序代码?
【发布时间】:2015-01-03 18:28:20
【问题描述】:
;------------------------------------------------------------
.286                               ; CPU type
;------------------------------------------------------------
.model TINY                 ; memory of model
;---------------------- EXTERNS -----------------------------
extrn               _BootMain:near     ; prototype of C 

func
;------------------------------------------------------------
;------------------------------------------------------------   
.code   
org             07x00h     ; for BootSector
main:
                jmp short start    ; go to main
                nop
                        
;----------------------- CODE SEGMENT -----------------------
start:  
        cli
        mov ax,cs               ; Setup segment registers
        mov ds,ax               ; Make DS correct
        mov es,ax               ; Make ES correct
        mov ss,ax               ; Make SS correct        
        mov bp,7c00h
        mov sp,7c00h            ; Setup a stack
        sti
                                ; start the program 
        call           _BootMain
        ret
        

END main                ; End of program

说实话,我复制了这段代码from here

我自己尝试过,但 MASM 不同意。我得到的唯一错误是:

StartPoint.asm(10) : error A2206: missing operator in expression 

或者:

LINK : warning L4055: start address not equal to 0x100 for /TINY

对不起,如果我在问这个问题时犯了任何错误,我是新人。

编辑:MASM 版本是 6.15,我在 cmd 中使用了 ml StartBoot.asm。语法是 ml [filename.asm]。

编辑:我打算将其编译成 .exe 文件。

【问题讨论】:

  • 您应该提供准确的 MASM 版本和您使用的准确命令行参数。
  • org 07x00h中有错字
  • 我修正了错字,但仍然无法编译。

标签: assembly loader boot masm


【解决方案1】:

编辑:我打算将其编译成 .exe 文件。

一个EXE文件甚至一个COM文件必然意味着存在一个操作系统来执行程序。由于您正在编写引导加载程序,因此将没有操作系统可以依赖!引导加载程序只是一个不需要特别注意即可运行的软件。

org             07x00h  

这显然是 MASM 没有理解的行。改成org 7C00h

【讨论】:

  • 我试过这样做,但我仍然得到相同的“链接:警告 L4055:起始地址不等于 /TINY 的 0x100”错误。
  • 您需要使用 /AT 开关进行编译。 codeproject.com 的原始程序也使用了它!从 Masm 6.15 的手册中,我们了解到此开关 启用微型内存模型支持。为违反 .com 格式文件要求的代码结构启用错误消息。请注意,这不等同于 .MODEL TINY 指令。
【解决方案2】:

我不是在评论您的代码,而只是评论您引用的错误消息。汇编器错误是由“org”指令中的拼写错误引起的(IIRC 应该读取 7c00h,而不是 7x00h),并且可以安全地忽略链接器警告:它指出如果以“.com”调用生成的文件将无法工作" DOS 程序。这无关紧要,因为您不打算这样做。 您可能会遇到与让 BootMain 遵守正确约定相关的问题,并且很可能您至少需要先链接 StartPoint.obj,但这超出了当前问题的范围。

【讨论】:

  • 那么我如何将它编译成可执行文件(抱歉没有提及)
  • 正如 user3144770 所指出的,您引用的代码并不意味着要编译成 .EXE 文件。它旨在放入软盘或硬盘驱动器分区的第一个扇区,由 IBM PC 兼容的 BIOS 执行。此外,您引用的链接器消息只是一个警告,因此您应该得到一个输出文件(当然,不是 .EXE 或 .COM 文件,而只是要写入引导扇区的二进制 blob)
猜你喜欢
  • 2019-05-04
  • 2019-11-18
  • 2017-08-29
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
相关资源
最近更新 更多