gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:41:28 25 4
gpt4 key购买 nike

我正在尝试在 Visual Studio 2013 中编译 90 年代后期的一些代码。在大多数情况下,它非常简单,但有一小部分 ASM block 我不太确定(我从未做过任何 x86 ASM,多年前在大学里只有微 Controller 特定的东西)。

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

错误 1 ​​error C2400:'opcode' 中的内联汇编程序语法错误;找到“数据类型”

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 是 Intel x86 INT(中断)指令 - 它并不意味着 C 整数。删除它前面的单词“short”,它会导致语法错误,因为“short”对汇编程序没有意义。

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

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

无论如何,如果需要从用户模式进行硬件级访问,那么在移植到 Win32 时可能会遇到其他几个问题,因为用户模式运行的权限级别低于内核模式驱动程序。

因此,虽然您的代码应该在从 _asm block 中删除该 short 之后编译,但很可能程序会在它执行时立即崩溃命中那条线。

关于c++ - 从 Win16 移植到 Win32 - ASM 代码块混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28085239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com