如何在Windows上编译Hello World程序集?



有这样一个简单的assemblyWin 32程序:

.386
.model flat, stdcall
option casemap :none
EXTERN printf :PROC ; declare printf
.data
HelloWorld db "Hello Wolrd!:-)", 0
.code
start:
sub esp, 4
push offset HelloWorld
call printf
add esp, 4
ret
end start

我可以成功地编译它:

ml.exe /c HelloWorld.asm

但是链接有问题。当我使用:

link HelloWorld.obj libcmt.lib

我得到一个错误:

unresolved external symbol _main called in _mainCRTStartup

我要更改/更正什么才能成功链接程序以运行它?

公立小学请不要告诉我只用nasm。我想用ml&linkfrom my MSVC.

经过一些小调整,现在可以正确构建了

.386    
.model flat, c
option casemap :none
includelib libcmt.lib
includelib legacy_stdio_definitions.lib
EXTERN printf :PROC ; declare printf
.data
HelloWorld db "Hello World!:-)", 0
.code
main PROC
push offset HelloWorld
call printf
add esp, 4
ret
main ENDP
END

主要编辑为

  • 。模型平面,c将过程的调用约定设置为c。
    如果您决定保留。模型平面,stdcall

替换
EXTERN printf :PROC
main PROC 

printf PROTO NEAR C,:DWORD
main PROC NEAR C    
包括
  • libcmt.liblegacy_stdio_definitions.lib它静态地将本地C-Runtime启动链接到你的代码中。

  • start更改入口点主要对。在c -运行时库(CRT) libcmt中有一个入口点(_mainCRTStartup)。lib,它执行一些初始化任务,然后将控制权交给应用程序的入口点main。您可以更改默认入口点,但通常您需要CRT入口点自动为您完成初始化的便利性。

  • 删除第一个子esp,4因此,当ret运行时,剩余的一次push由add esp,4来平衡,因此esp指向返回地址。

要构建,打开Windows命令提示符并运行:

"C:Program Files (x86)Microsoft Visual Studio2019ProfessionalVCAuxiliaryBuildvcvars32.bat"

设置MSVC环境初始化为:'x86'

接下来,运行这些MASM命令

ml.exe /c /coff HelloWorld.asm
link.exe /SUBSYSTEM:console HelloWorld.obj

程序显示

Hello World !: -)

你的错误信息说它找不到导出的符号(即函数)"_main"我希望把你的start函数重命名为_main可以让它编译。

相关内容

  • 没有找到相关文章

最新更新