В C++ я хочу повернуть массив из 4 символов один раз влево, используя инструкцию сборки ROL. Я думал, что интерпретирую массив как 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, хотя я перемещался влево , Может кто-нибудь объяснить мне, почему это происходит? Имеет ли это какое-то отношение к утверждению?
Да, это из-за сущности. Посмотрите на память в отладчике, особенно на то, как хранится _real_ dword, чтобы понять больше. – mah
@Dave Newman - Ваш комментарий неверен. На машинах с небольшим количеством наименьших адресов находится младший байт (то есть самый правый байт), поэтому он начинается с '0x40302010'. Когда он повернут влево, у него есть «0x30201040». Чтение с самого низкого адреса справа дает результат, который он наблюдает. – Bull
Yup. Вы можете исправить это с помощью команды bswap перед rol. – enhzflep