0

メモリからいくつかの単語をコピーし、アセンブリを使用して別のメモリアドレスに保存しようとしています。そのためのコードを書き込もうとしていますが、一部の部分についてはよくわかりません。やりたいことを簡単に説明します。

送信元アドレス、宛先アドレス、およびコピーするワード数は、関数の入力引数です。

4

2 に答える 2

0

説明からは、バイト数ではなくコピーする単語数を指定することを除けば、通常のmemcpyのように聞こえます。スタックバッファのアイデア全体がどこから来ているのかわからない(?)。

このようなものは、送信元から宛先アドレスに単語をコピーします。

sll $a2,$a2,2
addu $a2,$a1,$a2  ; $a2 = address of first byte past the dest buffer
Loop:
    lw $t0,0($a0)
    sw $t0,0($a1)
    addiu $a0,$a0,4
    addiu $a1,$a1,4
    bne $a1,$a2,Loop
    nop

編集:ソースバッファとデスティネーションバッファがワード境界で整列されていない場合は、データ整列の例外を回避するために、代わりにlb/sbを使用する必要があります。

于 2012-08-02T06:12:03.180 に答える
0

編集:ブランチの後にnopsを追加しました

それで、Cでこれをどのように行うかを考えてください...低レベルで。

unsigned int *src,*dst;
unsigned int len;
unsigned int temp;
...
//assume *src, and *dst and len are filled in by this point
top:
  temp=*src;
  *dst=temp;
  src++;
  dst++;
  len--;
  if(len) goto top;

あなたはあまりにも多くのものを混ぜています、1つの計画に焦点を合わせてください。最初に、2つのレジスタに送信元アドレスと宛先アドレスがあると言いましたが、なぜスタックが関係しているのですか?スタックをコピーまたは使用しているのではなく、2つのアドレスを使用しています。

4を掛けてバイト数を取得するのは正しいですが、一度に1つの単語をコピーする場合は、バイトを数える必要はなく、単語だけを数える必要があります。これは、送信元アドレスと宛先アドレスが整列されているか、整列する必要がないことを前提としています。(整列されていない場合は、一度にすべてを1バイトずつ実行します)。

したがって、これはアセンブリでどのように見えるか、mipsに変換できます。これは擬似コードです。rsはソースレジスタ$ a0、rdはデスティネーションレジスタ$ a1、rxは長さレジスタ$ a2、rtは一時レジスタです。ここで、メモリからワードをロードする場合は、ロードワード(lw)命令を使用します。バイトをロードする場合は、lb(ロードバイト)を実行します。

top:
branch_if_equal rx,0,done
nop
load_word rt,(rs)
store_word rt,(rd)
add rs,rs,4
add rd,rd,4
subtract rx,rx,1
branch top
nop
done:

単語の代わりに一度にバイトをコピーすると、

shift_left rx,2
top:
branch_if_equal rx,0,done
nop
load_byte rt,(rs)
store_byte rt,(rd)
add rs,rs,1
add rd,rd,1
subtract rx,rx,1
branch top
nop
done:
于 2012-08-02T06:21:09.327 に答える