你如何使用大会的printf?

时间:2010-12-30 15:56:33

标签: assembly include x86

我已经设置了一个MSVC ++项目来编译和运行汇编代码。

在main.c中:

#include <stdio.h>

void go() ;

int main()
{
  go() ; // call the asm routine
}

在go.asm中:

.586
.model flat, c
.code

go PROC
  invoke puts,"hi"
  RET
go ENDP

end

但是当我编译并运行时,我在go.asm中遇到错误:

错误A2006:未定义的符号:puts

如何在<stdio.h>中为项目中的.asm文件定义符号?

2 个答案:

答案 0 :(得分:1)

这就是我所拥有的。

它有效!!

.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

答案 1 :(得分:0)

我认为article比我更好地解释了它。

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

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

  

使用/ Mx组装装配模块   保留非本地的情况   名。如果使用MASM 6.0或   以后,使用/ Cx来保存   非本地名称。

  

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

您希望以格式EXTERN调用的每个函数的

EXTERN printf:proc指令。