/* RAR-VM assembler/disassembler by pancake for radare with love */ /* this implementation is licensed under LGPLv3 - 2012 */ #include #include // XXX little endian only? /* helpers */ #define eprintf(x,y...) fprintf(stderr,x,##y) #define SKIPSPACES(x) if (x) while (*x==' '||*x=='\t') x++ static const char *skipspaces(const char *x) { SKIPSPACES(x); return x; } //static const char *regs = "r0\x00r1\x00r2\x00r3\x00r4\x00r5\x00r6\x00r7"; //static const char *getregi(int n) { return (n>=0&&n<=7)? regs+(3*n): "r?"; } static int getreg(const char *s) { if (s[0]=='r' && s[2]=='\0') { int n = s[1]-'0'; if (n<8) return n; } return -1; } // ugly global vars typedef struct { int bits; unsigned char *out; } Bitbuf; //static void clrbit(Bitbuf *bb) { memset (bb->out, 0, 1+(bb->bits/8)); } static int bitget(Bitbuf *bb, int bit) { if (bit>=bb->bits) return -1; return (bb->out[bit/8] & (1<<((bit%8))))? 1: 0; } static void bitadd(Bitbuf *bb, unsigned int v, int n) { int i, b, bit; for (i=0; ibits++) { b = (bb->bits+i)/8; bit = (bb->bits+i)%8; //printf ("[%d].%d = %d\n", b, bit, v& (1<<(n-i-1))); if (!bit) bb->out[b] = 0; //printf ("BIT (%d)\n", n-i-1); //if (v&(1<<(n-i-1))) bb->out[b] |= 1<out[b] |= 1<bits) for (i=0; i0) ret |= (1<bits) for (i=0; i0) ret |= (1<<(c-i-1)); return ret; } #endif static inline const char *opcode_str (int n) { if (n>=0 && n