6

したがって、バッファの一般的な抽象的な概念を理解しています。それは、処理される前にデータを保持するメモリ内の割り当てです。プロシージャ内のバッファに ASCII 文字列を書き込む必要がある宿題の問題を解決しようとしています。したがって、たとえば、プロシージャを呼び出すときに配列のアドレスをプロシージャに渡すことになっていることを理解しています...

main PROC
mov  EAX, packed           ; pass a packed decimal to EAX
mov  ESI, OFFSET ascArray  ; pass the offset of an empty array to ESI
call PackedToAsc           ; call the function

したがって、関数は「ASCII 10 進文字列を含むバッファーへのポインター」を返すことになっています。ここで私はおそらくばかげていますが、この場合のバッファーが正確に何であるかについてはよくわかりません。

  • 配列ですか?
  • セクションでそのように宣言する必要があり.dataますか?
  • プロシージャ内で ASCII 文字列へのポインタを宣言するにはどうすればよいですか?
  • このコンテキストでのバッファとは何を意味しますか?

より実際には、手順が終了したときにデータが格納されるバッファーにアクセスする必要がありますが、その方法がわかりません。

編集   - 私は x86 を使用しており、MASM を使用しています。

4

3 に答える 3

4

x86 を想定すると、これはバッファがデータで始まるかどうかによって異なります。また、バッファが可変サイズかどうかにも依存します。

ケース 1 を例にとると、バッファーが 20 バイトを超えないことがわかっている場合は、データ セクション (NASM 構文) で宣言できます。

buffer: times 20 db 0

0データ セクションで、現在使用できる20 バイトを宣言します。データで初期化する必要がない場合は、.bss セクション (NASM 構文) を使用します。

buffer: resb 20

NASMに20バイトを予約するように指示します。

ただし、バッファーのサイズが可変の場合は、それほど簡単ではありません。OS からメモリを動的に割り当てる必要があり、これは OS に大きく依存します。基本的に 2 つのオプションがあります。

  • Use you C library's malloc: これは、プラットフォームの呼び出し規則に応じて、より簡単またはより困難になる場合があります。ここに合理的な参照があります
  • システム コールを使用します。すべてのシステムは、より多くのメモリを取得する何らかの方法を提供しますが、malloc. 通常、プロセスにメモリの別のページを追加し、それを自分で管理できるようにする必要があります。これは malloc が内部で行うことであり、C ライブラリを使用できない場合の唯一のオプションです。
于 2012-11-20T14:52:33.707 に答える