C++ 使用GCC部件以移动次数向左/向右旋转

C++ 使用GCC部件以移动次数向左/向右旋转,c++,visual-studio,gcc,assembly,x86,C++,Visual Studio,Gcc,Assembly,X86,我有以下代码来计算VisualStudioAssembly中的左/右旋转 template<class T> inline T rotr(T x, unsigned char moves){ unsigned char temp; __asm{ mov temp, CL mov CL, moves ror x, CL mov CL, temp }; return x

我有以下代码来计算VisualStudioAssembly中的左/右旋转

template<class T>
inline T rotr(T x, unsigned char moves){
    unsigned char temp;
    __asm{
        mov temp, CL
            mov CL, moves
            ror x, CL
            mov CL, temp
    };
    return x;
}
template<class T>
inline T rotl(T x, unsigned char moves){
    unsigned char temp;
    __asm{
        mov temp, CL
            mov CL, moves
            rol x, CL
            mov CL, temp
    };
    return x;
}
模板
内联T rotr(T x,无符号字符移动){
无符号字符温度;
__asm{
移动温度
移动,移动
ror x,CL
温度
};
返回x;
}
模板
内联T旋转(T x,无符号字符移动){
无符号字符温度;
__asm{
移动温度
移动,移动
rol x,CL
温度
};
返回x;
}
1-如何为gcc编写等效的asm代码


2-有没有更好的方法在Visual Studio assembly中编写它?

我在这里找到了答案:

并将我的代码改写为:

template<class T> 
inline  T rotr(T x, uint8_t r) {
      asm("rorl %1,%0" : "+r" (x) : "c" (r));
      return x;
    }

template<class T> 
inline  T rotl(T x, uint8_t r) {
      asm("roll %1,%0" : "+r" (x) : "c" (r));
      return x;
    }
模板
内联T旋转器(T x,uint8_T r){
asm(“rorl%1,%0”:“+r”(x):“c”(r));
返回x;
}
模板
内联旋转变压器(TX,uint8\U T r){
asm(“滚动%1,%0:“+r”(x):“c”(r));
返回x;
}

感谢Jerry Coffin和gnometorule对_rotl/_rotr(旋转)64/_rotr64(旋转)提出的有用意见

我在这里找到了答案:

并将我的代码改写为:

template<class T> 
inline  T rotr(T x, uint8_t r) {
      asm("rorl %1,%0" : "+r" (x) : "c" (r));
      return x;
    }

template<class T> 
inline  T rotl(T x, uint8_t r) {
      asm("roll %1,%0" : "+r" (x) : "c" (r));
      return x;
    }
模板
内联T旋转器(T x,uint8_T r){
asm(“rorl%1,%0”:“+r”(x):“c”(r));
返回x;
}
模板
内联旋转变压器(TX,uint8\U T r){
asm(“滚动%1,%0:“+r”(x):“c”(r));
返回x;
}

感谢Jerry Coffin和gnometorule对_rotl/_rotl64/_rotr64的有用评论

VC++在标准库中有
_rotl
/
_rotr
(用于
int
s)和
_rotl64
用于
long
)。同样,gcc(gas)x86程序集也有rol/ror(旋转,不包括进位)和rcl/rcr(旋转,包括进位)。VC++在标准库中有
\u-rotl
/
\u-rotr
(用于
int
s)和
\u-rotl64
\u-rotr64(用于
long
)。同样,gcc(gas)x86组件也有rol/ror(旋转,不包括进位)和rcl/rcr(旋转,包括搬运)。