読者です 読者をやめる 読者になる 読者になる

【アセンブリ】スタックフレームの大きさはなぜ24バイト以上?8バイト単位?【MIPS】

手続き呼び出し規約にスタックフレームの大きさは24バイト以上と定められている (P.766)

Patterson&Hennessy本によると

この最低限のフレームに4つの引数レジスタ ($a0 - $a3) と戻りアドレス$raを、倍長語の境界に整列化して持たせることができる。mainでは$fpも退避する必要があるので、スタックフレームを2語分大きくしなければならない。(スタックフレームは倍長語の境界に整列化されることに留意)(P.766)

The frame is larger than required for these two register because the calling convention requires the minimum size of a stack frame to be 24 bytes. This minimum frame can hold four argument registers ($a0-$a3) and the return address $ra, padded to a double-word boundary (24 bytes). Since main also needs to save $fp, its stack frame must be two words larger (remember: the stack pointer is kept doubleword aligned).

って書いてる。正直意味がわからん笑

まず、レジスタひとつにあたり基本1バイト必要で、”倍長語”っていうのがその倍領域を確保する、ってことなら引数レジスタ4つ+$ra+$fpで6つ分必要なことになる。

でもそれだと12バイトってことになる。。

基本が2バイトで、それが6つの倍長語ってことなら24バイトってことになる。けどそういうことなのか。。。?

なぜ2バイトなんだ。。。?

以下のサイト

http://www.swlab.cs.okayama-u.ac.jp/~nom/lect/p3/what-is-calling-convention.html

でわかってきたけど、0から15までの16バイトはコンパイルする過程でなんかしら必要になるらしい。データ4つ分てことかな?

じゃあ最低限の24バイトのうちあと8バイトはなんや、って言ったら、これが $ra$fp なわけですな。

それでさらに引数などで必要な値があるときは、その数に応じて最初にフレームを拡げておく、と。

そんで 8バイト単位でスタックを確保しないといけない理由は、少数点数とかで分割して一つの値とかを扱ったりするときにその方が都合がいいからかなーとか勝手に予想した。