2013-04-06 13 views
5

こんにちは私は、バージニア大学でx86のガイドを読んでいます。スタックをプッシュしてポップすると、スタックに4バイトのデータ要素が削除または追加されます。x86 4バイト未満でプッシュ/ポップできますか?

なぜ4バイトに設定されていますか?これを変更することはできますか?小さなデータ要素を押すことでスタックにメモリを節約できますか?誰もがそれを見たい場合

ガイドでは、ここで見つけることができます: http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

+1

このステートメントは32ビットモードでのみ適用され、2バイト要素。 – harold

答えて

7

短い答え:はい、16ビットまたは32ビット。そして、x86-64の場合、64ビットです。

スタックの主な理由は、ネストされた関数呼び出しから戻り、レジスタ値を保存/復元することです。これは、通常、パラメータを渡して関数の結果を返すためにも使用されます。最小のパラメータを除いて、これらの項目は通常、プロセッサの設計、すなわち命令ポインタレジスタのサイズによって同じサイズを有する。 8088/8086では、16ビットです。 80386以降では32ビットです。したがって、他のサイズで動作するスタック命令を持つことにはほとんど価値がありません。

メモリバス上のデータのサイズも考慮します。単語の検索や保存には1バイトと同じ時間がかかります。 (ただし、16ビットレジスタで8ビットのデータバスを持つ8088は除きます。)アラインメントも有効です。各値を1回のメモリ操作として取り出すことができるように、スタックはワード境界に整列させる必要があります。トレードオフは通常、メモリの節約にかかる時間を節約するために行われます。 1バイトをパラメータとして渡すには、通常は1語が使用されます。 (または、コンパイラで使用できる最適化によっては、1つのワードサイズのレジスタが使用され、スタック全体を避けることができます)。

+9

x86-64では、メモリに格納されている32ビットのレジスタまたは値、メモリに格納されている16ビットまたは64ビットのレジスタおよび値のみをプッシュできません。 'push ax'、' push rax'、 'push word [rax]'、 'push qword [rax]'はすべてx86-64の有効な命令ですが、 'push eax'と' push dword [rax] 'は有効ではありませんx86-64。 – nrz

+0

386SX(32ビットワード、16ビットデータバス)の80188(16ビットワード、8ビットデータバス)と(多少一般的でした) 8088はデータバスサイズの不一致に関するものです。 –

+0

"各値を1つのメモリ操作として取り出すことができるように、スタックはワード境界上に整列する必要があります"という場合、これは関数内のローカル変数に適用されますか? – Thomson

関連する問題