1

アセンブリ、特にgccインラインアセンブリでの絶対アドレス指定と相対アドレス指定の概念を理解できません。チュートリアルで次のコードを見ました:

asm volatile("         \ 
     cli;                 \ 
     mov %0, %%ecx;       \ 
     mov %1, %%esp;       \ 
     mov %2, %%ebp;       \ 
     mov %3, %%cr3;       \ 
     mov $0x12345, %%eax; \ 
     sti;                 \ 
     jmp *%%ecx           "
                : : "r"(eip), "r"(esp), "r"(ebp), "r"(current_directory->physicalAddr));

ここで、最後の命令jmp *%%ecxは*を使用します。アスタリスクが絶対アドレス指定に使用されていることを除いて、アスタリスクの重要性についての適切な説明を見つけることができませんでした。絶対は実際の物理アドレスを意味し、相対はプログラムの開始からのオフセットを意味するという考えを私は得ています。ただし、相対的なアドレス指定については明確ではありません。アセンブリでPC相対アドレス指定について読みましたが、完全には理解しておらず、相対とPC相対が同じであるかどうかがわかりません。説明してください。

4

1 に答える 1

1

アスタリスクは何も意味しません。命令はアスタリスクなしでは無効です。これはAT&T構文からのアーティファクトであり、基本的には「の逆参照された値ecxを命令デコーダーにロードする」のニーモニックであり、「ecxにジャンプする」と同等です。

Intel構文では、まったく同じ命令はですjmp ecx

レジスタにオフセット距離を使用したオフセットジャンプの命令はありません。「PC」はipx86では(命令ポインタ)と呼ばれ、それ以上のコンテキストがない「相対」は通常「相対」を意味しipます。

于 2012-05-15T08:43:56.053 に答える