您的位置:首页 > 其它

NASM 学习小记

2017-04-06 16:02 106 查看
最近使用了NASM进行汇编学习。在这之前我只涉及过Intel的MASM,估计二者将有一些区别。

将自己学习中的一些新的记录于此,以便以后查看。

-----------------------------------------------------------分割线*1-----------------------------------------------------------------

1.section关键字,和segment是完全一样的,用于建立新的段。注意,在windows下段名不能以.开头

2.$$表示当前代码所在“section”的段起始地址,$表示当前行的地址。jmp $表示无限循环(相当于while 1,停在这里了)

3.原始指令被包含在一个方括号中;用户级指令没有括号。比如[SECTION .16]或者[BITS 16] 这些就是原始指令,它们对应的用户级指令就是SECTON 或BITS 16(无方括号)

4.手册第2.2节是NASM和MASM的区别,值得每个人看一看~

5.NASM 需要方括号来引用内存地址:任何对内存中内容的存取操作必须要在地址上加上方括号,但任何对地址值

的操作不需要。 

例如:在NASM中 

第7条指令:foo dw 0x7c00H

movax,foo;foo没有加[],代表将foo在段中的偏移量“7”放进ax中

mov ax,[foo]
;加了[],代表将foo的内容0x7c00放入ax当中去

NASM中不存在offset关键字,因为mov ax, offset foo 和 mov ax, foo是完全等价的。

自然地……也不会支持mov ax, es:[foo]这种强制规定段基址的语法

注:刚刚就被这一规则难倒了,认识到以下事实:在nasm中,对任意一个标号(无论是宏、空间定义),也无论标号所在的位置(标号里,还是标号外),标号都会被替换成标号定义代码处的内存地址(或者偏移量),即使是:

JMP LABEL:0000

MOV WORD [LABEL+2],AX

MOV AX,LABEL

等等

6.NASM 中,赋值会比较繁琐,如果你要word赋值,就必须要mov word [2], foo。

7.不支持ASSUME伪指令,所有的段寄存器都要自己去填

8.对于初始化内存:在MASM中我们可以用:stack db 64 dup (?)

但是在NASM中,dup不能用了,要写作 stack resb 64 (resb是reserve byte保留字节的意思)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: