たとえば、C でこれを行う方法を考えてから、それを asm に変換します。
たとえば、ra が上位 32 ビットで rb が下位であると仮定すると、32 ビット変数を使用して左に 1 ビット シフトします。
if(rb&0x80000000) { ra<<=1; ra|=1; rb<<=1 }
else { ra<<=1; rb<<=1; }
回転のために、これらの線に沿って何かをするかもしれません
if(rb&0x80000000)
{
if(ra&0x80000000) { ra<<=1; ra|=1; rb<<=1: rb|=1; }
else { ra<<=1; ra|=1; rb<<=1; }
}
else
{
if(ra&0x80000000) { ra<<=1; rb<<=1: rb|=1; }
else { ra<<=1; rb<<=1; }
}
次に、それらのいずれかをループでラップして、N 回実行できます。
または、8ビット左シフトと言います
ra=(ra<<8)|(rb>>(32-8));
rb<<=8;
または、Nビット左シフトと言います
ra=(ra<<=n)|(rb>>(32-n));
rb<<=n;
または、n ビット左回転 (これは 32-n ビット右回転と同じです) (一部のプロセッサには右回転のみがあり、左が仮想である、またはその逆である理由があります)。
temp=ra>>(32-n);
ra=(ra<<=n)|(rb>>(32-n));
rb=(rb<<<=n)|temp;
次に、命令セットを見て、何が利用可能で、何をしているのかを確認します。
つまり、ビットをシフトするには、片側のビットを取り、次のビットに入れる必要があります。変数やレジスタなどの境界に自分自身を合わせた場合、一方の側からビットを取得して他方にシフトすることに違いはありません。命令セットまたはプログラミング言語が直接サポートしていないため、より多くのコードが必要になる場合があります。やれ。乗算命令を使用せずに 8 ビット プロセッサで 2048 ビットの乗算を実行できるのと同じように、他のプロセッサよりも多くのコードが必要ですが、非常に実行可能です。