C++ 使用GCC部件以移动次数向左/向右旋转
我有以下代码来计算VisualStudioAssembly中的左/右旋转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
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(旋转,包括搬运)。