加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

程序集 – 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必须处于实模式.
>看看拉尔夫·布朗的中断名单.如果我没记错的话,那里有关于启动过程的某些技术信息.它可能会给你一个提示.
>查看其他加载器实用程序的源代码,例如LOADLIN. (它与您的实用程序完全不同,但可能会给您一些见解.)

上一个答案:

ORG 100h在启动加载程序中是否真的是正确的做法?

我认为这与DOS .com可执行文件有关,因为DOS将使用程序段前缀(PSP)初始化前256个字节.如果您编写引导加载程序,则没有DOS,也没有PSP这样的东西.我想这必须是ORG 0.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读