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
构建引导加载程序
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