2

今天我在玩我的旧电脑,并尝试在 Delphi 中使用 16 位汇编。它适用于 32 位,但我在使用中断时总是遇到问题。蓝屏或冻结,这让我相信这是不可能的。我在 Windows 98 上并使用 Delphi 7,使用这个简单的代码。

program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
begin
    asm
    mov ax,$0301
    mov bx,$0200
    mov cx,$0001
    xor dx,dx
    int $13
    int $20
    end;
MessageBox(0,'Okay','Okay',MB_OK);
end.

在软盘驱动器上“格式化”磁盘。有没有办法在 Delphi 7 上使用它而不会冻结和蓝屏?还是 Delphi 只允许使用 32 位汇编?难道我做错了什么?

4

2 回答 2

3

只要您的应用程序构建为“32 位 Windows”应用程序,中断就无法工作,因为这些中断根本没有映射。

您可以尝试将您的应用程序编译为“16 位控制台”应用程序。我不知道 Delphi 是否支持这一点,但这是我获得int 0x13and仿真的最佳猜测int 0x10

顺便说一句,您的汇编代码不应该使用十六进制数字,例如:?

mov ax, $0301
mov bx, $0200
mov cx, $0001
xor dx, dx
int $13
int $20

就像现在一样,您可能正在调用中断 $0d,根据 Ralf Brown 的中断列表,这意味着:

INT 0D C - IRQ5 - 固定磁盘 (PC,XT), LPT2 (AT), 保留 (PS/2)

于 2017-05-25T21:39:43.523 回答
2

Delphi 7 生成 32 位可执行文件。因此,您的 16 位汇编代码与您使用的编译器不兼容。您可能对 16 位编译器有一些运气,例如 Turbo Pascal 或 Delphi 1。但我怀疑,使用 Win32 API 来实现您的目标会更有意义。

于 2017-05-26T01:29:04.440 回答