Skip to content

ラベルの判定など

hangedman edited this page Aug 7, 2022 · 4 revisions

nasmのコードを見ているとラベルの読み取りやオフセットの計算のヒントがあったのでメモしておく

nasmのlabel処理のドキュメント

nasm/doc/internal.doc#L139-L169

このモジュールには、ラベル マネージャーが含まれています。 6 つの関数をエクスポートします。

  • init_labels は、モジュール内の他の関数の前に呼び出す必要があります。
  • cleanup_labels は、モジュール内の他の全ての処理が終了したあとに呼び出されるかもしれません、ストレージの割り当てを解除します
  • define_label は、新しいラベルを定義するために呼び出されます:
    • 定義するラベルの名前を渡すとラベルが定義されます
    • segment,offsetのペアがラベルの中の値として設定されます
    • また、エラー報告関数も渡されます
    • および出力ドライバー構造も渡されます(ドライバーのラベル定義関数出力を呼び出すことができるようにするため)

define_label は、最近定義された非ローカル ラベルの名前を、ピリオドで始まる任意のラベルに内部的に付加します。

  • define_label_stub は、2通りの使われ方で呼び出されるように設計されています

    • ラベルはすでに定義されている場合: 「最近定義された非ローカルラベル」ステータスを更新するだけ
    • これにより使われ方2のローカル ラベルへの参照は正しく機能します
  • declare_as_global は、ラベルがグローバルであることを宣言するために使用されます。対象のラベルが定義される_前_に呼び出されなければなりません。

  • lookup_label はラベル名を(セグメント、オフセット) のペアに変換しようとします。成功すると非ゼロを返します。

ラベル マネージャー モジュールは (理論的には 😄 ) 再起動可能です。cleanup_labels を呼び出すと、再度 init_labels を呼び出すことができます。新しいシンボル セットで新しいアセンブリを開始します。

define_label

nasm/asm/labels.c#L438-L442