从 Win16 移植到 Win32 - ASM 代码块混淆

Porting from Win16 to Win32 - ASM code block confusion

本文关键字:代码 ASM Win32 Win16      更新时间:2023-10-16

我正在尝试在Visual Studio 2013中编译一些九十年代后期的代码。在大多数情况下,它非常简单,但有少数 ASM 块我不太确定(我从未做过任何 x86 ASM,只有几年前在 uni 的微控制器特定内容的奇怪部分)。

下面的函数生成了与大小不匹配相关的编译错误,因此我将 ints 更改为 short int,认为它是为 16 位编写的。这摆脱了大小错误,但现在我有这个与"短 int 60h"行相关的错误:

错误

1 错误 C2400:"操作码"中的内联汇编程序语法错误;找到"数据类型"

static unsigned int Read_TSR( unsigned short int b_offset )
{
  unsigned short int buffer;
  _asm {
    mov ax,899bh
        mov bx,2
        mov dx,b_offset
        short int 60h
    mov buffer,bx
  }
  return ( buffer );
}

所以上面所有的短整数都只是原始代码中的整数。

如果我删除 short 并将其保留为"int 60h",错误就会消失,但我担心我现在才会再次不匹配大小,也许编译器出于某种原因没有抱怨。

谷歌搜索"找到的数据类型"错误,我没有遇到这种语法,这对我来说看起来很奇怪,只是声明了一个 int,好像在 ASM 中间什么都不做。

谁能建议如何安全地移植它?解释为什么那个 int 甚至在那里也会饶有兴趣地阅读......

谢谢

_asm代码块中的int是英特尔 x86 INT(中断)指令 - 它并不意味着 C 整数。 从它前面删除单词"short",它会导致语法错误,因为那里的"short"对汇编程序没有意义。

INT 0x60 主要保留供用户/供应商使用,但也已用于其他一些用途 - 请参阅 http://www.delorie.com/djgpp/doc/rbinter/ix/60/。

这是硬件级接口的一部分吗? 函数的名称似乎暗示了这一点。 此中断调用可能是供应商提供的设备接口的一部分,因此可能没有任何等效的 Win32 函数。

在任何情况下,如果需要从用户模式进行硬件级访问,则移植到 Win32 时可能会遇到其他几个问题,用户模式以比内核模式驱动程序等更低的特权级别运行。

因此,尽管您的代码应该在从_asm块中删除该short进行编译,但程序在遇到该行时很可能会立即崩溃。

正如 frasnian 所说,int 60h是一个用户中断,其含义取决于用户定义方式axbx。一个简短的互联网搜索发现了这个页面,这表明它被用于爱克发一个名为TTSR.exe的程序。但它没有给出bx=0002h的定义。

TSR在过去的意思是"终止并留下居民"。在Windows成为多任务处理之前,程序仍然可以要求在退出后保留在内存中。然后,当生成特定中断时,它可以获得控制 - 例如,通过int 60h指令。

无论如何,这在 32 位 Windows 上不起作用,因此您必须以某种方式弄清楚它试图做什么,然后自己编程。