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

Visual c++ 编译VC++生成的汇编输出?,visual-c++,assembly,x86,masm32,Visual C++,Assembly,X86,Masm32,我有一个简单的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:

我有一个简单的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
表示C-runtime函数未链接到先前生成的对象文件:

asm_test.obj:错误LNK2001: 未解析外部符号 @__安全检查_cookie@4 asm_test.obj:错误LNK2001: 未解析的外部符号\u printf 链接:错误LNK2001:未解决 外部符号\u maincrtstartup 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
我使用的是最新的masm32版本6.14.8444

更新:

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

msvcrt.libcrtmanifesttm.obj:警告LNK4044:无法识别的选项清单依赖项:type='win32'name='Microsoft.VC90.CRT'version='9.0.21022.8'processorArchitecture='x86'publicKeyToken='1fc8b3b9a1e18e3b';忽略

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

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

删除listing.inc 删除安全\u检查\u cookie引用 添加INCLUDELIB MSVCRT …等等

您还可以添加: 外部\u getchar:PROC 就在ret之前:呼叫_getchar 这将在程序关闭前等待按键


鸣喇叭。

我最近做了这件事。事实证明,在MSVC2012中,您仍然可以在32位模式下执行此操作,但我认为64位模式是没有希望的

对于32位模式,这里是您要做的

创建一个空项目和一个源文件source.cpp

右击您的项目并选择Build Customization and 按此处所述选择masm 在C++/OutputFiles下选择Assembly Output/FA 32位模式释放模式下的Comiple 将Source.asm文件加载到MSVC中,以便您可以查看它。还不行。一些改变是必要的。 在C++/Optimization下,关闭整个程序优化/GL。这将添加INCLUDELIB MSVCRT行 在Linker/Advanced集合中,最后一个选项映像具有安全异常句柄sto No/SAFESEH:No 现在您应该有一个Source.asm文件,它将执行与Source.cpp文件相同的操作。将Source.cpp从发布目录复制到与Source.cpp相同的目录,以便在生成/清理时不会将其删除。 将Source.asm作为现有文件添加到源文件中,并从生成中删除Source.cpp。 重建后,您将看到Hello World,而无需手动更改任何装配线。
我已经将其用于更复杂的函数。我通常在单独的模块上使用它,并在函数名上使用ExtC来删除C++名称。

您已经提供了通往库的路径,但是没有列出任何要链接到的库。我不确定您需要链接到的库的名称,因此使用了注释而不是答案。当然,这与清单文件有关,但我在这一点上非常困惑。也许创建一个简单的C++项目,并通过链接器设置寻找线索?
 #include <stdio.h>
 int main() {
     printf("hello world\n");
     return 0;
 }