2015-11-02 50 views
3

我在Visual Studio 2012如何调用汇编

我试图从汇编程序调用printf编程x86汇编C函数,但只要我包括EXTERN行抛出一个错误。这可能是一些非常愚蠢的事情,比如包含C函数库,但是我找不到任何在线资源来告诉我如何正确执行它。

这里是我的代码:

.model flat 

      EXTERN _printf 

.data 

digits  byte "0" dup (10), 0   

.code 

main proc 

      lea  eax, digits 
      push eax 
      call _printf 
      add  esp, 4 

main endp 

END 

而抛出的错误是:

error A2008: syntax error : in directive 

第3行(用EXTERN行)

编辑:添加有关环境(第一线)。

+0

这是编译器和汇编具体,但看起来国外这么说,唯一的一点是'EXTERN',而不是'extern'和一些汇编程序是挑剔'printf',而不是'_printf'但大部分同时处理。你是如何编译的?组装,链接'ld'(手动)或调用'gcc'两者? –

+0

我已经尝试过所有这些。我正在使用Visual Studio 2012.我不确定它是如何组装的,但它是一个x86控制台应用程序。 – DroidFreak36

+3

['EXTERN _printf:proc'](https://msdn.microsoft.com/en-us/library/vstudio/7cycf5bc.aspx) – rkhb

回答

0

作为评论的,使用

 extern _printf:proc 

,或者如果32位模式,则可能需要使用:

 extern _printf:near 

实习医生可能需要被放置在.CODE部分。

还要在源代码顶部附近添加这两行,以使链接器查看这些库。

 includelib msvcrtd 
     includelib oldnames 
+0

对这些includelib行使用'EXTERN _printf:proc'修复了它,谢谢。 – DroidFreak36

+0

@ DroidFreak36 - 如果要调用Windows函数(如CreateFile()),请创建一个C程序并让编译器输出汇编代码来确定程序集名称。即使它是C,函数名称也是[mangled](http://en.wikipedia.org/wiki/Name_mangling),比如__imp__CreateFileA @ 28(32位模式)或__imp_CreateFile(64位模式)。 – rcgldr