radare2/shlr/rar/dis.c

99 lines
2.0 KiB
C

/* disassemble */
static int disassemble_arg(Bitbuf *b, int n) {
int res = 0;
// [ 1, 2; 0,1; reg,3
// [ 1, 2; 1,1; 1,1; 3,2; imm,32
// [+- 1, 2; 1,1; 0,1; reg,3; 3,2; imm,32
// # 0, 2; 3,3; imm,32
// r 1, 1; 3
int ret = bitget (b, n);
//eprintf ("arg %d\n", n);
res ++;
if (ret ==-1) {
eprintf ("IO ERROR\n");
return 0;
}
//printf ("RET [%d] = %d (of %d)\n", n, ret, b->bits);
if (ret==1) {
/* opnum >7 && <0x27 */
int num = bitnum (b, n+res, 3);
res += 3;
printf ("r%d", num);
} else {
int type, num;
int opt = bitget (b, n+res);
res ++;
if (!opt) {
// imm32
type = bitnum (b, n+res, 2);
res += 2;
// if
if (type != 3) {
eprintf ("unsupported number type size %d\n", type);
}
num = bitnum (b, n+res, 32);
res += 32;
printf ("0x%x", num);
} else {
// reg+imm
int num = bitnum (b, n+res, 3);
res += 3;
printf ("[r%d+", num);
num = bitnum (b, n+res, 32);
res += 32;
printf ("0x%x]", num);
}
}
return res;
}
int rarvm_disassemble(Bitbuf *b, char *str) {
int n = 0;
*str = 0;
if (bitget (b, n++)) {
int opnum = bitnum (b, n, 5)+8;
int flags = opcodes[opnum].flags;
const char *opstr = opcode_str (opnum);
n += 5;
printf ("PATRANYA %d\n", opnum);
if (opstr) {
printf ("%s", opstr);
} else return 0;
// XXX DUP
if (opcodes[opnum].flags & 1) {
printf (" ");
n += disassemble_arg (b, n);
}
if (opcodes[opnum].flags & 2) {
printf (", ");
n += disassemble_arg (b, n);
}
} else {
/* opnum >= 0 && <= 7 */
int opnum = bitnum (b, n, 3);
const char *opstr = opcode_str (opnum);
n+= 3;
if (opstr) {
int byte_mode = bitget (b, n++);
printf ("%s", opstr);
if (byte_mode) {
eprintf ("unsupported byte mode\n");
} else {
if (opcodes[opnum].flags & 1) {
printf (" ");
n += disassemble_arg (b, n);
}
if (opcodes[opnum].flags & 2) {
printf (", ");
n += disassemble_arg (b, n);
}
}
printf ("\n"); //%s (%d) n=%d\n", opstr, opnum, n);
}
}
return n;
}