向左旋转就是向右旋转

Rotating left is rotating right

本文关键字:旋转      更新时间:2023-10-16

在c++中,我想使用汇编指令ROL向左旋转一个4个字符的数组。我想我应该把这个数组解释成一个双字,然后把这个双字向左旋转一次,这样就能达到我的目的了。相反,每当我把双字向左旋转一次,它就向右旋转一次。这是我的ASM代码:

ShiftRow proc
; copy array into EAX
MOV EAX, DWORD PTR [RCX]
ROL EAX, 8
MOV DWORD PTR [RDX], EAX
RET
ShiftRow endp

,这就是我的c++代码的样子:

#include <iostream>
using namespace std;
extern "C" void __fastcall RotateArray(const char* Array, char* OutputArray);
int main()
{
    char input_array[] = {0x10, 0x20, 0x30, 0x40};
    char output_array[4] = {};
    RotateArray(input_array, output_array);

    for(int i = 0; i < 4; i++)
        std::cout << std::hex << (unsigned int)output_array[i] << " ";
    cin.get();
}

奇怪的是(对我来说)输出是40 10 20 30,即使我向左移动。有人能解释一下为什么会这样吗?这和端序顺序有关吗?

是的,这是由于端序,而您的机器是一个小端序机器。下面是发生的事情:

input_array before rotation: 10, 20, 30, 40

旋转前的EAX: 40 30 20 10

旋转后的EAX: 30 20 10 40

output_array after rotation: 40, 10, 20, 30