Assembly 如何使用汇编中的printf?

Assembly 如何使用汇编中的printf?,assembly,include,x86,Assembly,Include,X86,我有一个MSVC++项目,用于编译和运行汇编代码 总而言之,c: #include <stdio.h> void go() ; int main() { go() ; // call the asm routine } 但当我编译并运行时,go.asm中会出现一个错误: 错误A2006:未定义的符号:puts 如何在中为项目中的.asm文件定义符号?我认为这比我能更好地解释它 粗略地说,汇编程序在go.asm中找不到符号(函数)。你必须告诉它它是一个外部符号 链接文章从使用

我有一个MSVC++项目,用于编译和运行汇编代码

总而言之,c:

#include <stdio.h>

void go() ;

int main()
{
  go() ; // call the asm routine
}
但当我编译并运行时,go.asm中会出现一个错误:

错误A2006:未定义的符号:puts 如何在
中为项目中的.asm文件定义符号?

我认为这比我能更好地解释它

粗略地说,汇编程序在
go.asm
中找不到符号(函数)。你必须告诉它它是一个外部符号

链接文章从使用汇编作为主要语言的角度来构建混合代码应用程序,包括运行
main
例程。如果您使用的是基于
C
的主例程,那么所做的大部分工作都是不必要的,您只需要:

使用/Mx组装组装模块 保留非局部的情况 名字。如果使用MASM版本6.0或 稍后,使用/Cx保留 非本地名称

以及:

在汇编模块中包含语句.MODEL、c以 确保C命名和调用 使用约定,并且 模块使用相同的默认段。 将是小型、中型、, 紧凑的或大的

EXTERN
指令,用于您希望以以下格式调用的每个函数:
EXTERN printf:proc

以下是我所拥有的

它起作用了

.586 .model flat,c printf PROTO C :VARARG ; The secret sauce.. a prototype of printf .data msgHello1 BYTE "GREETINGS AND WELCOME TO EARTH!",0 .code go PROC push OFFSET msgHello1 call printf add esp, 4 ; Stack cleaning RET go ENDP end .586 .模型公寓,c printf协议C:VARARG;秘方。。printf原型 .数据 msgHello1字节“欢迎来到地球!”,0 .代码 去进程 推送偏移量msgHello1 调用printf 添加esp,4;烟囱清理 RET 结束 结束

您必须以某种方式链接到您的C标准库。printf的定义在哪里?如果您使用的是C库,则需要将其定义为extern。我猜那次撞击与呼叫对流有关。使用ollydbg调试。。。 .586 .model flat,c printf PROTO C :VARARG ; The secret sauce.. a prototype of printf .data msgHello1 BYTE "GREETINGS AND WELCOME TO EARTH!",0 .code go PROC push OFFSET msgHello1 call printf add esp, 4 ; Stack cleaning RET go ENDP end