所以我是这个低级编程的新手,我试图在我的汇编源文件中调用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()来解决这个问题,但是当我试图尽可能高效地编写这个测试代码时,这似乎不是最佳的......
有什么建议是最好的处理方式吗?
1条答案
按热度按时间iyfjxgzm1#
我假设链接器没有看到在我的C源文件中使用的stdio. h文件
正确。是
#include
。这由预处理器处理。它将一堆函数声明(如printf
和scanf
)插入到翻译单元中。函数 definitions 在其他地方,这是链接器的工作。并试图通过排除这一行(?)).
不正确。链接器根本没有工作要做。
printf
和scanf
都不会被你的C翻译单元使用。真正的问题似乎是MASM没有告诉链接器它 * 需要 *
printf
链接到可执行文件。汇编当然是一种非常原始的语言;你基本上要求链接器插入printf
函数的地址。这 * 假设 *printf
函数已经是您的可执行文件的一部分,这反过来意味着其他人要求包含printf
。通常,这不是问题,因为汇编很少使用,当使用它时,它不会调用非汇编代码,当它调用时,它会回调到您自己的C或C++函数。你的.cpp文件中的函数被链接器包含 * 因为 * 它们在你自己的.cpp文件中。
printf
必须来自一个库,它的工作方式不同。如果MASM没有告诉链接器它需要什么,您可以直接告诉它。
/INCLUDE:printf
告诉链接器添加printf
,即使没有翻译单元要求它。