Assembly 将字符放入视频内存的汇编代码在Bochs中不起作用,但在VirtualBox中正常

Assembly 将字符放入视频内存的汇编代码在Bochs中不起作用,但在VirtualBox中正常,assembly,x86,virtualbox,bootloader,bochs,Assembly,X86,Virtualbox,Bootloader,Bochs,我写了一些代码写入引导扇区并显示'L' mov ax,0xb800 mov es,ax mov byte [es:0x00],'L' mov byte [es:0x01],0x07 片段0xb800用于视频内存,因此我将'L'放入其中,并将显示'L' 如果我使用VirtualBox,效果会很好,但如果使用bochs,则不会显示任何内容 我使用nasm-f bin boot.asm-o boot.bin构建引导加载程序 我在Windows7和Windows8上运行,没问题 -我创建了一个VHD磁

我写了一些代码写入引导扇区并显示
'L'

mov ax,0xb800
mov es,ax
mov byte [es:0x00],'L'
mov byte [es:0x01],0x07
片段
0xb800
用于视频内存,因此我将
'L'
放入其中,并将显示
'L'

如果我使用VirtualBox,效果会很好,但如果使用bochs,则不会显示任何内容

我使用
nasm-f bin boot.asm-o boot.bin
构建引导加载程序

  • 我在Windows7和Windows8上运行,没问题
  • -我创建了一个
    VHD
    磁盘映像,然后我构建代码并将其写入磁盘映像,然后我在VirtualBox中启动,它工作了

    2.我用Bochs在Ubuntu 14.04 i386虚拟机上运行,它不工作。 我的bochs设置:(
    bochs x86 Emulator 2.4.6

    我用
    NASM
    构建代码,并用
    dd if=boot.bin of=floppy.img
    将其写入
    floppy.img
    。 启动Bochs后,除光标快速闪烁外,未显示任何内容

    以下是我的完整代码:

             mov ax,0xb800                 
             mov es,ax
    
             ;just display string "Label offset:"
             mov byte [es:0x00],'L'
             mov byte [es:0x01],0x07
             mov byte [es:0x02],'a'
             mov byte [es:0x03],0x07
             mov byte [es:0x04],'b'
             mov byte [es:0x05],0x07
             mov byte [es:0x06],'e'
             mov byte [es:0x07],0x07
             mov byte [es:0x08],'l'
             mov byte [es:0x09],0x07
             mov byte [es:0x0a],' '
             mov byte [es:0x0b],0x07
             mov byte [es:0x0c],"o"
             mov byte [es:0x0d],0x07
             mov byte [es:0x0e],'f'
             mov byte [es:0x0f],0x07
             mov byte [es:0x10],'f'
             mov byte [es:0x11],0x07
             mov byte [es:0x12],'s'
             mov byte [es:0x13],0x07
             mov byte [es:0x14],'e'
             mov byte [es:0x15],0x07
             mov byte [es:0x16],'t'
             mov byte [es:0x17],0x07
             mov byte [es:0x18],':'
             mov byte [es:0x19],0x07
    
             mov ax,number                 
             mov bx,10
    
             ;set base address to ds
             mov cx,cs
             mov ds,cx
    
             ;below codes just display the offset of label "number" in decimal base
             mov dx,0
             div bx
             mov [0x7c00+number+0x00],dl   
    
             xor dx,dx
             div bx
             mov [0x7c00+number+0x01],dl   
    
             xor dx,dx
             div bx
             mov [0x7c00+number+0x02],dl   
    
             xor dx,dx
             div bx
             mov [0x7c00+number+0x03],dl   
    
             xor dx,dx
             div bx
             mov [0x7c00+number+0x04],dl   
    
             mov al,[0x7c00+number+0x04]
             add al,0x30
             mov [es:0x1a],al
             mov byte [es:0x1b],0x04
    
             mov al,[0x7c00+number+0x03]
             add al,0x30
             mov [es:0x1c],al
             mov byte [es:0x1d],0x04
    
             mov al,[0x7c00+number+0x02]
             add al,0x30
             mov [es:0x1e],al
             mov byte [es:0x1f],0x04
    
             mov al,[0x7c00+number+0x01]
             add al,0x30
             mov [es:0x20],al
             mov byte [es:0x21],0x04
    
             mov al,[0x7c00+number+0x00]
             add al,0x30
             mov [es:0x22],al
             mov byte [es:0x23],0x04
    
             mov byte [es:0x24],'D'
             mov byte [es:0x25],0x07
    
       infi: jmp near infi                 
    
      number db 0,0,0,0,0
    
      times 203 db 0
                db 0x55,0xaa
    

    你确定你给我们的密码无效吗?在实际代码中是否可能显示字符串变量中的字符(但失败)?我有预感,这个问题比您显示的代码更重要。如果您使用引导扇区的完整代码编辑问题,我们可能能够更好地进行故障排除。另一种可能是您没有正确使用bochs。您是否记得将VGA硬件设置为80x25单平面文本模式?引导加载程序会自动为您执行此操作(在加载任何驱动程序之前,早期内核代码需要(轻松)访问VGA)。但是,我不记得这是否是默认行为。@KemyLand:今天早上,当我有机会的时候,我把这段代码原封不动地使用了,只是在屏幕更新之后,在顶部添加了
    [BITS 16]
    org 0x7C00
    ,并在2.88mb磁盘映像的MBR上添加了一个引导加载程序签名,将其加载到bochs中,显示屏的左上角出现了一个
    L
    (它重写了BIOS文本的一部分),但它是可见的。与VirtualBox使用相同的磁盘映像。我做实验的目的是希望问题中提供的代码看起来很好,应该可以工作。@KemyLand:但我的简单测试成功了。事实上,然后我尝试了Bochs附带的两款VGA Bios,效果不错。我唯一能想到的另一种可能性是,在某些特定版本的Bochs上,如果在屏幕更新之后立即放入
    jmp$
    ,虚拟环境将进入无限循环,屏幕将永远不会刷新。我们不知道他是如何结束他的引导加载程序代码的,但是解决这个问题的一种方法是类似于
    cli
    endloop:hlt
    jmp endloop
             mov ax,0xb800                 
             mov es,ax
    
             ;just display string "Label offset:"
             mov byte [es:0x00],'L'
             mov byte [es:0x01],0x07
             mov byte [es:0x02],'a'
             mov byte [es:0x03],0x07
             mov byte [es:0x04],'b'
             mov byte [es:0x05],0x07
             mov byte [es:0x06],'e'
             mov byte [es:0x07],0x07
             mov byte [es:0x08],'l'
             mov byte [es:0x09],0x07
             mov byte [es:0x0a],' '
             mov byte [es:0x0b],0x07
             mov byte [es:0x0c],"o"
             mov byte [es:0x0d],0x07
             mov byte [es:0x0e],'f'
             mov byte [es:0x0f],0x07
             mov byte [es:0x10],'f'
             mov byte [es:0x11],0x07
             mov byte [es:0x12],'s'
             mov byte [es:0x13],0x07
             mov byte [es:0x14],'e'
             mov byte [es:0x15],0x07
             mov byte [es:0x16],'t'
             mov byte [es:0x17],0x07
             mov byte [es:0x18],':'
             mov byte [es:0x19],0x07
    
             mov ax,number                 
             mov bx,10
    
             ;set base address to ds
             mov cx,cs
             mov ds,cx
    
             ;below codes just display the offset of label "number" in decimal base
             mov dx,0
             div bx
             mov [0x7c00+number+0x00],dl   
    
             xor dx,dx
             div bx
             mov [0x7c00+number+0x01],dl   
    
             xor dx,dx
             div bx
             mov [0x7c00+number+0x02],dl   
    
             xor dx,dx
             div bx
             mov [0x7c00+number+0x03],dl   
    
             xor dx,dx
             div bx
             mov [0x7c00+number+0x04],dl   
    
             mov al,[0x7c00+number+0x04]
             add al,0x30
             mov [es:0x1a],al
             mov byte [es:0x1b],0x04
    
             mov al,[0x7c00+number+0x03]
             add al,0x30
             mov [es:0x1c],al
             mov byte [es:0x1d],0x04
    
             mov al,[0x7c00+number+0x02]
             add al,0x30
             mov [es:0x1e],al
             mov byte [es:0x1f],0x04
    
             mov al,[0x7c00+number+0x01]
             add al,0x30
             mov [es:0x20],al
             mov byte [es:0x21],0x04
    
             mov al,[0x7c00+number+0x00]
             add al,0x30
             mov [es:0x22],al
             mov byte [es:0x23],0x04
    
             mov byte [es:0x24],'D'
             mov byte [es:0x25],0x07
    
       infi: jmp near infi                 
    
      number db 0,0,0,0,0
    
      times 203 db 0
                db 0x55,0xaa