我一直在尝试通过使用 BIOS 中断在 OS/内核实模式环境中输出硬编码文本字符串来增加我对 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 进行测试。它似乎是一个非常常用的工具,对我有用(除了上述例外),但我很想看看这是否会对输出产生一些影响。