0

MIPSとMARSシミュレーターを使ってアセンブリ言語の基礎を学んでいます。タイトルは私の質問を囲みますが、例を挙げて拡張してみます。キーボードから文字列を読み取りたいとします (最大 200 文字)。私たちは進むべき道を歩まなければなりません

1) 静的データ セグメントに 201 バイトを割り当て、システム コールを実行して文字列を読み取り、「文字列」アドレスで参照します。

.data
string:     .space  201

.text
li  $v0, 8
la  $a0, string
li  $a1, 201
syscall

2) sbrk 関数 (MARS でのみ使用可能) によってヒープ上の 201 連続バイトを要求し、入力文字列で埋めます。

li  $v0, 9
la  $a0, 201
syscall
move    $s0, $v0

li  $v0, 8
move    $a0, $s0
li  $a1, 201
syscall

両方の方法の長所と短所は何ですか? MIPS の例では常に 1 番目の方法を見てきましたが、2 番目の方法が使用されていない理由がわかりません。

前もって感謝します :)

4

1 に答える 1

1

最初の方法は、一定数の (少数の) バッファーしか必要としない単純なプログラムでは問題ありません。また、メモリを解放する必要がないため、初心者にとっては簡単です。

動的割り当て方法では、プロセスのメモリ使用量がより柔軟になります。
たとえば、一時的にしか必要としないバッファがあり、メモリは有限のリソースであるため、必要がなくなったときに解放できるように、そのメモリを動的に割り当てたい場合があります。プロセスの存続期間全体にわたって割り当てられたままになります。
また、コンパイル時に必要なメモリ量が正確にわからない可能性もあります。これは、たとえばユーザー入力に依存する可能性があるためです。これは、動的メモリ割り当てが役立つ別のシナリオです。

メモリを動的に割り当てることの欠点は、ユーザー (プログラマー) がすべての割り当てを追跡する必要があることです。つまり、ある時点で割り当てたメモリを確実に解放する必要がありますが、メモリを解放する前に、プログラムがそのメモリの一部で完了していることを確認する必要もあります (または、ぶら下がっているポインター)。

于 2013-04-28T10:16:19.863 に答える