程序集 – MBR从DOS启动
发布时间:2020-12-14 02:26:11 所属栏目:Windows 来源:网络整理
导读:对于一个项目,我想直接从DOS调用第一个硬盘上的MBR.我编写了一个小的汇编程序,它将MBR加载到内存中0:7c00h,远远超过它.我把我的util放在(DOS)可启动软盘上.我正在尝试启动的磁盘(HD0,0x80)上有一个TrueCrypt启动加载程序.当我在此设置中运行该工具时,它会显
对于一个项目,我想直接从DOS调用第一个硬盘上的MBR.我编写了一个小的汇编程序,它将MBR加载到内存中0:7c00h,远远超过它.我把我的util放在(DOS)可启动软盘上.我正在尝试启动的磁盘(HD0,0x80)上有一个TrueCrypt启动加载程序.当我在此设置中运行该工具时,它会显示TrueCrypt屏幕,但输入密码后会崩溃系统.当我在普通的WinXP机器上运行我的小功能(w00t.com)时,它似乎立即崩溃.
显然我忘记了BIOS通常会做的一些关键事情,我猜这是微不足道的.有更好的裸机DOS和BIOS经验的人可以帮助我吗? 继承我的代码: .MODEL tiny .386 _TEXT SEGMENT USE16 INCLUDE BootDefs.i ORG 100h start: ; http://vxheavens.com/lib/vbw05.html ; Before DOS has booted the BIOS stores the amount of usable lower memory ; in a word located at 0:413h in memory. We going to erase this value because ; we have booted dos before loading the bootsector,and dos is fat (and ugly). ; fake free memory ;push ds ;push 0 ;pop ds ;mov ax,TC_BOOT_LOADER_SEGMENT / 1024 * 16 + TC_BOOT_MEMORY_REQUIRED ;mov word ptr ds:[413h],ax ;ax = memory in K ;pop ds ;lea si,memory_patched_msg ;call print ;mov ax,cs mov ax,0 mov es,ax ; read first sector to es:7c00h (== cs:7c00) mov dl,80h mov cl,1 mov al,1 mov bx,7c00h ;load sector to es:bx call read_sectors lea si,mbr_loaded_msg call print lea si,jmp_to_mbr_msg call print ;Set BIOS default values in environment cli mov dl,80h ;(drive C) xor ax,ax mov ds,ax mov es,ax mov ss,ax mov sp,0ffffh sti push es push 7c00h retf ;Jump to MBR code at 0:7c00h ; Print string print: xor bx,bx mov ah,0eh cld @@: lodsb test al,al jz print_end int 10h jmp @B print_end: ret ; Read sectors of the first cylinder read_sectors: mov ch,0 ; Cylinder mov dh,0 ; Head ; DL = drive number passed from BIOS mov ah,2 int 13h jnc read_ok lea si,disk_error_msg call print read_ok: ret memory_patched_msg db 'Memory patched',13,10,7,0 mbr_loaded_msg db 'MBR loaded',0 jmp_to_mbr_msg db 'Jumping to MBR code',0 disk_error_msg db 'Disk error',0 _TEXT ENDS END start 解决方法
编辑 – 新答案:
好吧,好像我第一次误解了你的问题.我能给出的唯一进一步建议是: >检查您是否未加载HIMEM.SYS和/或EMM386.EXE(也不加载任何其他内存管理器).引导加载程序执行时,CPU必须处于实模式. 上一个答案: ORG 100h在启动加载程序中是否真的是正确的做法? 我认为这与DOS .com可执行文件有关,因为DOS将使用程序段前缀(PSP)初始化前256个字节.如果您编写引导加载程序,则没有DOS,也没有PSP这样的东西.我想这必须是ORG 0. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |