- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于一个项目,我想直接从 DOS 调用第一个硬盘上的 MBR。我编写了一个小型汇编程序,该程序将 MBR 加载到内存中的 0:7c00h 处,并进行远跳转。我已将实用程序放在 (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', 13, 10, 7, 0
jmp_to_mbr_msg db 'Jumping to MBR code', 13, 10, 7, 0
disk_error_msg db 'Disk error', 13, 10, 7, 0
_TEXT ENDS
END start
最佳答案
已编辑 - 新答案:
好吧,看来我首先误解了你的问题。我能给出的唯一进一步建议是:
检查您是否没有加载 HIMEM.SYS
和/或 EMM386.EXE
(也没有加载任何其他内存管理器)。当引导加载程序执行时,CPU必须处于实模式。
看看 Ralf Brown 的中断列表。如果我没记错的话,其中有一些有关启动过程的技术信息。它可能会给你一个提示。
查看其他加载器实用程序的源代码,例如加载林
。 (它所做的事情与您的实用程序并不完全相同,但仍然可以为您提供一些见解。)
上一个答案:
ORG 100h
真的是引导加载程序中正确的做法吗?
我认为这仅与 DOS
.com
可执行文件相关,因为 DOS 将使用程序段前缀 (PSP) 初始化前 256 个字节。如果你编写一个引导加载程序,就没有 DOS,也没有 PSP 之类的东西。我想这必须是
ORG 0
。
关于assembly - 从 DOS 启动 MBR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2639234/
在MS-DOS中,如果输入dir *.pdf,我将在目录中获取所有PDF文件。除了PDF文件,有什么方法可以获取所有内容?像dir !*.pdf一样? 谢谢! 最佳答案 我认为findstr有一个/v
我们如何在 DOS 中实现递归目录列表? 我正在 DOS 中寻找一个命令或脚本,它可以为我提供类似于 Unix 中的 ls -R 命令的递归目录列表。 最佳答案 您可以使用: dir /s 如果您需要
当我使用 ren "C:\folder\file""C:\folder\file.txt" 出现错误“命令的语法不正确。” 但是如果我 CD 到文件夹并使用 ren "file""file.txt"
比如,我能不能做 回显 3 + 5 并得到 8? 是否可以使用日期进行计算? 最佳答案 您可以使用set/a 来计算数学表达式: set /a x=3+5 echo %x% 编辑:这是一行: @for
我正在寻找一个 DOS 脚本来删除根目录中的所有文件和子目录,但根目录中的一组批处理文件 (*.bat) 除外。任何 DOS 运动员都知道一种简单的方法来做到这一点? 更新 谢谢大家的帮助。这就是我现
如何在目录及其子目录中搜索文件并以简洁的格式显示文件名及其创建时间。 我尝试了dir sam.csv/b/s/a-d 但是不起作用。 输出应该如下所示 c:\Data\Sam.txt 10/10/20
我有一个在并发 DOS 3.1 上运行的软件,我使用 QEMU 5.1 对其进行模拟。 在此程序中,有多个打印数据的选项。问题是到达我的主机的数据与发送的数据不对应。 启动qemu的命令: qemu-
我有一个在并发 DOS 3.1 上运行的软件,我使用 QEMU 5.1 对其进行模拟。 在此程序中,有多个打印数据的选项。问题是到达我的主机的数据与发送的数据不对应。 启动qemu的命令: qemu-
在 C 中,我如何写入特定的内存位置,例如视频内存 b800,在 DOS 下(真正的 DOS,MS DOS 6.22) 我知道 C 没有内置任何东西可以做到这一点,但可能有一些特定于平台的东西,例如可
我有一个大约 15 年前购买的非常古老的应用程序,它由 5 个 .exe 文件组成,用于存储患者的个人资料和信息。问题是该应用程序被编程为在特定计算机上运行。 由于我对破解知之甚少,我尝试使用 win
这个问题已经有答案了: How to redirect stderr to null in cmd.exe (1 个回答) 已关闭 4 年前。 我想抑制在 DOS 下运行的脚本的输出,类似于 *nix
我想从 MATLAB 在 dos 中执行一个批处理文件,并立即将控制权返回给 MATLAB。但是,我想在不打开 dos 窗口的情况下执行此操作(或者,至少,让 dos 窗口在最后消失)。 如果我这样格
最初... 我在 10 年前(大学)开始用 C 编程。我使用的 IDE 是 Turbo C++ IDE。 我所有的 c 程序都是 16 位的。 内存模型:巨大。 图形:4 位(16 色)。 图形驱动:
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 11 年前关闭。 Improve this
我需要一个批处理文件中的脚本,当我运行它时,它会将我昨天的日期放入一个变量中。包括 3 月 1 日等条件(根据年份可能是 2 月 28 日或 29 日) 最佳答案 假设您的意思是 ms-dos 批处理
我有一个可以做几件事的批处理文件。如果其中一个失败,我想退出整个程序。例如: @echo off type foo.txt 2>> error.txt >> success.txt mkdir bob
我正在尝试编写一个批处理脚本,将多个 css 文件合并到一个文件中。到目前为止,我已经想出了这个...... # Set start folders & files set fn1=filename.
我有不同的文件夹,例如:a、b、c 等,每个文件夹都有不同的文件,例如:x、y、z 等。 文件 x,y,z 位于每个文件夹中。有没有办法使用单个命令从不同文件夹复制每个文件?我希望结果是所有文件夹中的
我需要获取命令行输出的第一行而不是所有行,例如,如果我给 C:\Temp> dir 我只需要显示第一行, 11/15/2012 06:58 PM
如何使用 dos 批处理文件命令将日期设置为当前日期。 最佳答案 如果您需要在批处理文件中使用当前日期,则变量 %date% 具有当前日期: echo %date% 23/02/2010 它使用您计算
我是一名优秀的程序员,十分优秀!