NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多的目标文件格式,包括
Linux和''NetBSD/FreeBSD'',''a.out'',''ELF'',''COFF'',微软16位的''OBJ''和''Win32''。
它还可以输出纯二进制文件。它的语法设计得相当的简洁易懂,和Intel语法相似但更简单。它
持''Pentium'',''P6'',''MMX'',''3DNow!'';
nasm下载地址
https://www.nasm.us/pub/nasm/
nasm helloworld程序;
section .text
global _start;
_start:
mov eax, 4
mov ebx, 1
mov ecx, string
mov edx, length
int 80h
;exit的系统调用
mov eax, 1
mov ebx, 0
int 80h
section .data
string: db 'hello world',0Ah
length: equ 13
section .bss
var:resb 1
使用nasm构建为.com程序,然后运行,如下图,不能运行;
构建为.exe,运行,不能运行,如下;因为不是Windows下的程序;
干完上述活有下面文件;
下面这个程序也是nasm的helloworld;
org 0100h ;PSP前缀,程序从0100h开始运行
mov ax, cs ;初始化 ds和dx寄存器,为调用9号程序(显示字符串)做准备
mov ds, ax
mov dx, string ;取偏移地址,等价于MASM的 lea dx, string 或 mov dx, offset string
mov ah, 9
int 21h
MOV AH,4CH ;回到操作系统
INT 21H
string db "Hello, OS world!$"
构建以后运行,也是不能运行;
看资料说,使用 nasm -f win32 *.asm 编译出obj文件,再link,就可构建出Win下的程序;
操作如下;找不到 link 工具;
刚才下的nasm版本是解压版的,可能不带link;下个安装版的;
安装完以后,从桌面图标进入构建环境;
把 1.asm 拷贝到nasm安装目录,准备编译和链接;但是看了一下,安装目录也没有link工具;
仔细看一下网上资料;原来是用VS的link工具来链接的;
正确的编译helloworld.asm的命令如下:
nasm -f win32 helloworld.asm
使用以上命令NASM生成一个名为helloworld.obj的文件。
现在要使用链接器将.obj文件链接到.exe文件中。打开Visual Studio Command Prompt然后输入如
下内容:
link.exe helloworld.obj libcmt.lib
// or
cl.exe helloworld.obj /link libcmt.lib
printf()函数通过libcmt.lib(此库属于C运行时库)被静态包含。如果你省略了libcmt.lib的话你将得
到错误error LNK2001: unresolved external symbol _printf
现在你可以执行helloworld.exe来测试你的程序了。
下回再整;
先试一下用VC6的cl.exe能不能链接出来;操作如下;没链接成功;下回再整;
nasm和masm的一些区别
1. nasm是区分大小写的;
2. nasm中访问内存需要使用[]将内存地址括起来;
3.
nasm不存储类型信息,所以也不能使用MOVS这样没有表明大小的命令,而只能使用MOVSW这样的命令;
另外往内存中存放数据也需要注意:
如果写成这样:
var equ 2
mov [var], 1
会报错,
需要写成如下的形式:
var equ 2
mov word [var], 1
4. nasm中没有ASSUME伪指令;
5. nasm没有SMALL、COMPACT这样的内存模型;
6. nasm引用浮点寄存器的方式与masm不同;
7. 声明数据块的方式不同:
stack db 64 dup (?) ; masm
stack resb 64 ; nasm
nasm不支持dup,且?是一个可用的变量名;