Linux中的Boot Loader

时间:2013-05-03 07:08:46

标签: assembly bootloader

我已经编写了以下bootloader程序。但是有一个问题。

;===================================================================
;Following is an incomplete code of a boot-loader with blanks(.....)
;Replace each blank with appropriate word, words or character
;===================================================================

[ORG 0x7C00]

;==============================================================
;MSG2, MSG3 and MSG4 should describe the right order of typical
;boot-loading functionality (i.e. What basially a boot-loader does?)

MSG1 dd '1. Boot Loader starts ', 0
MSG2 dq '2. Initialize Hardware', 0
MSG3 dq '3. Pass an abstraction of Initialize Hardware', 0
MSG4 dq '4. Execute Kernel', 0
MSG5 dq '5. Boot Loader exits ', 0
;==============================================================

;==============================================================
;Printing the messages (MSG1, MSG2, .....)

MOV SI, MSG1
CALL PrintString ;Call print string procedure
MOV SI, MSG1
CALL PrintString ;Call print string procedure
MOV SI, MSG2
CALL PrintString ;Call print string procedure
MOV SI , MSG3
CALL PrintString ;Call print string procedure
MOV SI , MSG4
CALL PrintString ;Call print string procedure
MOV SI, MSG5
CALL PrintString ;Call print string procedure

JMP $ ;infinite loop here
;===============================================================

;===============================================================
PrintCharacter: ;Procedure to print character on screen

MOV AH, 0x0E
MOV BH, 0x00
MOV BL, 0x07

INT 0x10
RET
;===============================================================

;===============================================================
PrintString: ;Procedure to print string on screen

MOV AL , [SI]
CALL PrintCharacter
NextChar:
INC SI
MOV AL , [SI]
CMP AL , 0
JZ exit_function
CALL PrintCharacter
JMP NextChar
exit_function:
RET
;===============================================================

;===============================================================

times (495) - ($ - $$) db 0
db 0
dw 0xAA52
dd 0xAA53
dq 0xAA54
dw 0xAA55 ;End of Boot-loader

;===

它不会输出第一条消息。如何更正?。谢谢。

2 个答案:

答案 0 :(得分:2)

为了定义字符串,您应该使用db(或可能是dw)而不是dd / dq

哦,你应该在字符串数据之前跳转到你的实际代码,否则CPU会认为字符串是应该执行的代码。

答案 1 :(得分:2)

除此之外没有阅读(评论已删除):

[ORG 0x7C00]

MSG1 dd '1. Boot Loader starts ', 0

这意味着代码的前几个字节根本不是代码,而是ASCII字符串。你想要这样的东西:

[ORG 0x7C00]

jmp start

; comments blah blah blah
MSG1 db '1. Boot Loader starts ', 0
; ... etc ...

start:

; instructons start here.

mov si, MSG1
; ...