nasm中的表达式

简介:

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

相关文章
|
5月前
|
编译器 Linux 开发工具
|
2月前
|
存储 编译器 Shell
cmake基于语法和应用
cmake基于语法和应用
|
5月前
|
C语言
gcc的简易用法
【5月更文挑战第10天】gcc的简易用法。
59 8
|
5月前
|
编译器 C语言
Makefile条件判断
Makefile条件判断
35 0
|
5月前
|
编译器 C语言
gcc/g++语法
gcc/g++语法
|
11月前
|
编译器 程序员 C语言
gcc的编译过程和gcc与g++的区别
gcc的编译过程和gcc与g++的区别
72 0
|
Shell
关于CMake中引号用法的说明
关于CMake中引号用法的说明
197 0
|
缓存
关于CMake中不同变量的用法与总结
关于CMake中不同变量的用法与总结
147 0
|
编译器 C语言 C++
Makefile中常见的gcc编译参数
Makefile中常见的gcc编译参数
384 0