assembly 创建VirtualBox的可启动映像

oprakyz7  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(116)

我只需要打印欢迎词。
在这个论坛上有一些提示,但是很难把所有的都放在一起。
所以我创建子一个类似于这个最小ASM

[ORG 0x7c00]   
BITS 16

main:
                mov ax, 0x07C0                                  
                mov ds, ax         
                mov es, ax         

                mov bp, message    
                mov bh, 0          
                mov bl, 00001111b  
                                   
                mov cx, 13         
                mov al, 1          
                                   
                mov ah, 0x13       
                mov dx, 0          
                int 0x10           

                cli
                hlt
                
                jmp $

message     db      "Hello, World!"
length      db      (length - message)
                             
times   510-($-$$) db 0
dw      0xaa55

构建:

nasm -f bin sboot.asm -o sboot.bin
dd if=sboot.bin of=sboot.img bs=512 count=1 conv=notrunc

并将IMG文件转换为ISO与程序CDBurnerXP.我正在使用“ Boot 选项...”并选择:

  • 仿真类型=软盘1.44MB( Boot 映像95/98/ME)
  • 载荷段= 7 c 0
  • 部门:1
  • 平台:x86-64我还添加了虚拟txt文件,以便ISO不为空,并将所有内容保存为ISO文件。

然后,我尝试在Virtual Box中运行它,并使用最少的选项(禁用:音频、网络、USB)并且它崩溃。容器进入“已中止”状态
来自VirtualBox的日志没有特别说明:

00:00:06.813147 PDMLdr: pdmR3LoadR0U: pszName="VMMR0.r0" rc=VERR_LDR_GENERAL_FAILURE szErr="SUP_IOCTL_LDR_OPEN failed"
00:00:06.813197 VMSetError: F:\tinderbox\win-rel\src\VBox\VMM\VMMR3\PDMLdr.cpp(750) int __cdecl pdmR3LoadR0U(struct UVM *,const char *,const char *,const char *); rc=VERR_LDR_GENERAL_FAILURE
00:00:06.813199 VMSetError: Failed to load R0 module C:\Program Files\Oracle\VirtualBox/VMMR0.r0: SUP_IOCTL_LDR_OPEN failed
00:00:06.813209 VMSetError: F:\tinderbox\win-rel\src\VBox\VMM\VMMR3\VM.cpp(585) int __cdecl vmR3CreateU(struct UVM *,unsigned int,int (__cdecl *)(struct UVM *,struct VM *,const struct VMMR3VTABLE *,void *) noexcept,void *); rc=VERR_LDR_GENERAL_FAILURE
00:00:06.813212 VMSetError: Failed to load VMMR0.r0
00:00:06.813425 ERROR [COM]: aRC=E_FAIL (0x80004005) aIID={6ac83d89-6ee7-4e33-8ae6-b257b2e81be8} aComponent={ConsoleWrap} aText={Failed to load R0 module C:\Program Files\Oracle\VirtualBox/VMMR0.r0: SUP_IOCTL_LDR_OPEN failed (VERR_LDR_GENERAL_FAILURE).
00:00:06.813445 Failed to load VMMR0.r0 (VERR_LDR_GENERAL_FAILURE)}, preserve=false aResultDetail=-618
00:00:06.813679 Console: Machine state changed to 'PoweredOff'
00:00:06.980955 Power up failed (vrc=VERR_LDR_GENERAL_FAILURE, rc=E_FAIL (0X80004005))
00:00:06.984607 GUI: UIMachineViewNormal::resendSizeHint: Restoring guest size-hint for screen 0 to 800x600

知道是哪里出了问题吗

siv3szwd

siv3szwd1#

[ORG 0x7c00]   
BITS 16

main:
          mov ax, 0x07C0                                  
          mov ds, ax         
          mov es, ax

您的DS和ES设置与ORG设置不匹配!
如果使用[ORG 0x7c00],则必须设置DS=0和ES=0。
由于您只使用取决于ES:BP的BIOS功能13 h,因此设置ES就足够了:

xor  ax, ax
mov  es, ax

相关问题