-3

これを y86 アセンブリに変換するために、このコードを理解しようとしています。カッコ内の質問に誰か答えてください。

/* This function copy_block - Copy src to dest and return xor checksum of src */
long copy_block(long *src, long *dest, long len) //(first two input arguments will be stored in %RDI and %RSI where will the be third argument stored?)
{
    long result = 0;
    while (len > 0) {
    long val = *src++; //(is this dereferencing first and then adding or opposite?)
    *dest++ = val; //(what is this line doing?)
    result ^= val; //(what is checksum and why are we XORing val with sum of previous XORed values?)
    len--;
    }
    return result;
}

サンプル入力

.align 8
# Source block
src:
.quad 0x00a
.quad 0x0b0 
.quad 0xc00
# Destination block
dest:
.quad 0x111  #(why are there three sources and just one dest?)
4

2 に答える 2

2

Y86 は「本物の」アーキテクチャではなく、教育目的で設計されたものだと思います。私はそれへの参照を見つけましたhere。AT&T 構文 (つまり、ソース、ターゲットオペランドの順序) を使用しているようです。

最初の 2 つの入力引数は %RDI と %RSI に格納され、3 番目の引数はどこに格納されますか?

おそらく講義ノートでY86 ABIを確認してください。SYSV AMD64 ABIと一致する場合、それはrdxレジスターになります (表の最後の行を参照)。

Y86 アセンブリを生成する C コンパイラを使用している場合は、3 つのパラメーターを取り、単純な組み合わせ (つまり、合計して結果を返す 3 つの int など) を返す単純なプログラムを作成します。次に、結果を生成するためにどのレジスタが使用されているかを確認します。

long val = *src++;
*dest++ = val;

ポストインクリメントは、式が評価された後に発生します。したがって、上記は次と同等です

long val = *src;
src++;

*dest = val;
dest++;

チェックサムとは何ですか?

これは、伝送エラーなどによるデータのチャンクの変化を検出するために使用される小さな数値です。詳細については、チェックサムに関するウィキペディアの記事を参照してください。

なぜ以前の XOR された値の合計で val を XOR するのですか?

チェックサムを計算するにはさまざまな方法があります。この特定の方法は、XOR を使用して計算されます。

XOR はおそらく簡単にするために選択されました。実際のチェックサム アルゴリズムでは、ルックアップ テーブル、またはビット シフト、XOR、および (符号なしモジュロ) 加算と乗算のいずれかが使用されます。それらを手動でアセンブリに変換するには、さらに多くの作業が必要になります。

チェックサムを使用すると、データのチャンクとチェックサムを送信または保存するという考え方になります。受信者またはリーダーは、チェックサムを再計算し、保存されているチェックサムと比較できます。2 つのチェックサムが異なる場合、データにエラーがある可能性があります。

チェックサムは絶対確実ではありません。2 つが明らかに異なっていても、チェックサムが一致するほど多くのエラーが発生する可能性は十分にあります。

チェックサムも、エラーの場所や内容を特定しません。エラーを識別する「チェックサム」は、より適切にはエラー訂正コードと呼ばれます。これらは、CD、DVD、Blu-ray メディアなどで一般的に使用されています。ほとんどのハード ドライブは、書き込んだデータのチェックサムも内部で保持しているため、データを読み戻すときにエラーを検出できます。チェックサムとエラー訂正コードの詳細については、エラー検出と訂正に関するウィキペディアの記事を参照してください。

ソースが 3 つあるのに宛先が 1 つしかないのはなぜですか?

lenこの関数はクワッドを からsrcにコピーするdestため、ソースと宛先は同じ長さにする必要があります。

サンプル入力はバグである可能性がありますが、講義ノートのどこかに、サンプル入力の後に十分な数の未定義バイトが続くと想定されている、つまり、最終ラベルに続くクワッドの数が何かを示すものではありません。言い換えれば、講師/TA/誰でも同じようにサンプル入力を提供できたはずです。

    .align 8

# Source block
src:
    .quad 0x00a
    .quad 0x0b0 
    .quad 0xc00

 # Destination block
 dest:

とにかく宛先の内容は上書きされ、その内容は重要ではないためです。Y86 アセンブリは.quad ?、メモリ予約を明確にするディレクティブなどをサポートしていないようです。

于 2016-10-29T14:07:25.357 に答える