Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 引导加载程序教程don';我不工作_Assembly_Bootloader - Fatal编程技术网

Assembly 引导加载程序教程don';我不工作

Assembly 引导加载程序教程don';我不工作,assembly,bootloader,Assembly,Bootloader,我试过在网上使用一些汇编教程,但大多数都不适合我。我正在使用NASM和VirtualBox(也无法让Bochs工作),类似这样的东西可以工作: [BITS 16] [ORG 0x7C00] push 0xB800 pop es mov byte [es:0],'A' mov byte [es:1],0x1F jmp $ times 510-($-$$) db 0 dw 0xAA55 但这并不是: [BITS 16] [ORG 0x7C00] mov ah,0x09 mov al,'A' mov

我试过在网上使用一些汇编教程,但大多数都不适合我。我正在使用NASM和VirtualBox(也无法让Bochs工作),类似这样的东西可以工作:

[BITS 16]
[ORG 0x7C00]
push 0xB800
pop es
mov byte [es:0],'A'
mov byte [es:1],0x1F
jmp $
times 510-($-$$) db 0
dw 0xAA55
但这并不是:

[BITS 16]
[ORG 0x7C00]
mov ah,0x09
mov al,'A'
mov bh,0
mov bl,0x1F
mov cx,1
int 0x10
jmp $
times 510-($-$$) db 0
dw 0xAA55
我正在使用我制作的批处理脚本:

:: Compile with NASM ::
@echo off
echo Compiling boot.asm to boot.bin
cd C:/Users/Christian/Desktop/Assembly

C:/nasm/nasm -f bin boot.asm -o boot.bin

:: Copy to a floppy image with bfi ::
echo Creating boot.img

cd C:/Users/Christian/Desktop/Assembly
timeout 1 >nul
C:/Users/Christian/Desktop/Assembly/bfi -b=boot.bin -t=4 -l="Boot" -f=boot.img

:: Start Virtual Machine ::
echo Starting Virtual Machine "Test"

timeout 1 >nul
"C:\Program Files\Oracle\VirtualBox\VBoxManage" controlvm "Test" poweroff
"C:\Program Files\Oracle\VirtualBox\VBoxManage" startvm "Test"
你知道为什么这不起作用吗


正如建议的那样,我还尝试了ndisam-b16 boot.img,但它只是重复输出div dh?(这在工作版本上)

作为引导加载程序,您将没有有效的堆栈,您需要自己进行设置。如果您不知道自己有一个好的堆栈,那么任何堆栈操作(使用INT调用)都充满了危险

尝试使用qEmu,或者以某种方式让Bochs工作(如果您在超级用户上遇到问题,请发帖子——我可能会提供帮助,其他人也可能会)。他们有内部微型调试器,可以让你查看内存、寄存器等,这对类似的东西非常有用。如果你用ndisam-b 16 boot.img分解boot.img,你会得到相同的代码吗?可能BIOS没有将视频模式设置为你认为的样子。您是否尝试过先用INT 0x10(AH=0)初始化它?也可以使用INT 0x10(AH=2)重置光标位置。您还假设堆栈指针有效-许多引导加载程序在条目上重置SS:SP(只是为了确保)。BIOS加载引导扇区时使用的堆栈完全有效。它与BIOS在设置过程中“使用INT调用时”使用的堆栈相同。