NASM:纯正的汇编器
在论坛翻贴总能看到有讨论汇编器的,我接触NASM也有段时间了,个人认为其是个很纯真的汇编器,配合ALINK链接器可以编出原汁原味的WIN32汇编程序,所以推荐给一些新人使用NASM官网:http://www.nasm.us/
NASM和ALINK压缩包下载:
NASMSETUP.zip
(2.67 MB)
------------安装方法------------
1. 解压缩包至一个目录下
2. 到“我的电脑”-》“系统属性”-》“高级系统选项”-》“环境变量”的窗口下
3. 将“系统环境变量”下的“PATH”的最后一项后加上一个分号“;”,然后后面加上你解压缩包的目录
------------使用方法------------
汇编语言案例程序:弹出信息框并显示HELLO WORLD
extern MessageBoxA ;声明API,“EXTERN”声明有此函数
import MessageBoxA user32.dll ;“IMPORT”则从DLL中导入相应的API,它和“EXTERN”一样都是伪指令
extern ExitProcess
import ExitProcess kernel32.dll
segment .data USE32 ;数据段定义,"USE32"表明使用32位
title db "hello",0
message db "hello world",0
segment .bss USE32 ;未初始数据段定义,这里举个例子,下面的程序不需要这一段
var1 resb 32
segment .code USE32 ;代码段定义
..start: ;“..start”为入口标识符,入口标识符不能为其他,否则ALINK无法检测到程序入口
push dword 0 ;入栈MessageBoxA的参数(从最后一个参数开始入栈)
push dword title
push dword message
push dword 0
call [MessageBoxA] ;调用MessageBoxA来显示信息框
push dword 0
call [ExitProcess] ;调用ExitProcess来退出进程,返回0
import MessageBoxA user32.dll ;“IMPORT”则从DLL中导入相应的API,它和“EXTERN”一样都是伪指令
extern ExitProcess
import ExitProcess kernel32.dll
segment .data USE32 ;数据段定义,"USE32"表明使用32位
title db "hello",0
message db "hello world",0
segment .bss USE32 ;未初始数据段定义,这里举个例子,下面的程序不需要这一段
var1 resb 32
segment .code USE32 ;代码段定义
..start: ;“..start”为入口标识符,入口标识符不能为其他,否则ALINK无法检测到程序入口
push dword 0 ;入栈MessageBoxA的参数(从最后一个参数开始入栈)
push dword title
push dword message
push dword 0
call [MessageBoxA] ;调用MessageBoxA来显示信息框
push dword 0
call [ExitProcess] ;调用ExitProcess来退出进程,返回0
将以上代码保存为hello.asm文件后,我们在此ASM文件的目录下“SHIFT+右键鼠标”,然后选择“在此处打开命令行”,之后我们在命令行里输入:
“nasm -f obj hello.asm” ----“-f”指明生成文件的格式
来生成一个目标文件。若无编译错误,则生成目标文件;此时生成的文件为一个名为hello.obj的OBJ文件,此文件无法运行
(输入“nasm -h”来获取帮助列表)
之后我们再在命令行里输入:
alink -c -oPE -subsys gui hello.obj ----“-c”指明对OBJ文件内的大小写敏感,“-o”指明生成文件的格式,“-subsys”指明生成文件的窗口模式
若无链接错误,则再次生成一个目标文件;此时生成的文件问一个名为hello.exe的EXE文件,此文件可以执行。运行后弹出名为hello的对话框,上面写着hello world
(输入“alink -h”来获取帮助列表)
[此贴子已经被作者于2016-5-8 02:59编辑过]