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

由网友(月色降人间)分享简介:有这么简单的assemblyWin 32程序:.386.model flat, stdcalloption casemap :noneEXTERN printf :PROC ; declare printf.dataHelloWorld db "Hello Wolrd!:-)", 0.codestart:sub...

有这么简单的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
Code Blocks Windows环境下编译HelloWorld程序报错,求高手支招

但在链接它时遇到问题。当我使用:

link HelloWorld.obj libcmt.lib

我收到一个错误:

unresolved external symbol _main called in _mainCRTStartup

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

附注

请不要告诉我只使用nasm。我想使用我的MSVC中的ml&;link

推荐答案

经过一些细微的调整,现在可以正确构建。

.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

主要编辑内容

.Model Flat,c将过程的调用约定设置为C。 如果您决定将.model保持为平面,则stdcall将需要进行这些更改。

替换

EXTERN printf :PROC

main PROC 

printf PROTO NEAR C,:DWORD

main PROC NEAR C    

包含libcmt.lib和Legend_Stdio_finitions.lib,它们静态地将本机C运行时启动链接到您的代码中。

已将入口点从开始更改为主要。在C运行时库(CRT)libcmt.lib中有一个入口点(_MainCRTStartup),它执行一些初始化任务,然后将控制权移交给应用程序的入口点main。您可以更改默认入口点,但通常您希望CRT入口点自动为您提供初始化的便利。

删除第一个子esp,4,因此剩余的一次推送由添加esp 4平衡,因此当ret运行时,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!:-)

阅读全文

相关推荐

最新文章