【发布时间】:2018-10-19 19:14:38
【问题描述】:
我正在创建自定义 MBR,它必须加载存储在接下来 32 个扇区中的应用程序,除了加载应用程序之外一切正常,我不明白我做错了什么,所以如果有人知道什么以及如何修复它,请帮帮我。
org 0x7c00
bits 16
Kernel:
;---Setup Segments
xor ax, ax ;AX=0
mov ds, ax ;DS=ES=0 because we use an org of 0x7c00 - Segment<<4+offset = 0x0000<<4+0x7c00 = 0x07c00
mov es, ax
mov ss, ax
mov sp, 0x7c00 ;SS:SP= 0x0000:0x7c00 stack just below bootloader
;---Read Kernel
mov bx, buffer ;ES: BX must point to the buffer
mov [BOOT_DRIVE], dl ;save the boot drive
mov dl, [BOOT_DRIVE] ;use boot drive passed to bootloader by BIOS in DL
mov dh,0 ;head number
mov ch,0 ;track number
mov cl,2 ;sector number
mov al,128 ;number of sectors to read
mov ah,2 ;read function number
int 13h
;---Start Application
jmp buffer
;Fake MBR Signature
BOOT_DRIVE: db 0
times 510 - ($ - $$) db 0
dw 0xAA55
;Victoria Freeware - The Kernel
victoria: incbin "Victoria.com"
times 65536 - ($ - $$) db 0
;Buffer
buffer:
【问题讨论】:
-
嗯,我首先想到的是设置细分。你做
mov sp, 0x7c00,你说移动0x7c00到sp。但是你也做mov ax, ds并且你希望这会将 ax 移到 ds?您认为mov会朝哪个方向移动?你也永远不会确切地说出了什么问题。不要强迫我们运行您的代码来试图了解您的问题。 -
你把
buffer:放错地方了。应该在dw 0xAA55之后 -
很有趣,但它不起作用,没有任何改变
-
我可以告诉你,反汇编 victoria.com(二进制文件)不会走得太远。我不确定您从哪里获得该代码,但即使将其加载到内存中,它也不会按预期运行。代码看起来很适合加载,但我认为它根本不会像您期望的那样运行 victoria.com。
-
如果您将
buffer:放在dw 0xAA55行之后,则此代码是正确的。问题是Victoria.com不包含可以按照加载方式正常运行的代码。
标签: assembly nasm x86-16 bootloader