编译VC++生成的汇编输出?

SDD*_*SDD 5 x86 assembly masm32 visual-c++

我有一个简单的hello world C程序,用/ FA编译.因此,编译器还会生成相应的程序集列表.现在我想使用masm/link从生成的.asm列表中组装可执行文件.

以下命令行产生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
Run Code Online (Sandbox Code Playgroud)

指示C运行时函数未链接到先前生成的目标文件:

asm_test.obj:错误LNK2001:未解析的外部符号@__ security_check_cookie @ 4 asm_test.obj:错误LNK2001:未解析的外部符号_printf LINK:错误LNK2001:未解析的外部符号_wmainCRTStartup asm_test.exe:致命错误LNK1120:3未解析的外部

这是生成的装配清单

; 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  ??_C@_0O@OBPALAEI@hello?5world?$CB?6?$AA@   ; `string'
EXTRN   @__security_check_cookie@4:PROC
EXTRN   _printf:PROC
;   COMDAT ??_C@_0O@OBPALAEI@hello?5world?$CB?6?$AA@
CONST   SEGMENT
??_C@_0O@OBPALAEI@hello?5world?$CB?6?$AA@ 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 ??_C@_0O@OBPALAEI@hello?5world?$CB?6?$AA@
    call    _printf
    add esp, 4
; Line 22
    xor eax, eax
; Line 23
    ret 0
_wmain  ENDP
_TEXT   ENDS
END
Run Code Online (Sandbox Code Playgroud)

我使用的是最新的masm32版本(6.14.8444).

更新:

正如Cogwheel所建议的那样,我INCLUDELIB msvcrt.lib在asm源代码中包含了一个.程序编译并创建可执行文件,但链接器会生成警告:

msvcrt.lib(crtmanifestrtm.obj):警告LNK4044:无法识别的选项"manifestdependency:type ='win32'name ='Microsoft.VC90.CRT'version ='9.0.21022.8'processorArchitecture ='x86'publicKeyToken ='1fc8b3b9a1e18e3b'"; 忽视

当我启动可执行文件时,C运行时会生成以下错误:

运行时错误:R6034应用程序尝试错误地加载C运行时库

小智 0

删除listing.inc删除security_check_cookie引用添加INCLUDELIB MSVCRT ...et Robert est ton oncle!

您还可以添加: EXTERN _getchar:PROC 并在 ret: call _getchar 之前添加 这将在程序关闭之前等待按键。

鸣笛。