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