从 Win16 移植到 Win32 - ASM 代码块混淆
Porting from Win16 to Win32 - ASM code block confusion
我正在尝试在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
是一个用户中断,其含义取决于用户定义方式ax
和bx
。一个简短的互联网搜索发现了这个页面,这表明它被用于爱克发一个名为TTSR.exe的程序。但它没有给出bx=0002h
的定义。
TSR在过去的意思是"终止并留下居民"。在Windows成为多任务处理之前,程序仍然可以要求在退出后保留在内存中。然后,当生成特定中断时,它可以获得控制 - 例如,通过int 60h
指令。
无论如何,这在 32 位 Windows 上不起作用,因此您必须以某种方式弄清楚它试图做什么,然后自己编程。
- objdump 不显示机器代码,但显示 ASM
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 优化了 VC++ 和 ASM 中的代码
- 从 ASM 调用C++代码中标准库的链接
- C++ Lambda 生成的 ASM 代码
- 将外部.asm文件包含到C++代码中
- 为什么godbolt生成的asm输出与我在Visual Studio中的实际asm代码不同
- 这个 asm 代码的意义是什么?
- 将 GCC 特定的 ASM 代码移植到 MSVC
- 代码编译器-如何编译ASM代码
- 如何检查Firefox是否使用asm.js代码
- 将浮点数组转换为整数的最佳方式.[替换x64的asm代码]
- C++:如果 0 和 asm 在这些代码行中是什么意思
- 从 Win16 移植到 Win32 - ASM 代码块混淆
- 未定义的行为是否适用于 asm 代码
- 64 位模式下 .asm 文件中的内联代码
- 是否有可靠的工具可以删除ASM/C/C++代码中的注释
- 如何在C++和Visual Studio 2008中使用asm代码
- 在gcc中生成ASM代码需要什么,g++
- ASM代码中对c++变量的未定义引用