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使用临界表达式禁止上述情况;临界表达式的值必须在第一遍汇编时都是可计算的。