【问题标题】:nasm win32 programming "undefined reference to..."nasm win32 编程“未定义的引用...”
【发布时间】:2014-02-28 09:49:40
【问题描述】:

我正在尝试在 windows xp 上的 mingw32 中用 nasm 和 ld 组装和链接一个简单的代码 这是我的代码,

   extern _CopyFileA

section .data
    src  dd 'abc.txt',0
    dest dd 'xyz.txt',0
    false dd 'FALSE',0

section .text
    global  _WinMain@16
    _WinMain@16:


    push src
    push dest
    push false
    call _CopyFileA
    add esp, 12

    ret

我正在尝试在winbase.h 中使用CopyFileA 函数

组装正常

nasm -f win32 copy.asm

ld 失败

ld file.obj -lkernel32

它说,

undefined reference to `CopyFileA'

【问题讨论】:

  • 您的意思是_CopyFileA@12 吗?
  • 是的。刚才我尝试将它与 GoLink 链接。它成功链接。但是exe文件执行在中间崩溃。文件复制成功。如何避免崩溃?
  • Win32 API 使用stdcall 调用约定,这意味着您不应该在函数调用后清理堆栈。此外,您可能应该以 0 作为参数调用 ExitProcess 来结束您的程序。
  • 哇。我从来不知道。感谢加载。你刚刚治愈了 3 个小时的头痛。 :) 现在它正在工作。请将其添加为答案。

标签: windows winapi assembly mingw nasm


【解决方案1】:

Win32 API 使用stdcall calling convention,这意味着被调用者负责清理堆栈。因此,您不应自己执行此操作(即,在调用 CopyFileA 之后不应有 add esp, 12)。

stdcall 调用约定的另一个效果是函数名称被修饰,带有@ 符号后跟函数参数的大小(以字节为单位)(如_WinMain@16) . CopyFile function 接受 3 个参数,每个参数 4 个字节(总共 12 个字节),因此您应该将其称为 (_CopyFileA@12)。

最后,您应该通过调用 ExitProcess 来结束 Windows 应用程序。

【讨论】:

  • 再挑一个。我怀疑“假”是否应该被定义为文本“假”——可能为零。 (这些参数是否按正确的顺序推送?)
猜你喜欢
  • 2014-10-23
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多