1. ホーム
  2. assembly

[解決済み] アセンブリ言語ではスタックはどのように機能するのですか?

2023-04-25 17:50:03

質問

私は現在、スタックがどのように機能するかを理解しようとしています。 アセンブリ言語 この本を使っています。

http://savannah.nongnu.org/projects/pgubook/

私が使っているのは ガス で開発をしていて Linux Mint .

ちょっとわからないことがあるのですが。

私が知っている限り、スタックは単なるデータ構造です。そのため、もし私がアセンブリでコーディングしているなら、スタックを自分で実装しなければならないと思っていました。しかし、これはそうではないようで、次のようなコマンドがあります。

pushl
popl

ということで、アセンブリで x86 アーキテクチャで Gas 構文を使用する場合、スタックはすでに実装されているデータ構造なのでしょうか?それとも、ハードウェア レベルで実際に実装されているのでしょうか?それとも何か他のものですか?また、他のチップセット用のほとんどのアセンブリ言語では、スタックはすでに実装されているのでしょうか?

これは少し愚かな質問であることは分かっていますが、実際、私はこれによってかなり混乱しています。

どのように解決するのですか?

私は主に、あなたが混乱に陥っていると思う program's stackany old stack .

Aスタック

Last In First Out方式で情報を構成する抽象的なデータ構造です。スタックの上に任意のオブジェクトを置き、またそれを取り出すという、入出庫トレイのようなもので、常に一番上のアイテムが取り出され、常に一番上に置かれることになります。

プログラムスタック

スタックとは、実行中に使用されるメモリのセクションのことで、一般にプログラムごとに固定されたサイズを持ち、関数のパラメータを格納するために頻繁に使用されます。関数を呼び出すときにパラメータをスタックにプッシュし、関数はスタックを直接アドレスするか、スタックから変数をポップオフします。

プログラムのスタックは一般的にハードウェアではありませんが(メモリに保存されているので、そのように主張することはできます)、スタックの現在の領域を指すスタックポインタは一般的に CPU レジスタです。このため、スタックがアドレス指定されるポイントを変更できるため、LIFO スタックよりも少し柔軟性があります。

を読み、理解する必要があります。 ウィキペディア の記事を読み、理解する必要があります。この記事では、あなたが扱っているハードウェア スタックについて詳しく説明しています。

また、次のようなものもあります。 このチュートリアル では、スタックを古い16ビットレジスタの観点から説明していますが、参考になるかもしれませんし もうひとつ は、特にスタックについて説明しています。

Nils Pipenbrinckからです。

プロセッサによっては、スタックにアクセスして操作する命令 (プッシュ、ポップ、スタックポインタなど) をすべて実装していないものもありますが、x86 はその使用頻度から実装しているということは、注目に値します。このような状況では、スタックが必要な場合、自分で実装する必要があります (一部の MIPS および一部の ARM プロセッサはスタックなしで作成されます)。

たとえば、MIP ではプッシュ命令は次のように実装されます。

addi $sp, $sp, -4  # Decrement stack pointer by 4  
sw   $t0, ($sp)   # Save $t0 to stack  

となり、Pop命令は次のようになります。

lw   $t0, ($sp)   # Copy from stack to $t0  
addi $sp, $sp, 4   # Increment stack pointer by 4