web-dev-qa-db-ja.com

「$-ラベル」のような文字列の長さを計算するとき、x86アセンブリでドル記号($)は何を意味しますか?

たとえば、単純なHello Worldタイプのプログラムを作成している場合、.dataセクションには次のようなものが含まれます。

section .data

msg     db      'Enter something: '
len     equ     $ - msg

この例の$は何を表し、なぜ$ - msgは文字列の長さに等しいですか?

31

「ここ」のアドレスを意味します。ここで、「here」はmsg文字列の末尾の後のバイトです。これについては、アセンブラのドキュメントで説明されています。ドキュメントを読んでください。

23
Alexey Frunze

この場合、$はアセンブラーによる現在のアドレスを意味します。 $-msgは、アセンブラーの現在のアドレスからmsgのアドレスを引いたものです。これは、ストリングの長さになります。

13
Will Hartung

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

0
Sahil Singh