写在前面
上一篇文章写了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进行编译。