2015-11-02 54 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