2013-05-21 3 views
0

В 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, хотя я перемещался влево , Может кто-нибудь объяснить мне, почему это происходит? Имеет ли это какое-то отношение к утверждению?

+4

Да, это из-за сущности. Посмотрите на память в отладчике, особенно на то, как хранится _real_ dword, чтобы понять больше. – mah

+0

@Dave Newman - Ваш комментарий неверен. На машинах с небольшим количеством наименьших адресов находится младший байт (то есть самый правый байт), поэтому он начинается с '0x40302010'. Когда он повернут влево, у него есть «0x30201040». Чтение с самого низкого адреса справа дает результат, который он наблюдает. – Bull

+0

Yup. Вы можете исправить это с помощью команды bswap перед rol. – enhzflep

ответ

2

Да, это из-за контентоспособности, и ваша машина является мини-машиной. Это то, что происходит:

input_array перед тем вращения: 10, 20, 30, 40

EAX перед тем вращения: 40 30 20 10

EAX после вращения: 30 20 10 40

output_array после вращения: 40, 10, 20, 30

+0

«Ваша машина, вероятно, малоконтинентальная машина»: не так много машин, которые могут выполнить сборку x86, которые не имеют ничего общего! – Bull

+0

Бинго - это сборка x86. .: «Конечно, это маленький конец. – enhzflep

+0

@ user2151446: Да, вы правы. Я изменил ответ. –

Смежные вопросы