我已经编写了以下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
;===
它不会输出第一条消息。如何更正?。谢谢。
答案 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
; ...