如何在汇编中打印Hello World?

问题描述

我下载了库文件Irvine32,然后在Visual Studio空项目中创建了程序集。我是汇编语言的新手。下面是我的代码

?.

解决方法

下面是使用Visual Studio的本机库而不是Irvine库的Windows控制台程序的示例代码。 Visual Studio 2015和更高版本将printf内联到已编译的代码中,通常需要使用main()生成C源文件,但是可以通过使用旧版库(包括scanf,printf等)来避免这种情况。

Visual Studio可能不会为.asm文件设置默认版本。在这种情况下,请在解决方案资源管理器窗口中右键单击.asm文件名,然后单击属性。将“从构建中排除”设置为“否”,将项目类型设置为自定义构建工具,然后应用。然后在自定义构建工具窗口中,使用x.asm作为文件名:

command line:  ml /c /Zi /Fo$(OutDir)\x.obj x.asm
...
output file:   $(OutDir)\x.obj

对调试和发行版都执行此操作。对于发行版,不需要/ Zi:

command line:  ml /c /Fo$(OutDir)\x.obj x.asm

示例代码:

        .686p                   ;enable instructions
        .xmm                    ;enable instructions
        .model flat,c           ;use C naming convention (stdcall is default)

;       include C libraries
        includelib      msvcrtd
        includelib      oldnames
        includelib      legacy_stdio_definitions.lib    ;for scanf,printf,...

        .data                   ;initialized data
msg     db      "Hello again,World!",00dh,00ah,000h    ;added CR,LF to msg

        .data?                  ;uinitialized data

        .stack  4096            ;stack (optional,linker will default)

        .code                   ;code 
        extrn   printf:near
        public  main

main    proc
        push    offset msg
        call    printf
        add     esp,4
        xor     eax,eax
        ret
main    endp

        end