【发布时间】:2017-03-04 18:35:07
【问题描述】:
我终于了解了汇编和裸机编程的基础知识。或者至少这是我的想法。我写了这个(我自己第一次:))
[BITS 16]
[ORG 0X7C00]
Yaz: MOV SI, Msa
MOV AL, [SI]
INC SI
INT 0x10
OR AL, AL
JZ Yaz
JMP Halt
Halt: hlt
Msa db "Test Successful", 0
TIMES 510 - ($ - $$) DB 0
DW 0xAA55
我将它刻录到 USB 中(我很清楚在真实硬件中测试它们并不是一个好主意),然后重新启动。 BIOS 执行了它的测试,并引导到我的引导加载程序(或者更确切地说是“程序”,因为它实际上并没有引导)。它什么也没打印出来,我的电脑开始发出哔哔声。
我禁用了引导扇区病毒保护,快速启动,我确实尝试了所有方法,但每次启动我的东西时它只会在我脸上发出哔哔声,直到我按 CTRL+ALT+DELETE 退出它。
我做错了什么?提前致谢。
【问题讨论】:
-
可能想试试这个:capp-sysware.com/misc/stackoverflow/40143596/boot.asm。但我怀疑由于您没有设置 DS(将其设置为零),这可能是一个问题(从错误的段中读取字符串)并且您不会以无限循环结束。认为您必须在
Halt: hlt之后移动JMP Halt。由于您没有适当的无限循环,因此它可能正在运行hlt之后发生在内存中的任何内容。 -
这可能有助于指定您的主板,因为哔声代码通常具有制造商特定的含义,可以帮助调试。
-
另外,我实际上并没有看到您设置应该打印的 AH (Int 10h 的子功能)。我认为您想将 0eh 放入寄存器 AH 以使用BIOS TTY output。同样,您应该在打印之前而不是之后检查 NUL (0) 终止符。
-
与其重新启动计算机,不如考虑在模拟器或虚拟机中进行测试。该代码也应该无法在这些环境中工作(尽管失败可能以不同的方式表现出来)。 QEMU、Bochs、VirtualBox 等是一些众所周知且免费提供的模拟器和虚拟机。
-
如果您有问题的答案,请回答问题,不要用解决方案修改原始问题。我恢复了您的更改,并根据您的上次编辑创建了一个答案。
标签: assembly nasm x86-16 bootloader bios