0

私は、RAR Filter VM言語内でビットを左にN位置回転させた単語を返す小さなサブルーチンを実装しようとしています。これは、x86に非常によく似ており、すべての目的と目的でx86と考えることができます。 「拡張子なし」。

複製しようとしているコードの一部(新しく標準化されたSHA-3標準Keccakの「Theta」ステップの一部)

(((x) << (y)) | ((x) >> (64 - (y))))

簡単そうに見えますが、RAR VMは32ビット幅のレジスタを使用しますが、実装する必要のある小さなルーチンには64ビット値を指定できます。

x<<yおよびx>>64 --yを再構築できるように、結果を別のレジスタshlに「オーバーフロー」させる最も自然な方法は何ですか?shrタイトルが示すように、私はオーバーフローフラグにアクセスできません。

注:これは、アセンブラーからのコードのサンプルです。これにより、私が使用する必要のある命令を確認できます。https://gist.github.com/581f7e162eebd652ee4b

4

1 に答える 1

1

擬似コード:

edx = hi_word
eax = lo_word
ecx = shift_count

if (ecx>32) {
   ecx-=32;
   swap eax,edx
}
simultaneously: edx = edx >> ecx | (eax << (32-ecx))
                eax = eax >> eax | (edx << (32-ecx))
于 2012-10-28T07:46:57.757 に答える