あなたはサブルーチン呼び出しについて話しているようです。そのため、ここにその詳細を示します。
サブルーチンを呼び出すと、次のようになります (アドレスは異なりますが、可変長命令と混同したくなかったためです)。
1234 call 8888
1235 <next instruction>
何が起こるかというと、call
最初に次の命令ポインタをスタック (後入れ先出しデータ構造) に配置し、この場合1235
、命令ポインタを呼び出しているものに設定します。8888
後で、リターンはで行われ8889
ます:
8888 mov eax, 0
8889 ret
return が行うことは、スタックから最初の値 (つまり、1235
呼び出しによってプッシュされた) を単純にポップし、それを命令ポインターにロードすることです。したがって、どこに行くべきかを伝える戻り値ではなく、呼び出しによってスタックにプッシュされた情報です。
サブルーチンの最後に命令がある場合jmp
、コード内の 1 つのポイントにしか戻ることができません (現時点では、他のアドレッシング モードで実行できるすべての素晴らしいことを割り引いてください)。
8889 jmp 1235
return を使用すると、どこにいても元の場所に戻ります。
無限ループのアセンブラーは、次のように単純にすることができます。
loopy:
jmp loopy
レジスタに関しては、eax
、ebx
、ecx
およびedx
は汎用レジスタと見なされます。これにより、スタック ポインター、ベース ポインター、ソースおよびデスティネーション インデックスなど、用途に応じて特殊な命令を持つ、より特殊な目的のレジスターとは区別されます。
ax
x86 アーキテクチャの非常に初期のイテレーションで追加の機能が追加された可能性がありますが、それがまだ当てはまるかどうかはわかりません。独自のものをコーディングしている場合は、ほとんどの場合、それらを互換的に使用できるはずです。API または ABI に従っている場合は、それが課す規則 (eax
システム コール番号を保持する Linux システム コール インターフェイスなど) に従う必要があります。