【问题标题】:Beeping Bootloader (Intel x86)哔声引导加载程序(英特尔 x86)
【发布时间】: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


【解决方案1】:

查看 cmets 后,工作代码不会发出哔哔声,而是打印出我正在寻找的字符串:

org 7c00h
bits 16
main:
xor ax, ax
mov ds, ax
mov es, ax         
mov ss, ax
mov sp, 7c00h      
cld                
xor bx, bx        
mov si, MESAJ      
call yaz
cli
durdur:
hlt
jmp durdur
yaz:
push ax
mov  ah, 0Eh       
yenikarakter:
lodsb                                
test al, al
je   bitir         
int  10h           
jmp  yenikarakter     
bitir:
pop ax
ret
MESAJ:
db "Test basarili!", 10, 13, 0
times 510-($-$$) db 00h
dw 0xAA55 

【讨论】:

    猜你喜欢
    • 2013-11-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 2014-04-02
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多