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保留字节的意思)
将自己学习中的一些新的记录于此,以便以后查看。
-----------------------------------------------------------分割线*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保留字节的意思)
相关文章推荐
- 正则表达式学习小记
- 重定向学习小记(forward与sendRedirect)
- C++Primer学习小记1
- C#学习小记4 下面的例子是关于方法复载
- C#学习小记7一个多载,及我想实验关于抽象类能否直接编译运行
- C#学习小记3 验证main()内可访问本类的私有属性
- Template学习小记
- ubuntu学习小记
- C#学习小记2 下面的例子很好玩
- 学习小记——RMI编程技术1
- sniffer pro学习小记(更新ing)
- shtml学习,Tomcat配置SSI,及语法指令小记
- C++Primer学习小记
- c++primer学习小记
- Java核心编程:卷I——学习小记
- struts-helloapp 学习小记
- 关于Linux的学习小记
- fedora8使用小记之四:学习_系统引导过程及硬盘分区结构论述
- C#学习小记6 关于构造器多载及个人对多载的感受
- C#学习小记9包装类以封装预定义类集群