たとえば、単純なhello worldタイプのプログラムを作成している場合、.dataセクションには次のようなものが含まれる可能性があります。
section .data
msg db 'Enter something: '
len equ $ - msg
この例の$は何を表しており、なぜ$ - msg
文字列の長さに等しいのですか?
たとえば、単純なhello worldタイプのプログラムを作成している場合、.dataセクションには次のようなものが含まれる可能性があります。
section .data
msg db 'Enter something: '
len equ $ - msg
この例の$は何を表しており、なぜ$ - msg
文字列の長さに等しいのですか?
この場合、$はアセンブラによる現在のアドレスを意味します。$ --msgは、アセンブラの現在のアドレスからmsgのアドレスを引いたもので、文字列の長さになります。
NASM ドキュメント
http://www.nasm.us/doc/nasmdoc3.html#section-3.5
NASM は、式で 2 つの特別なトークンをサポートしており、計算に現在のアセンブリ位置を含めることができます: $ および $$ トークンです。$ は、式を含む行の先頭のアセンブリ位置に評価されます。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 で機能します。
ソース: nasm.us