如何在Windows上编译Hello World程序集? [英] How to compile a Hello World assembly on Windows?

查看:0
本文介绍了如何在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。我想使用我的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.libLegend_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!:-)

这篇关于如何在Windows上编译Hello World程序集?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆