07 October, 2008

Приколы ARM ассемблера

Конечно глядя с высоты знания можно заметить, что тут все просто. Но после долго сидения на ассемблерах x86 и x64 данный ARM код вызывает легкую дезориентацию.

E3A03116    mov r3, #0x16, 2
E3830901    orr r0, r3, #1, 18
E12FFF1E    bx lr

Первая команда берет 0x16 и циклически сдвигает вправо на 2 бита - резульат 0x80000005 вторая команда берет 1 и сдвигает циклически вправо на 18 бит, потом делает OR с результатом первой команды. Получаем 0x80004005 в r0 (возвращяемое значение функции).

Вот как эта функия выглядит на C++:

HRESULT Class::Func() { return E_FAIL; }