这个装配怎么可能?

时间:2016-11-06 15:50:22

标签: c gcc assembly x86

int sarl_n(int x, char n){
   x <<= 2;
   x >>= n;
   return x;

}

当我使用“gcc -m32 -S sarl_n.c”汇编时,它会发出以下代码:

.cfi_startproc
movl    4(%esp), %eax
movsbl  8(%esp), %ecx
sall    $2, %eax
sarl    %cl, %eax    #This is the part which I don't understand
ret
.cfi_endproc

为什么gcc使用“迷你注册”%cl而不是大注册%ecx

编辑:我使用O2选项来获得更短的汇编代码

1 个答案:

答案 0 :(得分:12)

以下行(上一版本)的原因

sarl    %cl, 8(%ebp)    #This is the part which I don't understand

或(当前版本)

sarl    %cl, %eax       #This is the part which I don't understand

正在使用%cl而不是%ecxSAR操作码仅支持%cl寄存器作为变量算术移位的输入({{1}时间)。

请参阅here,我引用:

%cl