装配OS输出文本不可靠

时间:2012-07-06 16:52:34

标签: assembly nasm kernel qemu

我一直在努力通过使用BIOS中断在OS / Kernel实模式环境中输出硬编码文本字符串来增加我对Intel x86 Nasm的基础知识。

这是我的代码:

top:
[BITS 16]
[ORG 7C00h]
resb 56 ; Just for testing
outStr db "This is a test string!", 10, 0
resb 56

.main:
main:
mov edi, outStr
again:
mov BYTE al, [edi]
mov ah,0Eh
int 10h
inc edi

cmp BYTE [edi], 0
jg again


leaving:
mov ah, 0Eh

mov al,13
int 10h
mov al,10
int 10h

mov al,'Q' ; Using the distinct character Q to show that the code executed to this point
int 10h

complete:
hlt


times (510-($-top)) db 0 ; Pad the executable to act as the boot sector
dw 0xAA55

我实际上已经开始工作,但只能使用某些字符串。更改outStr的内容有时会导致代码根本不执行。起初我认为这是长度,但事实证明这不是决定因素;一小撮随机字符,例如“Gfd”输出正常,但“Gfd真棒!”神秘不起作用。另一方面,“ABCDEFGH ... Z”(完整的大写字母)确实有效。为了使事情变得更加奇怪,完整的小写字母不起作用。

任何时候它都不起作用,最后的确认字符(“Q”)不输出,并且没有观察到其他预期行为,这进一步让我相信这与我的可执行代码无关,但还有别的东西。

重要提示:我一直在使用QEMU进行测试。它似乎是一个非常常用的工具,适用于我(有上述例外),但我很想知道这是否会对输出产生一些影响。

2 个答案:

答案 0 :(得分:4)

你显然正在执行你的字符串。在开头跳转到main,或在代码后声明数据。

答案 1 :(得分:4)

你正在执行你的resb和字符串! “jmp”在'em。

初始化ds ...并且可能es ...并在已知(安全!)地址处设置有效堆栈。可能是QEMU以可接受的值启动你,但你不应该指望它。仅假设您在0x7C00处加载并且引导驱动器号在dl中。

“hlt”仅停止CPU直到发生中断(定时器中断每18.2秒一个,其中任何其他中断),此时您正在执行随机代码。如果你想保持CPU冷却,就把“hlt”扔进一个无限循环......

Happy bootin',