【发布时间】:2019-09-19 19:06:50
【问题描述】:
我试图在 Qemu 中加载一个“Hello World”字符串,但它只显示一个字母“H”。我对此很陌生,在此先感谢您尝试帮助我:D 我在 Windows 操作系统上执行此操作。
[BITS 16]
[ORG 0X7C00]
MOV SI, BOOTLOADSTR
CALL Printstring
JMP $
Printcharacter:
MOV AH, 0x0E
MOV BH, 0x00
MOV BL, 0x07
INT 0x10
RET
Printstring
next_character:
MOV AL, [SI]
INC SI
OR AL, AL
JZ exit_function
CALL Printcharacter
exit_function
RET
;DATA
BOOTLOADSTR db 'Hello World', 0
TIMES 510 - ($ - $$) DB 0
DW 0XAA55
【问题讨论】:
-
CALL Printcharacter之后我看不到您返回并处理下一个字符。好像你错过了jmp next_character所以它只处理字符串中的第一个字母并退出。 -
为了使您的引导加载程序代码更加健壮,您应该将 DS 设置为 0(在开始时),因为您使用
org 07c00您可以使用xor ax, axmov ds, ax来做到这一点。 -
@MichaelPetch:标签使用问题:
[bootloader]是否适合 不 实际上从磁盘加载更多代码的独立事物?当我昨天重新标记这个时,我把它忽略了,因为我不确定它是否适用于像这样作为 MBR 引导扇区加载的代码。但可能这对标签来说更有用,因为它描述了代码运行的环境,而不是它的目的。也许标签使用弹出窗口可以使用编辑来澄清。 -
@PeterCordes:从技术上讲,它仍然是一个引导加载程序,将这些问题放在一个标签下是有意义的,因为这些问题通常与加载/不加载多个代码的特定问题有关部门会遇到。这种代码也有可能演变成以后加载扇区的东西。
-
@PeterCordes :我可以妥协并称它为“bootsector”而不是“bootloader”。那就无所谓了。但是标签一直存在。
标签: assembly nasm x86-16 bootloader bios