NASM汇编helloworld图解

    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,且?是一个可用的变量名;

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值