NASM与MASM的区别(不断更新中,参考NASM中文手册)

1.方括号[]
  在NASM中,任何不被方括号[]括起来的标签或者变量名都被当作地址,访问标签中俄内容必须用[],即foo dw 1 等价于 foo: dw 1。因此,连MASM中出现的Offset关键字也就不再需要。
  作者认为这使得代码规则非常鲜明,一目了然。这种操作结束了MASM中混合语法所带来的麻烦。

2.地址计数器伪指令 $
这两个关键字,我在以前的MASM汇编编译器中没有遇到过。作者在这里提供了一个很好的学习未知汇编指令的思路--反汇编。这个词简直就是高端的象征阿,今天终于接触到了,很兴奋。鉴于对这个术语的一知半解,网上百度来它的完整解释:
反汇编:把目标代码转为汇编代码的过程,也可说是把机器语言转为汇编语言代码,低级转高级的意思,常用于软件破解。但通常反编译出来的程序与原程序会存在许多不同,虽然执行效果相同,但程序代码 会发生很大的变化,非编程高手很难读懂。


3.NASM中没有assume伪指令,即它不会把标号所指的段的地址与段寄存器联系起来

4.NASM以跟 MASM不同的一种方式声明未初始化的内存。MASM中出现的dup伪指令在NASM不再出现。比如:MASM 的程序员必须使用’stack db 64 dup (?)’, NASM 需要这样写:’stack resb 64’,读作”保留 64 字节”。

5.EQU:定义常数。
  个人理解相当于宏定义。当使用EQU伪指令时,源文件的行上必须包含一个lable。就是把lable定义成一个操作数,且定义后是不可以更改的。.

6.强大的TIMES
在某种意义上类同MASM中的DUP,但它不仅可以后续立即数还可以后接一个数值表达式,这在将一个标号指向数据段填充成指定大小的时候显得十分好用。更加神奇的是它可以后续一般指令,当作循环来使用。

7.预处理指令都是以一个’%’打头

8.预处理器把所有以反斜杠(/)结尾的连续行合并为一行

9.与C相仿的宏定义
%define 宏名 宏替换的内容 , 且用这种方法定义的宏是大小写敏感的,但是用%idefine则不会,因为i代表insensitive,不敏感
连接宏的符号%+,相当于高级语言中的字符串连接符

10.带有各种各样的功能宏
比如%strlen 和 %substr
%strlen 将宏名替换成为宏的内容(字符串)的长度,%substr将宏名替换为宏的内容(字符串)指定位置上的单个字符,这里要注意的是下标从1开始

11.在.inc文件中出现的多行宏 %macro
在‘%marco‘一行上 后面的数字n定义了宏可以接受的参数的个数为n个,宏定义里面的‘%n’是用来引用宏调用中的第一个参数。对于一个有多个参数的宏,参数序列可以这样些:‘%2’,‘%3’
%marco也是大小写敏感的,除非用‘%marco‘
%marco定义的宏必须用%endmacro结束

************在此要注意,在使用一个多行宏的时候必须把逗号作为参数的一部分传入,也可以理解为一定要用逗号将参数隔开**********************

12.包含其他文件
这里的操作符与C及其相似,%include可以用来包含其他源文件,被包含的文件会被在当前目录下寻找,使用命令行-i来增加搜索路径

13.’struc’ and ‘endstruc’
声明一个结构体数据类型。‘struct’带有一个参数,它是结构体的名字,名字加上一个_size后缀组成的符号,并且用一个’equ’给它赋上结构体的大小。

14.’istruc’,’at’ and ‘iend’ 声明结构体的一个实例
istruc  结构体明
           数据类型     数据    (可以写多行)
at  属性名 ,数据类型     数据
    …………………..
iend   ;结束声明

********at的功能*************8
’at‘宏的功能是通过使用‘times’前缀把偏移位置定位到正确的结构体域上,然后声明一个特定的数据。所以,结构体域必须在结构体定义中相同的顺序被声明。


15.’align’ and ‘alignb’
作用:数据对齐(在另外一篇学习日志中详细讨论了它的作用)


16.伪指令resb(reserved byte)
读作‘保留多少字节’,用来对BSS进行初始化
   

17.NASM的指令类型
用户级指令和原始指令。
原始指令被包含在一个方括号中,用户指令没有括号。用户指令以宏的形式运行,并去调用原始形式的指令。

18.’BITS’:指令目标处理器模式。
该指令指定NASM产生的代码是被设计运行在16位模式的处理器上还是运行在32位模式的处理器上。
有BITS 16和BITS 32、
若想在‘BITS 16’状态下时,若想使用32为数据的指令可以加上一个字节的前缀0x66,要使用32位的地址,可以加上0x67前缀。在‘BITS 32’,下使用16位的指令和地址也分别要加上0x66前缀和0x67前缀。

‘BITS’指令拥有一个等效的原始形式:[BITS 16]和[BITS 32]。这就是在《自己写操作系统》这本书的例程中出现的形式。


19.’SECTION’或‘SEGMENT’:改变和定义段。
’SECTION‘或’SEGMENT‘指令。Unix的目标文件格式和‘bin’目标文件格式,都支持标准的段‘.text’,’.data’和‘bss’,但windos下obj不能辨识上面的段名,并需要把段名开头的句点去掉。


使用‘bin’格式会让NASM进入缺省的16位模式。为了能在’bin’中使用32位代码,必须显示的使用‘BITS 32’。 
要注意的是:‘bin’没有缺省的输出文件扩展名。它只是把输入文件的扩展名去掉后作为输出文件的名字。

bin输出格式使得可以通过在段定义的后面加上align来实现边界对齐。


20.’ORG’
伪指令‘ORG’是‘bin’格式提供一个额外的操作。它可以指定程序被载入内存时,它的起始地址。



转自:http://blog.csdn.net/lampqiu/article/details/6540115

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NASM中文手册.pdf 学nasm必备哈 1.1 什么是NASM [1]NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多 的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16 位的'OBJ'和'Win32'。它还可以输出纯二进制文件。它的语法设计得相当的简 洁易懂,和Intel语法相似但更简单。它支持'Pentium','P6','MMX','3DNow!', 'SSE' and 'SSE2'指令集, 1.1.1 为什么还需要一个汇编器? NASM当初被设计出来的想法是'comp.lang.asm.x86'(或者可能是'alt.lang.asm' ,我忘了),从本质上讲,是因为没有一个好的免费的x86系例的汇编器可以使用, 所以,必须有人来写一个。 (*)'a86'不错,但不是免费的,而且你不可能得到32位代码编写的功能,除非你 付费,它只使用在dos上。 (*) 'gas'是免费的,而且在dos下和unix下都可以使用,但是它是作为'gcc'的一 个后台而设计的,并不是很好,'gcc'一直就提供给它绝对正确的代码,所以它的 错误检测功能相当弱,还有就是对于任何一个想真正利用它写点东西的人来讲, 它的语法简直太可怕了,并且你无法在里面写正确的16位代码。 (*) 'as86'是专门为Minix和Linux设计的,但看上去并没有很多文档可以参考。 (*) 'MASM'不是很好,并且相当贵,还且只能运行在DOS下。 (*) 'TASM'好一些,但却极入与MASM保持兼容,这就意味着无数的伪操作码和繁琐 的约定,并且它的语法本质上就是MASM的,伴随着的就是一些自相矛盾和奇怪的 东西。它也是相当贵的,并且只能运行在DOS下。 所以,只有NASM才能使您愉悦得编程。目前,它仍在原型设计阶段-我们不期望它 能够超越所有的这些汇编器。但请您发给我们bug报告,修正意见,和其他有用的 信息,还有其他任何你手头有的对我们有用的信息(感谢所有已经这样在做了的 人们),我们还会不断地改进它。 1.1.2 许可条件 请阅读作为NASM发布的一部分的文件'Licence',只有在该许可条件下你才可以使 用NASM
NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多 的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16 位的'OBJ'和'Win32'。它还可以输出纯二进制文件。它的语法设计得相当的简 洁易懂,和Intel语法相似但更简单。它支持'Pentium','P6','MMX','3DNow!', 'SSE' and 'SSE2'指令集, 1.1.1 为什么还需要一个汇编器? NASM当初被设计出来的想法是'comp.lang.asm.x86'(或者可能是'alt.lang.asm' ,我忘了),从本质上讲,是因为没有一个好的免费的x86系例的汇编器可以使用, 所以,必须有人来写一个。 (*)'a86'不错,但不是免费的,而且你不可能得到32位代码编写的功能,除非你 付费,它只使用在dos上。 (*) 'gas'是免费的,而且在dos下和unix下都可以使用,但是它是作为'gcc'的一 个后台而设计的,并不是很好,'gcc'一直就提供给它绝对正确的代码,所以它的 错误检测功能相当弱,还有就是对于任何一个想真正利用它写点东西的人来讲, 它的语法简直太可怕了,并且你无法在里面写正确的16位代码。 (*) 'as86'是专门为Minix和Linux设计的,但看上去并没有很多文档可以参考。 (*) 'MASM'不是很好,并且相当贵,还且只能运行在DOS下。 (*) 'TASM'好一些,但却极入与MASM保持兼容,这就意味着无数的伪操作码和繁琐 的约定,并且它的语法本质上就是MASM的,伴随着的就是一些自相矛盾和奇怪的 东西。它也是相当贵的,并且只能运行在DOS下。 所以,只有NASM才能使您愉悦得编程。目前,它仍在原型设计阶段-我们不期望它 能够超越所有的这些汇编器。但请您发给我们bug报告,修正意见,和其他有用的 信息,还有其他任何你手头有的对我们有用的信息(感谢所有已经这样在做了的 人们),我们还会不断地改进它。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值