【问题标题】:Assembly OS outputting text unreliable汇编操作系统输出文本不可靠
【发布时间】:2012-07-07 03:55:49
【问题描述】:

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

【问题讨论】:

  • 哇,太讨厌了。我现在看到我的代码中存在一两个误解,但我认为它不值得这么多反对。毕竟,我只是在学习。这不是本网站目的的一部分吗?帮助人们进一步了解他们遇到困难的特定领域?

标签: assembly nasm kernel qemu


【解决方案1】:

你正在执行你的 resb 和字符串! "jmp" 在他们身上。

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

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

祝你快乐,

弗兰克

【讨论】:

  • 其实有更聪明的方法可以永久停止 CPU:cli; hlt,也就是。
  • 在某些编译器中,您可以使用 jmp $(或任何具有类似含义的字符)跳转“这里”。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 2014-05-24
    • 1970-01-01
    • 2013-02-12
    • 2015-01-12
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多