汇编手记之HelloWorld


写在前面

上一篇文章写了nmake的使用,本篇来写一下汇编版本的helloworld。

源程序

注:除特别说明以外,本站的汇编代码均使用masm32编译。
helloworld.asm

.386                                                                    ; 允许使用的指令集
.model flat, stdcall                                                    ; 平坦寻址,标准函数调用约定
option casemap:none                                                     ; 大小写敏感

include \masm32\include\windows.inc                                     ; 包含STD_OUTPUT_HANDLE等定义
include \masm32\include\kernel32.inc                                    ; 包含使用的函数的原型
includelib \masm32\lib\kernel32.lib                                     ; 包含使用的函数的实现
include \masm32\include\user32.inc                                      ; 包含使用的函数的原型
includelib \masm32\lib\user32.lib
include masm32.inc
includelib masm32.lib
include msvcrt.inc
includelib msvcrt.lib

;数据段
data    segment
    szHello byte "Hello World!",0ah,0dh,0                               ; 0ah, 0dh换行
    szCaption db "提示信息",0      
    szText db "Hello World!",0                     
data    ends

;代码段
.code
start:
    invoke GetStdHandle, STD_OUTPUT_HANDLE
    invoke WriteConsole, eax, addr szHello, sizeof szHello\             ; 打印到控制台
                       , ebx, NULL
    lea eax,szText
    lea ecx,szCaption
    invoke MessageBox,NULL,eax,ecx,MB_ICONWARNING or MB_YESNO           ; invoke调用MessageBox
    lea eax,szText
    lea ecx,szCaption
    push MB_OK
    push ecx
    push eax
    push NULL
    call MessageBox                                                     ; CALL调用MessageBox
    add esp,10h
    push offset szText
    call crt_printf                                                     ; 打印到控制台
    add esp,4h
    invoke ExitProcess, NULL                                            ; 结束进程,防止CPU继续往下进入未定义内存尝试执行
end start

编译

如果已经安装masm32 SDK且设置了环境变量,可以使用如下命令进行编译:

ml /c /coff helloworld.asm
link /subsystem:console helloworld.obj /out:helloworld.exe

或者使用nmake进行编译。