assembly 在64位MASM文件中调用C/C++函数

4ngedf3f  于 2023-08-06  发布在  C/C++
关注(0)|答案(1)|浏览(196)

所以我是这个低级编程的新手,我试图在我的汇编源文件中调用stdio. h函数printf(),它链接到我的C++源文件。
64-位MASM文件:

option casemap:none

.data

    string byte 'Hello Biss',10,0

.code 
    externdef printf:proc

    public asmFunc
    asmFunc proc
    sub rsp,56
    
    
    lea rcx, string
    call printf
    
    add rsp,56
ret

asmFunc endp
end

字符串
我的asmFunc被一个C++程序调用:

#include <stdio.h>

extern "C"
{
    void asmFunc();
};

int main()
{
    printf("some text\n");
    asmFunc();
}


问题是,只有当我已经在C源文件的其他地方调用了print()函数时,代码才能工作(见上文)。当我删除<printf(“some text\n”);>行,我在Visual Studio中得到链接错误:
我假设链接器没有看到在我的C
源文件中使用的stdio.h文件,并试图通过排除这一行(?)).
现在我显然可以通过在代码中的某个地方使用printf()来解决这个问题,但是当我试图尽可能高效地编写这个测试代码时,这似乎不是最佳的......
有什么建议是最好的处理方式吗?

iyfjxgzm

iyfjxgzm1#

我假设链接器没有看到在我的C源文件中使用的stdio. h文件
正确。是#include。这由预处理器处理。它将一堆函数声明(如printfscanf)插入到翻译单元中。函数 definitions 在其他地方,这是链接器的工作。
并试图通过排除这一行(?)).
不正确。链接器根本没有工作要做。printfscanf都不会被你的C
翻译单元使用。
真正的问题似乎是MASM没有告诉链接器它 * 需要 * printf链接到可执行文件。汇编当然是一种非常原始的语言;你基本上要求链接器插入printf函数的地址。这 * 假设 * printf函数已经是您的可执行文件的一部分,这反过来意味着其他人要求包含printf
通常,这不是问题,因为汇编很少使用,当使用它时,它不会调用非汇编代码,当它调用时,它会回调到您自己的C或C++函数。你的.cpp文件中的函数被链接器包含 * 因为 * 它们在你自己的.cpp文件中。printf必须来自一个库,它的工作方式不同。
如果MASM没有告诉链接器它需要什么,您可以直接告诉它。/INCLUDE:printf告诉链接器添加printf,即使没有翻译单元要求它。

相关问题