Assembly 在16位模式下写入0xB800显示一个;G";还有一句话

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

作为一个教育项目,我决定编写一个极其简单的引导加载程序。不启动任何东西但显示消息的引导加载程序。出于某种原因,我可以写入视频内存,但最后一个字母的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
    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