Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Android Immediate Number Representation.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <iostream>
- inline unsigned long RotateLeft(unsigned long n, unsigned long i)
- {
- return (n << i) | (n >> (32 - i));
- }
- inline unsigned int RotateRight32Bit(unsigned int Data, unsigned int Bits) {
- return (Data >> Bits) | (Data << (32-Bits));
- }
- inline bool IsBlockSet(__int32 num, __int32 blockNum)
- {
- blockNum *= 2;
- return ((1 << blockNum | 1 << (blockNum + 1)) & num) != 0;
- }
- int FindBlockOfFirstBit(__int32 num)
- {
- for(int i = 0; i < 16; i++)
- {
- if(IsBlockSet(num, i))
- return i;
- }
- return 0;
- }
- inline int GetRemainder(int a, int b)
- {
- return ((a % b) + b) % b;
- }
- inline unsigned int blockModulo(int blockNum)
- {
- return GetRemainder(blockNum, 16);
- }
- int FindBlockOfLastBit(__int32 num)
- {
- for(int i = 30; i >= 0; i -= 2)
- {
- if((1 << i | 1 << (i + 1)) & num)
- return i / 2;
- }
- return 0;
- }
- int GoForwardAndGetActiveBlock(__int32 num, int startBlock)
- {
- for(int i = 3; i >= 1; i--)
- {
- int blockNum = startBlock + i;
- if(IsBlockSet(num, blockNum))
- return blockNum;
- }
- return startBlock;
- }
- int GoBackwardAndGetActiveBlock(__int32 num, int startBlock)
- {
- for(int i = 3; i >= 1; i--)
- {
- int blockNum = startBlock - i;
- if(IsBlockSet(num, blockNum))
- return blockNum;
- }
- return startBlock;
- }
- bool GetARMImmediateNumberComponents(__int32 num, unsigned char* outNum, unsigned char* outRot)
- {
- int start = FindBlockOfFirstBit(num);
- int forward = blockModulo(GoForwardAndGetActiveBlock(num, start));
- int backward = blockModulo(GoBackwardAndGetActiveBlock(num, forward));
- int end = blockModulo(backward + 4);
- forward *= 2;
- backward *= 2;
- end *= 2;
- __int32 mask;
- if(end < backward)
- mask = ~(((1 << (backward-end)) - 1) << end);
- else
- mask = ((1 << (end-backward)) - 1) << backward;
- __int32 leftOver = num & ~mask;
- if(!leftOver)
- {
- *outRot = backward == 0 ? 0 : 32 - backward;
- *outNum = (char)RotateLeft(num & mask, *outRot);
- return true;
- }
- else
- {
- *outRot = -1;
- *outNum = -1;
- return false;
- }
- }
- inline unsigned short int GetARMImmediateNumberRepresentation(unsigned char outNum, unsigned char outRot)
- {
- return outNum | ((outRot/2) << 8);
- }
- int main(int argc, char* argv[])
- {
- unsigned char outNum;
- unsigned char outRot;
- // Please change a number here!
- bool bCanBeRepresentedAsImmediate = GetARMImmediateNumberComponents(0x0003FC00, &outNum, &outRot);
- if(bCanBeRepresentedAsImmediate)
- {
- unsigned short int result = GetARMImmediateNumberRepresentation(outNum, outRot);
- printf("Equation: 0x%X ROR %d Value: %02X", outNum, outRot, result);
- }
- else
- printf("This value can't be represented as ARM immediate.\n");
- getchar();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement