使用Printf的Win32 NASM Hello World导致访问冲突

时间:2015-03-19 09:31:08

标签: windows assembly x86 nasm

只是阅读了很多教程,并且我想在Windows上尝试使用NASM。我尝试了几个简单的“Hello World”版本,其中一个应该使用_printf函数将文本打印到stdout。

以下是代码:

; Build by doing:
; nasm -f win32 -o test.o test.asm
; link /SUBSYSTEM:CONSOLE libcmt.lib test.o

section .text
    global _start   
    extern _printf 

_start:
    push msg      ; Push msg on stack
    call _printf  ; Call printf
    add  esp, 4   ; Reset the stack 

    ; return 0
    xor eax, eax
    ret

; Our string, null terminated
msg: db "Hello World ", 13,10,0

我使用“nasm -f win32 -o test.o test.asm”构建它,并将其与Microsoft Visual Studio 2013链接器链接。到目前为止运行良好,但是一旦我尝试运行可执行文件,我就会遇到访问冲突。使用了精确的链接器命令:

link /subsystem:console /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib" /LIBPATH:"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib" /nodefaultlib /entry:start test.o libcmt.lib kernel32.lib

我尽力使用OllyDBG来解决错误,但这也无济于事。也许有人在这里有个主意?...

此致

1 个答案:

答案 0 :(得分:1)

P,......回答自己! 经过漫长的研究时间和花时间在调试器中,我们走了!

使用_printf并静态链接到" libcmt.lib"确实需要CRT初始化。动态链接时,这似乎是自动完成的。

所以唯一要做的事情是:

/entry:mainCRTStartup 

将入口点更改为" mainCRTStartup",因此所有内容都会在实际的#34; main"之前进行初始化。函数被调用。 Visual Studio Library" libcmt.lib"有点遗憾。在版本12中没有返回任何有意义的信息,但崩溃与访问冲突,而版本10确实返回:

  

运行时错误R6030    - CRT未初始化

问题解决了。有趣,......也没有。