Assembly 在16位模式下写入0xB800显示一个;G";还有一句话
作为一个教育项目,我决定编写一个极其简单的引导加载程序。不启动任何东西但显示消息的引导加载程序。出于某种原因,我可以写入视频内存,但最后一个字母的ASCII值比预期值大7,消息后面有一个引号 这是我的密码:Assembly 在16位模式下写入0xB800显示一个;G";还有一句话,assembly,x86,bootloader,real-mode,Assembly,X86,Bootloader,Real Mode,作为一个教育项目,我决定编写一个极其简单的引导加载程序。不启动任何东西但显示消息的引导加载程序。出于某种原因,我可以写入视频内存,但最后一个字母的ASCII值比预期值大7,消息后面有一个引号 这是我的密码: bits 16 ; 16-bit Real Mode org 0x7c00 ; BIOS boot origin jmp main ;Jump to start main() entry-point main: mov ax, 0xB800 mov ds, ax
bits 16 ; 16-bit Real Mode
org 0x7c00 ; BIOS boot origin
jmp main ;Jump to start main() entry-point
main:
mov ax, 0xB800
mov ds, ax
mov si, 0x0
mov [si], byte 'A'
add si, 2
mov [si], byte 'A'
add si, 2
mov [si], byte 'A'
add si, 2
mov [si], byte 'A'
add si, 2
mov [si], byte 'A'
hlt
times 510 - ($-$$) db 0
dw 0xAA55
以下是输出:
AAAAH"
好的,将hlt更改为jmp$解决了这个问题。以下是工作代码:
bits 16
org 0x7c00
main:
mov ax, 0xB800
mov ds, ax
mov si, 0x0
mov [si], byte 'A'
add si, 2
mov [si], byte 'A'
add si, 2
mov [si], byte 'A'
add si, 2
mov [si], byte 'A'
add si, 2
mov [si], byte 'A'
jmp $
times 510 - ($-$$) db 0
dw 0xAA55
仔细阅读hlt的功能。提示:一个中断可以唤醒它,所以你的程序会继续,并且可能会命中一些具有这种效果的指令。PS:学习使用调试器。或者
cli
endloop:hlt
jmp endloop
另一种可能是问题出在jmp main
上。我不确定您正在运行什么环境(一台真正的计算机?)以及启动的介质类型。如果您正在引导的是一个真实的系统,BIOS可能已经覆盖了它认为是BIOS参数块(BPB)的内容,并且碰巧更改了您的代码以打印不同的字符。我将删除jmp main
作为引导加载程序的第一条指令,因为您没有BPB;添加SI,2 < /代码>考虑使用<代码> MOV di,A′;stosb;stosb;stosb;stosb来编写字符。保存一些代码。@fuzzxl:那不一样。文本模式VRAM由字节对[glyph code,color value]组成,因此您的4x stosb
只会在屏幕上写两个“A”,颜色怪异(懒得弄清楚哪些颜色会设置为“A”)。因此,正确的可能变体是(将es:di设置为指向b800:某处)mov ax,0cc41h stosw stosw stosw stosw
,其中cc
是一些颜色值。(41h是“A”)。OP:这不是很好吗,电脑在启动时怎么会呻吟D