用这玩意写个操作系统不是一件容易的事情,看来还得慢慢学习,急不得。
先用NASM写个WIN32的HELLO WORLD吧,熟悉一下这个编译器。
对于windows下的编程一定要有一套开发库,类似于SDK的东西,网上有,叫做NASMX。
不知为什么,http://nasm.sourceforge.net/打不开,可能是屏蔽了中国的IP吧,用代理访问之,下载。
最后我整理为这个样子:
然后在PATH环境变量中添加D:\NASM路径。
NASMX.BAT是我自己写的批处理,用于编译WIN32项目的。
@ECHO OFF
SET NASMENV=-ID:\NASM\INC\
SET FILE=%1
IF NOT EXIST %FILE%.ASM GOTO NOFILE
IF EXIST %FILE%.OBJ DEL %FILE%.OBJ
IF EXIST %FILE%.LST DEL %FILE%.LST
NASM.EXE -f win32 %FILE%.ASM -o %FILE%.OBJ -l %FILE%.LST
IF ERRORLEVEL 1 GOTO ASMERROR
GoLink /entry _main %FILE%.OBJ kernel32.dll user32.dll
IF ERRORLEVEL 1 GOTO ASMERROR
GOTO END
:ASMERROR
GOTO END
:NOFILE
ECHO %FILE%.ASM NOT EXIST.
:END
IF EXIST %FILE%.OBJ DEL %FILE%.OBJ
IF EXIST %FILE%.LST DEL %FILE%.LST
GOLINK后面的XXX.DLL是要连接的库,如果你使用了其他DLL导出的函数,自行添加。
发现在写代码的时候即使没有_main函数也必须那么写,难道在编译的时候自动把entry指定的函数导出为_main???
下面就是HELLO WORLD的代码了,不同的是,我采用的是UNICODE编码。
%define UNICODE
%include 'nasmx.inc'
%include 'win32/windows.inc'
%include 'win32/unicode.inc'
%include 'win32/user32.inc'
entry WinMain
[section .text]
proc WinMain
locals none
invoke MessageBox, NULL, szText, szTitle, MB_OK
endproc
[section .data]
szTitle: dw NASMX_TEXT('Title'),0
szText: dw NASMX_TEXT('Hello World!!!'),0
保存为Msg.ASM然后在CMD里执行:NASMX msg
应该是没有错误的生成msg.exe了,打开即可看到一个提示框。
注:NASMX.BAT中没有加入对资源的编译处理,以后用到了再加上吧。