【问题标题】:Assembly windows functions - numbers after function name?程序集窗口函数 - 函数名称后的数字?
【发布时间】:2018-07-25 11:38:55
【问题描述】:

我正在尝试编写一个使用某些 Windows API 函数的程序集,特别是 GetConsoleWindow、MessageBox 和 ShowWindow。我通过外部_MessageBoxA@16 找到了如何在随机网站上使用 MessageBox。我用extern _GetConsoleWindowA@16对GetConsoleWindow进行了同样的尝试,但是在链接时出现错误:(.text+0x4): undefined reference to GetConsoleWindowA@16'

我正在使用以下命令进行编译:nasm -f win32 message.asm -o message.obj,ld message.obj -o message.exe 函数名末尾的数字来自哪里? (例如@16)。还是我应该完全外部化其他东西?

【问题讨论】:

  • GetConsoleWindowA@16 当然在任何地方都不存在。符号错误
  • 它们以字节表示参数的大小。 GetConsoleWindowA 不带参数,因此您可以省略数字或使用 @0(不确定是哪一个)。
  • 让问题保持有趣,并且可能对您有用,这样您下次就可以避免同样的错误。告诉我们您是如何决定使用 _GetConsoleWindowA@16
  • 请注意,“externing”不是一个常用词,可能会让人感到困惑。
  • 那个网站有多“随机”?换句话说告诉我们它是什么!因此(可能)反对票(虽然我没有 - 事实上我投了赞成票)。

标签: windows winapi assembly nasm


【解决方案1】:

那些是decorated names,专门为__stdcall调用约定使用C修饰1

前导下划线 (_) 和尾随 at 符号 (@) 后跟十进制参数列表中的字节数

结尾的 AW 字符指定 API 调用的 ANSI 或 Unicode 版本。对于GetConsoleWindow,没有单独的 ANSI 或 Unicode 版本,因为 API 不直接(或间接)使用字符串作为参数或返回值。因此,装饰符号为_GetConsoleWindow@0


1仅适用于 32 位代码。在 64 位代码中,符号以未经修饰的方式导出,例如GetConsoleWindow 在这种情况下。

【讨论】:

    猜你喜欢
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    相关资源
    最近更新 更多