たとえば、単純なHello Worldタイプのプログラムを作成している場合、.dataセクションには次のようなものが含まれます。
section .data
msg db 'Enter something: '
len equ $ - msg
この例の$は何を表し、なぜ$ - msg
は文字列の長さに等しいですか?
「ここ」のアドレスを意味します。ここで、「here」はmsg
文字列の末尾の後のバイトです。これについては、アセンブラのドキュメントで説明されています。ドキュメントを読んでください。
この場合、$はアセンブラーによる現在のアドレスを意味します。 $-msgは、アセンブラーの現在のアドレスからmsgのアドレスを引いたものです。これは、ストリングの長さになります。
NASMドキュメント
http://www.nasm.us/doc/nasmdoc3.html#section-3.5
NASMは式で2つの特別なトークンをサポートしているため、計算には現在のアセンブリ位置を含めることができます:$および$$トークン。 $は、式を含む行の先頭のAssembly位置に評価されます。したがって、JMP $を使用して無限ループをコーディングできます。
http://www.nasm.us/doc/nasmdoc3.html#section-3.2.4
EQUは、指定された定数値にシンボルを定義します。EQUを使用する場合、ソース行にはラベルが含まれている必要があります。 EQUのアクションは、指定されたラベル名をその(のみ)オペランドの値に定義することです。この定義は絶対的なものであり、後で変更することはできません。たとえば、
message db 'hello, world' msglen equ $-message
msglenを定数12に定義します
$は現在のアドレスを参照するために使用され、$$はアセンブリの現在のセクションの開始アドレスを参照するために使用されます。
例:
section .text
Mov A,0x0000
Mov B,0x0000
Mov C,0x0000
3行目の場合、$は行自体のアドレスを示し、$$は1行目のアドレス(このセクションが開始された場所)を示します。この慣例は私にとってはうまくいきます。
ソース: nasm.us