5

私は現在AT&T Assemblyで割り当てに取り組んでおり、2つの文字列を追加する必要があります。

message: .asciz "String 1"
before: .asciz "String 2"

これをどうやってやるのか、どうやって始めるのか、私には本当にわかりません。すでにインターネットで検索しましたが、役立つ情報が見つかりませんでした。2番目の文字列の文字を最初の文字列の最後に手動でコピーする必要があると思いますが、それについてはよくわかりません。

誰かがこれを行う方法を私に説明してもらえますか?:)

4

2 に答える 2

7

この質問では、ターゲットメモリについて言及していないため、回答がやや困難になります。また、16ビット、32ビット、64ビットのいずれであるかはわかりません。便宜上、Cスタイルの0で終了する文字列であると仮定します。

とにかく、これは一般的な手順のようです:

  • 最初の文字列の長さを取得します(asm strlenの記述方法については、http://www.int80h.org/strlen/を参照してください) 。
  • ptrをターゲットメモリに設定します
  • rep(e/ne) movsbecxのサイズを使用して、最初の文字列を宛先メモリにコピーします。

これは、「movsd」を使用してCPUを最適化できます。最初shr ecx, 2に長さに対してを実行して、4バイトのバッチで取得し、残りをmovsbで実行します。私はこれがこのように行われるのを見ました:

mov     edi, dest
mov     esi, string_address
mov     ecx, string_length
mov     eax, ecx
shr     ecx, 2
repne movsd
mov     cl, al
and     cl, 3
repne movsb ; esi and edi move along the addresses as they copy, meaning they are already set correctly here
  • 2番目の文字列の長さを取得します(必要に応じて、ediをスタックまたは別のレジスタにバックアップしてください。次の文字列をコピーするために必要なアドレスが含まれています)
  • 2番目の文字列を宛先メモリにコピーします(私が言ったように、正しいアドレスは最初の文字列操作の後にediにあるはずです)
  • 安全のため、その後ろに新しい0を追加します。

2番目の文字列を最初の文字列の最後にコピーする場合、必要なコピー操作は1つ少なくなりますが、の重要な要素を上書きせずに2番目の文字列をコピーするのに十分なスペースがあることを確認する必要があります。

于 2012-07-04T17:21:27.487 に答える
2

これは些細なことではありません。文字列は長さが可変であり、メモリ内のさまざまなスペースを占有します。文字列の長さや終了場所を知る方法が必要です。CまたはC++では、nulバイト(ゼロ値のバイト)は文字列の終わりを示します。他のいくつかのプログラム言語では、文字列の先頭と文字列の長さを別々に格納するためのポインタがあります。これには、文字列にバイナリ(ゼロ値のバイトを含む)を格納できるという利点があります。Cとそれ以外の場合でも、文字列の開始位置へのポインタが必要です。

一般的に発生する必要があるのは、asmを使用してオペレーティングシステムに接続し、2つの文字列が接続されるとその内容を含むのに十分な大きさの現在空きのメモリブロックを要求する必要があることです。これは、最初は2つの文字列のいずれかとは別のメモリであり、メモリヒープと呼ばれるものに由来します。そのメモリブロックの開始点が指定されたら、最初の文字列の内容をコピーします。 、次に、最初の文字列のすぐ後ろにある2番目の文字列の内容をコピーしながら続行します。次に、最初の文字列に割り当てられていたメモリを解放し、ポインタと場合によっては長さを変更して、ブロックをその文字列に再割り当てします。解放されたメモリは、他の場所で再利用するために、オペレーティングシステムによってメモリヒープに戻されます。

実際、解放されたメモリのソースはオペレーティングシステムだけではありません。一部のコンパイラは、アセンブラでさえ、独自にメモリ管理を処理するか、必要に応じてそれを実行するための適切なツールをプログラマに提供します。

言い換えれば、これは非常に野心的な取り組みである可能性があり、それを正しく行うために何が起こっているのかについてかなり知る必要があります。あなたはそれを間違って行います、あなたはあなたのシステムをクラッシュさせそして再起動する必要があるような結果を期待することができます。

于 2012-08-14T23:07:06.827 に答える