2010-05-12 61 views
4

我有一個簡單的hello world C程序並用/ FA編譯它。因此,編譯器也會生成相應的彙編列表。現在我想使用masm/link從生成的.asm列表中組裝可執行文件。編譯通過VC++生成的彙編輸出?

下面的命令行產生3個接頭錯誤:

\masm32\bin\ml /I"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include" /c /coff asm_test.asm 
\masm32\bin\link /SUBSYSTEM:CONSOLE /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib" asm_test.obj 

指示C-運行時功能進行了沒有鏈接到較早生成的目標文件:

asm_test.obj : error LNK2001: unresolved external symbol @[email protected] asm_test.obj : error LNK2001: unresolved external symbol _printf LINK : error LNK2001: unresolved external symbol _wmainCRTStartup asm_test.exe : fatal error LNK1120: 3 unresolved externals

這裏是所產生的組件列表

; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01 

    TITLE c:\asm_test\asm_test\asm_test.cpp 
    .686P 
    .XMM 
    include listing.inc 
    .model flat 

INCLUDELIB OLDNAMES 

PUBLIC [email protected][email protected]@[email protected] ; `string' 
EXTRN @[email protected]:PROC 
EXTRN _printf:PROC 
; COMDAT [email protected][email protected]@[email protected] 
CONST SEGMENT 
[email protected][email protected]@[email protected] DB 'hello world!', 0aH, 00H ; `string' 
CONST ENDS 
PUBLIC _wmain 
; Function compile flags: /Ogtpy 
; COMDAT _wmain 
_TEXT SEGMENT 
_argc$ = 8      ; size = 4 
_argv$ = 12      ; size = 4 
_wmain PROC      ; COMDAT 
; File c:\users\octon\desktop\asm_test\asm_test\asm_test.cpp 
; Line 21 
    push OFFSET [email protected][email protected]@[email protected] 
    call _printf 
    add esp, 4 
; Line 22 
    xor eax, eax 
; Line 23 
    ret 0 
_wmain ENDP 
_TEXT ENDS 
END 

我正在使用最新的masm32版本(6.14.8444)。

更新

如所建議的由鈍齒輪,我包括在ASM源的INCLUDELIB msvcrt.lib。該程序編譯和可執行文件被創建,但鏈接器將生成警告:

msvcrt.lib(crtmanifestrtm.obj) : warning LNK4044: unrecognized option "manifestdependency:type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'"; ignored

當我啓動可執行文件,C運行時生成以下錯誤:

Runtime error: R6034 An application has made an attempt to load the C runtime library incorrectly

+0

您已經提供了庫的路徑,但未列出要鏈接到的任何庫本身。我不確定你需要鏈接到的庫的名稱(因此評論而不是答案)。 – Cogwheel 2010-05-12 23:08:19

+1

也許msvcrt.lib? – Cogwheel 2010-05-12 23:12:08

+1

嗯,它肯定與清單文件有關,但在這一點上我很困難。也許創建一個簡單的普通C++項目,並查看鏈接器設置的線索? – Cogwheel 2010-05-14 15:46:54

回答

0

這裏有一個更好的鏈接,裝配與CRT 9

http://www.masm32.com/board/index.php?topic=9231.0

+0

不是100%確定,但我認爲這些信息與Windows附帶的'MSVCRT.DLL'有關。其中沒有安全檢查cookie功能。 – 2012-01-08 19:12:53

+0

不知道爲什麼他們的方法不適用。從線程底部看,它看起來像是用於Visual C++ 2008. – 2012-01-08 23:38:35

+0

隨Windows提供的'MSVCRT.DLL'沒有'MSVCRT90.DLL'附帶的所有清單複雜性,並且導致R6034在問題中提到的錯誤。 – 2012-01-08 23:42:21

0

刪除listing.inc 刪除security_check_cookie參考 add INCLUDELIB MSVCRT ... et Robert est ton ton oncle!

你也可以添加: EXTERN _getchar:PROC ,只是RET前:撥打_getchar 這將等待一個按鍵在程序關閉前。

Honkjonk。

0

我最近做了這個。事實證明,你仍然可以在MSVC2012的32位模式下做到這一點,但我認爲64位模式是無望的。

對於32位模式,這裏是你所做的。

創建一個空的項目和源文件Source.cpp

#include <stdio.h> 
int main() { 
    printf("hello world\n"); 
    return 0; 
} 
  1. 您的項目舔右鍵並選擇「生成定製」和
    選擇MASM這裏描述http://www.masm32.com/board/index.php?topic=9231.0
  2. 下C++/OutputFiles選擇集合輸出/ FA
  3. Comipile在32位模式下釋放模式
  4. Source.asm文件加載到MSVC中,以便您可以查看它。它不會工作。一些改變是必要的。
  5. 在C++/Optimization下關閉Whole Program Optimization(刪除/GL)。這增加了該行INCLUDELIB MSVCRT
  6. 在連接/高級設置的最後一個選項「的形象安全異常處理程序」爲否(/SAFESEH:NO
  7. 現在,你應該有一個Source.asm文件,該文件會做同樣的事情將來源。 cpp文件沒有。將Source.cpp從Release目錄複製到與Source.cpp相同的目錄中(因此在構建/清除時不會將其刪除)。
  8. 加入Source.asm(作爲現有文件)到源文件並從構建中刪除Source.cpp
  9. 重建,你應該看到「你好世界」,而不必手工改變任何組裝線。

我已經使用這個更復雜的功能。我通常在一個單獨的模塊上執行此操作,並在函數名稱上使用extern "C"以刪除C++名稱修改。