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

时间:2016-03-10 07:32:25

标签: 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来构建引导加载程序。

  1. 我在Windows 7和Windows 8上运行,没关系。
  2. - 我创建一个VHD磁盘映像,然后我构建代码并将其写入磁盘映像,之后我开始在VirtualBox中运行。

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

    megs:32
    romimage: file=/usr/share/bochs/BIOS-bochs-latest
    vgaromimage:file=/usr/share/bochs/VGABIOS-lgpl-latest
    floppya:1_44=floppy.img,status=inserted
    boot:a
    mouse:enabled=0
    display_library:sdl
    

    我使用NASM构建代码,并使用floppy.img将其写入dd if=boot.bin of=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
    

0 个答案:

没有答案