本文主要是介绍NASM中的寻址的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
(
)NASM 在表达式中支持两个特殊的记号,即'$'和'$$',它们允许引用当前指令的地址。'$'计算得到它本身所在源代码行的开始处的地址;所以你可以简单地写这样的代码'jmp $'来表示无限循环。'$$'计算当前段开始处的地址,所以你可以通过($-$$)找出你当前在段内的偏移。
有些时候,对于代码编译后的长度要求达到一个规定的值,需要在代码末尾填充若干个0,这时候,经常会使用到如下的语句:
TIMES n DB 0
这里的n应为一个数值,表示填充的0的个数。
例如,要求目标代码的长度为512字节,此时一个常见的错误是写成:
TIMES 510-$ DB 0
即误认为'$'是一个纯数字,就像 510,所以它们相减的值也是一个纯数字,可以很好地被TIMES 使用。
由于NASM 是一个模块化的汇编器:不同的组成部分被设计为可以很容易的单独重用,所以它们不会交换一些不必要的信息.结果,'BIN'输出格式尽管被'ORG'告知'.text'段应当在 0处开始,但是不会把这条信息传给表达式的求值程序.所以对求值程序来讲,'$'不是一个纯数值:它是一个从一个段基址开始的偏移值.因为'$'和 510'之间的计算结果也不是一个纯数,而是含有一个段基址.含有一个段基址的结果是不能作为参数传递给'TIMES'的.
正确
这篇关于NASM中的寻址的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!