我一直在努力通过使用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进行测试。它似乎是一个非常常用的工具,适用于我(有上述例外),但我很想知道这是否会对输出产生一些影响。
答案 0 :(得分:4)
你显然正在执行你的字符串。在开头跳转到main,或在代码后声明数据。
答案 1 :(得分:4)
你正在执行你的resb和字符串! “jmp”在'em。
初始化ds ...并且可能es ...并在已知(安全!)地址处设置有效堆栈。可能是QEMU以可接受的值启动你,但你不应该指望它。仅假设您在0x7C00处加载并且引导驱动器号在dl中。
“hlt”仅停止CPU直到发生中断(定时器中断每18.2秒一个,其中任何其他中断),此时您正在执行随机代码。如果你想保持CPU冷却,就把“hlt”扔进一个无限循环......
Happy bootin',
谢