NASM 学习小记

最近使用了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保留字节的意思)



你可能感兴趣的:(NASM 学习小记)