int debug_reg(const char *arg) { if (arg[0]) { if (arg[0]=='?') { eprintf("Usage: !reg[io][2][*] [reg [=value]]\n"); eprintf(" !regio : see !regio?\n"); eprintf(" !reg : list registers\n"); eprintf(" !reg* : list registers as radare commands\n"); eprintf(" !reg2 : list extra registers\n"); eprintf(" !reg2 eax : get register value\n"); eprintf(" !reg2 eax=3 : set register value\n"); } else if (arg[0]=='2') { debug_registers(2); } else if ((arg[0]=='=') || (arg[0]=='s'&&arg[1]=='=')) { debug_register_list(); } else if ((arg[0]=='s' && arg[1]=='*') || arg[0] == '*') debug_registers(1); else { if (arg[0]=='s' || strnull(arg)) debug_registers(0); else { if (strchr(arg+1, '=')) debug_set_register(arg+1); else debug_get_register(arg+1); } } } else debug_registers(0); return 0; }
void cycle() { char op = 0; unsigned r0 = 0; unsigned r1 = 0; unsigned r2 = 0; unsigned im = 0; unsigned long long instr = fetch(); printf("%08x %016llx ", pc, instr); /* 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ instr. r0 r1 r2 immediate value */ op = (instr & 0xFF00000000000000) >> 56; r0 = (instr & 0x00FF000000000000) >> 48; r1 = (instr & 0x0000FF0000000000) >> 40; r2 = (instr & 0x000000FF00000000) >> 32; im = (instr & 0x00000000FFFFFFFF); switch(op) { case 0x0: // halt running = false; break; case 0x1: // nop break; case 0x2: // li r[r0] = im; break; case 0x3: // lw r[r0] = ram[r[r1]]; break; case 0x4: // sw ram[r[r1]] = r[r0]; break; case 0x5: // add r[r0] = r[r1] + r[r2]; break; case 0x6: // sub r[r0] = r[r1] - r[r2]; break; case 0x7: // mult r[r0] = r[r1] * r[r2]; break; case 0x8: // div r[r0] = r[r1] / r[r2]; break; case 0x9: // j pc = im; break; case 0xA: // jr pc = r[r0]; break; case 0xB: // beq if(r[r0] == r[r1]) pc = r[r2]; break; case 0xC: // bne if(r[r0] != r[r1]) pc = r[r2]; break; case 0xD: // inc r[r0]++; break; case 0xE: // dec r[r0]--; break; } debug_registers(); }