2017-01-31 3 views
-2

%ebp(スタックベースポインタ)+定数はアセンブリ内のローカル変数を参照するために使用されます。ローカル変数が多すぎ、必要な定数が大きすぎてアセンブリコードの1行(32または64ビット)に収まらない場合はどうなりますか?このようなエッジケースはどのように処理されますか?ローカル変数とスタックベースポインタのオフセットのオーバーフローが多すぎます

ebp reference

例えば、上記画像に2^30のローカル変数が存在すると仮定する。最後のものを参照するには、2^32のオフセットが必要です。 32ビット環境で作業している場合、このオフセットは同じ行にopcode、destinationなどがあることを考慮して、1行のコードに収まらないでしょう。

+5

スタックのオーバーフローを待っているので、それほど多くのスタックはありません。 \ o /あなたが十分だった場合、それはちょうど回り込むだろう。 – Jester

+2

現実的には、コンパイラはそれよりずっと前に爆発するでしょう(この問題を持つasmコードを生成する機会はありません)。なぜなら、ASTやその他の内部データ構造はさらに大きくなるからです。 – harold

答えて

5

32ビットおよび64ビット動作モードでは、x86アーキテクチャのアドレッシングモードでは、置換なし、8ビットの置換、または32ビットの置換が可能です。

32ビットモードでは、すべての可能な変位(したがって、すべての可能なスタックオフセット)を記述するのに十分です。あなたの懸念のために:スタックはおそらく2 という変数を含むことができませんでした。マシン・コードを格納するスペースを残さずに、スタック・スペースの4 GiBになります。

64ビットモードでは、実際には32ビットディスプレースメントでは記述できないディスプレースメントを持つことが可能です。これは実際にはめったに起こりません(これは、AMDのエンジニアが32ビットでディスプレースメントサイズを残すことにした理由です)が、時々起こることがあります。そのような場合、変位はレジスタを介して適用する必要があります:

mov rax,0x123456789abcdef0 ; displacement 
mov eax,[rax,rbp]   ; value 
関連する問題