1
// Code I'll be working with
int shift_left2_rightn(int x, int n)
{
    x <<= 2;
    x >>= n;
    return x;
}

質問1.左シフト=SALおよびSHL。私の本はそれらが同じ効果を持っていると言っています。では、なぜ2つのシフト操作があるのでしょうか。

例えば:

movl    8(%ebp), %eax    //Get x
_______                  //x <<= 2 

私の本はの答えを与えます

sall    $2, %eax

だろう

shll    $2, %eax 

正解もありましたか?

質問2:

SHR素人の言葉で言えば、との違いは何SARですか?私の本によると、1つは論理シフト(ゼロで埋める)で、もう1つは算術シフト(符号ビットのコピーで埋める)です。

0 /符号ビットで何を埋めますか?

例えば:

次の組み立て手順でどちらを使用するかをどのように知ることができますか?

movl   12(%ebp), %ecx   //Get n
______                  //x >>=n

本の裏には答えがあります

sarl   %cl, %eax 

を使用するとどうなるか説明してくださいshrl

これを理解するためにあなたの助けをありがとう!

4

2 に答える 2

5

salshl同義であり、それらは同一のオペコードを持っています。

sar負の無限大(-Inf)に向けた2の丸め数値による符号付き除算、および2による符号なし除算と同様shrに、おそらくIntelのエンジニアは、両方を組み込むことを決定しましsalshl

shrこれが何をして何をするかの例sarです:

mov al,0b10001000 ; 0b10001000 = 136d = -120d (2's complement)

shr al,1          ; 0b01000100 =  68d =   68d (2's complement)

mov al,0b10001000 ; 0b10001000 = 136d = -120d (2's complement)

sar al,1          ; 0b11000100 = 196d =  -60d (2's complement)

したがってshr、ゼロでsar埋め、符号ビットで埋めます。

shr一般に符号なし除算またはビットシフトsar用、および符号付き除算用です。

于 2013-02-16T21:58:08.307 に答える
0

実際には2つの異なる操作はなく、同じ命令の2つの名前だけがあります。

右にシフトすると、符号付き(SAR)と符号なしの値(SHR)に違いがあるため、一方の操作記号は拡張され、もう一方は拡張されません。

左にシフトしても違いはありませんが、右シフトとの対称性のために2つの名前(SALとSHL)があります。どちらも同じマシンコードにマップされます。

于 2013-02-16T21:48:26.743 に答える