调用BIOS video mode 13h的NASM引导扇区代码触发BIOS持续蜂鸣咨询
问题成因
- 你的引导扇区代码执行完像素绘制逻辑后,没有设置停机逻辑限制CPU执行流,CPU会继续读取
start:标签之后的内容作为指令执行,而这部分内容是你为了凑512字节填充的0和末尾的引导魔数0xaa55,属于无效的随机指令,直接导致CPU执行流跑飞失控。 - 失控的CPU在执行随机指令的过程中,大概率误操作了控制PC扬声器的相关硬件端口:包括8254可编程间隔定时器的通道2、或是I/O端口
0x61的扬声器控制位,错误打开了扬声器的方波输出,最终出现持续蜂鸣的现象。
代码存在的错误
缺失执行结束后的停机逻辑,没有阻止CPU继续执行无效的后续内存数据,这是触发蜂鸣的核心原因。
修复方案
只需要在start:标签后添加无限停机逻辑即可,修改后的代码片段如下:
bits 16 org 0x7C00 VIDEO_INT: equ 0x10 VGA_BASE: equ 0xA000 mov ax, 13 int VIDEO_INT push VGA_BASE pop es xor di,di mov ax, 255 mov [es:di], ax mov [es:di+1], ax mov [es:di+2], ax start: hlt ; 让CPU进入暂停状态,仅中断可唤醒 jmp start ; 若被中断唤醒则重新回到暂停,彻底阻止执行流跑飞 ;-------------------------------------- ; make file 512 bytes, just enough to fit in boot sector times 510-($-$$) db 0 dw 0xaa55 ; boot sector magic number
修改后重新编译运行,即可解决扬声器持续蜂鸣的问题。
内容的提问来源于stack exchange,提问作者ByteBox
相关产品推荐
相关产品推荐

