-1

我一直在尝试通过使用 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 进行测试。它似乎是一个非常常用的工具,对我有用(除了上述例外),但我很想看看这是否会对输出产生一些影响。

4

2 回答 2

4

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

于 2012-07-06T17:21:48.780 回答
4

你正在执行你的 resb 和字符串!“jmp”超过他们。

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

“hlt”只会暂停 CPU,直到发生中断(定时器中断每 18.2 秒一次),此时您正在执行随机代码。如果要保持 CPU 凉爽,请将“hlt”放入无限循环中......

快乐开机,

坦率

于 2012-07-06T17:28:38.470 回答