你是否渴望回到那样的时代,当男人像男子汉并且能自己编写驱动程序? ---Linus
NASM手册:
NASM: 开源的,x86体系的,跨平台的汇编器.
NASM和MASM的不同点: NASM大小写敏感. 访问一个内存地址的内容,在地址值上添加中括号 不存储符号的变量类型,再指令中显示的制定类型 不能自动识别远调用还是近调用,必须显式指定 优秀设计无不化繁为简,放下并自在.
NASM的汇编语言的语句 格式:lable: instruction operands ;commit 两种指令: 预编译指令或汇编指令 Directives和Instruction难道都翻译程指令,真不好办.
数据定义用到的伪指令 d*系列定义初始化的数据 res*系列定义未被初始化的数据 INCBIN可以导入外部文件中的数据 EQU定义常量 times重复指令.对数据定义和真实指令都可以使用. 道生一,一生二,二生三,三生万物. 万物归三,三归二,二归一,一归道. 有效地址 指定地址的时候可以使用各种表达式:段前缀,计算表达式 看来这些表达式必须由NASM计算,把结果写到目标代码,而不是生成计算代码.
常量 支持各种常用进制的整数常量,十进制,十六进制,八进制,二进制 单引号定义字符常量,栈式存放 浮点数常量,也有各种不同的精度
表达式 特殊变量,$当前地址,$$当前段的地址 逻辑位计算,四则运算等. SEG操作符取段基地址 WRT = With Ref to, 得到一个符号相对于其他的段地址的偏移 关键字STRICT, 严格按照字符长度操作,不做优化
限制表达式 NASM使用两次遍历:第一遍计算长度,第二遍产生代码 两次遍历导致了限制,为了更好的描述这些限制,规定了一些指令只能使用限制表达式, 限制表达式的值,必须在第一遍遍历中就能够计算出来.
本地标签(符号) 以点开头的标签为本地标签,和上一个非本地标签关联 使用..@开头的标签,在宏定义中使用,(我觉得应该叫它,相对标签)。 实际上在宏中使用的是%%开头的标签,被预处理器处理程..@开头, 预处理,宏展开后保证每个这样标签是全局唯一的 预处理器 代码在宏定义层次上不过是数据。程序员的思维在不同的层次中跳跃. 当在递归的多维空间游荡时,一个不成熟的程序员是会迷路的. 强大的宏预处理器: 条件组合,多级包含,多行或单行,上下文栈机构 宏定义中可以带参数. %define宏自在调用时展开,%xdefine宏在其他宏定义中也可以被展开. 宏连接符号"%+",把字符串加在一起. %assign,使用数字计算的表达式来定义数字量. 含有函数性质的宏,使用函数的运算结果为宏的值,substr,strlen 使用贪婪(greedy)参数把多余参数,拼接程逗号分隔的列表,可以被d*伪指令直接使用. 宏还支持默认参数 类似shift调用的,%rotate和个数特殊遍历%0, 似乎是给变参数个数的函数准备 奇怪的条件参数,是指令的一部分., 条件组合,和C语言的编译预处理相似.一大堆条件表达式的预处理指令 包含文件,而且像C语言一样防止多次包含. %rep循环,多次调用多行的宏, 预处理中的上下问栈(比较独特的一个东西.) 在多个宏定义中共享label,形成共通完成一个功能的复杂macro. 在栈中保存上下文环境,在上下文环境中定义label 能使用这东西在宏级别上实现各种控制流 NASM定义了许多标准宏,如果宏是函数,那么这应该就构成的标准汇编函数库
Assembler Directives User Level Directive VS Primative Directive Format-specific Directive 0x66, 0x67 prifix is use on diffecter bit instruction. Extern 定义外部符号, 这和C语言很像,这只有部分文件格式支持。
支持好多系统的各种各样的格式,不同格式也有自己独特的汇编指令 bin: Flat-Form Binary Output. 传说中的引导扇区,就是把这种格式的文件写到了磁盘的开头的扇区里面. obj: Microsoft OMF Object Files win32: Microsoft Win32 Object Files win64: Microsoft Win64 Object Files 微软竟然敢宣称他们的格式和coff兼容 coff: Common Object File Format macho: Mach Object File Format elf,elf32,elf64: Executable and Linkable Format Object Files aout: lINUX 'a.out' object file,早期的linux使用 aoutb: BSD a.out Object files. as86: Minix/Linux 'as86' Object Files rdf : Relocatable Dynamic Object File Format dbg: Debugging Format
|