nasm表达式支持2个特殊的记号 $和$$;前者标识其所在源码行的开始处地址,所以你可以这样写死循环:

jmp $

而后者标识当前段开始处的地址,你可以通过:

$-$$

找出当前代码在段内的偏移。

nasm提供以下运算符:

| ^ & << >> + -

* / //(带符号除) % %%(带符号模)

因为%符号也被宏预处理器使用,所以必须保证带符号和无符号的模操作符都必须跟有空格。

- +(一元+和一元-) ~ SEG WRT(非相同段基址?)

一元-将操作数取反,而~对操作数取补

SEG取得操作数的段地址

STRICT约束优化

当汇编时将优化器打开到2或更高级别时,nasm会使用尺寸约束,会给(byte word dword qword tword)尽可能小的尺寸,可以使用关键字STRICT来制约这种优化。强制一个特定的操作数为原来尺寸:

push strict dword 33

但当优化器关闭时,无论是否有strict,都会产生相同代码。

nasm是一个两遍汇编器,总是只做2遍汇编:第一遍确定所有代码与数据的尺寸大小,第二遍产生代码时即可以知道代码引用的所有符号地址。所以向后引用之类的代码nasm不能处理:一段代码尺寸依赖另一个符号值,而该符号在这段代码后面被声明,比如:

times (label-$) db 0
label:db "hello world"

nasm使用临界表达式禁止上述情况;临界表达式的值必须在第一遍汇编时都是可计算的。

05-11 15:26