如何成功编译此引导加载程序代码?

时间:2015-01-03 18:28:21

标签: assembly loader boot masm

;------------------------------------------------------------
.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文件。

2 个答案:

答案 0 :(得分:2)

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

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

org             07x00h  

这显然是MASM不会挖掘的线。将其更改为org 7C00h

答案 1 :(得分:-1)

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