Конечно глядя с высоты знания можно заметить, что тут все просто. Но после долго сидения на ассемблерах 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; }