Hyperlink x86 masm hello world

Hyperlink x86 masm hello world,hyperlink,x86,masm,Hyperlink,X86,Masm,我正试图用ML在windows上编译一个hello world,并将其链接到VS 2010 .MODEL FLAT .STACK 4096 .data msg db "Hello World!",0 .code INCLUDELIB MSVCRT EXTRN printf:NEAR EXTRN exit:NEAR PUBLIC _main _main PROC mov eax, offset msg push eax call printf mov eax,0 push eax call exi

我正试图用ML在windows上编译一个hello world,并将其链接到VS 2010

.MODEL FLAT
.STACK 4096
.data
msg db "Hello World!",0
.code
INCLUDELIB MSVCRT
EXTRN printf:NEAR
EXTRN exit:NEAR
PUBLIC _main
_main PROC
mov eax, offset msg
push eax
call printf
mov eax,0
push eax
call exit
_main ENDP
END _main
我不断收到链接器错误,说printf和exit是未解析的外部符号。我有几个问题

  • ML和LINK使用哪些命令行选项来编译和解决错误消息
  • 是否有另一种方法可以使用汇编代码而不是调用c运行时函数(如printf)将文本输出显示到屏幕上
  • 您需要为C函数使用带下划线的名称,因为编译器就是这样在程序集上发出它们的 水平
  • 您应该在调用printf和其他CRT函数后清理堆栈,因为它们使用cdecl调用约定(调用方堆栈清理)。严格地说,你也应该在退出后做,但这并不重要,因为它永远不会回来
  • 要使用CRT函数,必须初始化CRT。您可以在文件
    VC\crt\src\crt0.c
  • 这里有一个对我有用的最小文件(我使用静态库,因为我有VS2008,不想为了使它与DLL一起工作而修改清单)

    对于MSVCRT,初始化是不同的,例如,您需要调用set_app_type


    要不依赖CRT,您必须使用OS API。对于Win32,这将是Win32函数,例如WriteFile(文件句柄为GetStdHandle(STD_OUTPUT_HANDLE))。请参阅一些示例。

    您好,Igor,您能告诉我如何与_mtinit,_ioinit。。。我尝试了cl/MT final.obj/link kernel32.lib msvcrt.lib,但它无法工作。。。
    .386
    .MODEL FLAT
    .STACK 4096
    .data
      msg db "Hello World!",0
    .code
    INCLUDELIB LIBCMT
    EXTRN _printf:NEAR
    EXTRN _exit:NEAR
    EXTRN __heap_init:NEAR
    EXTRN __mtinit:NEAR
    EXTRN __ioinit:NEAR
    PUBLIC _main
    _main PROC
      push 1
      call __heap_init
      add esp, 4
      push 1
      call __mtinit
      add esp, 4
      call __ioinit
      mov eax, offset msg
      push eax
      call _printf
      pop ecx
      mov eax,0
      push eax
      call _exit
    _main ENDP
    END _main