在C ++中,我想使用汇编指令ROL向左旋转一个4个字符的数组。我以为我会把这个数组解释成一个dword并将这个dword旋转一次到左边,这样就可以做我想要的了。相反,每当我向左旋转一次dword时,它就会向右旋转一次。这是我的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,即使我向左移动。有人能解释我为什么会这样吗?这与字节序有关吗?
答案 0 :(得分:2)
是的,这是由于字节序,你的机器是一个小端机器。 这就是发生的事情:
旋转前的 input_array:10, 20, 30, 40
旋转前的EAX:40 30 20 10
轮换后的EAX:30 20 10 40
output_array:40, 10, 20, 30