0

2文字の入力が必要な場合は、次を使用します。

input_str:  .ascii "??"  

そして後で:

mov $2, %edx

次のように:

.data               
input_str:  .ascii "??" 

.text               
.global _start          
_start:             
    mov $3, %eax          # eax = 3 = function number for "read"
    mov $0, %ebx          # ebx = 0 = file descriptor (stdin)
    mov $input_str, %ecx  # ecx = address of input buffer
    mov $2, %edx          # edx = buffer maximum size
    int $0x80             # Call Linux kernel API
                          # eax = error code or number of bytes read

等...

しかし、ランダムな長さの文を求めている場合はどうなるでしょうか? 入力後、何個あるのかをどのように読みますか?

4

1 に答える 1

1

ランダムな長さのデータを処理するにはさまざまなトリックがあり、それらはすべて動的に割り当てられたメモリを必要とします。

Linux で提供する最も簡単な方法は、sys_brk関数を使用することですが、1 つのメモリ ブロックしか割り当てることができません。

ヒープ管理を提供するライブラリがあります。完全にアセンブリ言語で記述されたそのようなライブラリの 1 つがFreshLibです。もう 1 つのオプションは、C 標準ライブラリとリンクすることです。

次に、事前に (実行時に) データ長を知っているかどうかに応じて、動的に割り当てられたバッファー内のデータを読み取る 2 つのケースがあります。

既知のデータ サイズ

それは簡単です - 必要なサイズのバッファを割り当て、データを完全に読み取ります。

不明なデータ サイズ - いわゆるストリーム データ

読んでからコピペ

メモリ内のストリーム データを読み取る唯一の方法は、このデータの固定チャンクを読み取ってから、動的に割り当てられたバッファーにコピーすることです。バッファがいっぱいになったら、より大きなサイズで再割り当てし、すべてのデータが読み取られるまで続行する必要があります。

メモリの再割り当てはコストのかかる操作であるため、必要以上のメモリを割り当てることをお勧めします。一般的なアルゴリズムは、再割り当てごとに割り当てられたメモリのサイズを 2 倍にすることです。個人的には、この戦略は積極的すぎると思います。サイズに 1.5 を掛けることがよくあります。

データ全体をまったく読み取らない

多くの場合、メモリ内のデータ全体を読み取るのではなく、小さな固定チャンクで読み取られるため、オンザフライで処理できます。この方法にはもう少し複雑なアルゴリズムが必要ですが、非常に小さなメモリを使用できるという大きな利点があり、動的に割り当てられたメモリを必要とせず、複数のメモリ ロケーション間でのデータのコピーを回避できます。

于 2013-03-15T05:57:24.713 に答える