📄 dis_ppc.c
字号:
cp = (uchar *)&instr; printf("data %02x%02x%02x%02x\n",cp[0],cp[1],cp[2],cp[3]); return(0);}intopcode03(ulong instr){ printf("twi %x,%s,0x%04X\n",to(instr),ra(instr),(ushort)(instr&IM)); return(0);}intopcode07(ulong instr){ return(rt_ra_x("mulli",instr));}intopcode08(ulong instr){ return(rt_ra_x("subfic",instr));}intopcode10(ulong instr){ return(bf_ra("cmpli",instr));}intopcode11(ulong instr){ return(bf_ra("cmpi",instr));}intopcode12(ulong instr){ return(rt_ra_x("addic",instr));}intopcode13(ulong instr){ return(rt_ra_x("addic.",instr));}intopcode14(ulong instr){ return(rt_ra_x("addi",instr));}intopcode15(ulong instr){ return(rt_ra_x("addis",instr));}intopcode16(ulong instr){ ulong mask; if (instr & BD_NEGATIVE) mask = 0xffff0000; else mask = 0; switch((instr & BO) >> 21) { case 16: prnem(tbl17[aalk(instr)]); printf("0x%lx\n", (instr & BD) | mask); return(0); case 0: prnem(tbl18[aalk(instr)]); printf("%s,0x%lx\n", bi(instr), (instr & BD) | mask); return(0); case 8: prnem(tbl19[aalk(instr)]); printf("%s,0x%lx\n", bi(instr), (instr & BD) | mask); return(0); case 18: prnem(tbl20[aalk(instr)]); printf("0x%lx\n", (instr & BD) | mask); return(0); case 2: prnem(tbl21[aalk(instr)]); printf("%s,0x%lx\n", bi(instr), (instr & BD) | mask); return(0); case 10: prnem(tbl22[aalk(instr)]); printf("%s,0x%lx\n", bi(instr), (instr & BD) | mask); return(0); } prnem(tbl7[aalk(instr)]); printf("%ld,%ld,0x%lx\n", ((instr & BO) >> 21),((instr & BI) >> 16), (instr & BD) | mask); return(0);}intopcode17(ulong instr){ if (instr & 0x2) printf("sc\n"); else return(-1); return(0);}intopcode18(ulong instr){ ulong mask, delta, dest, offset; char func[32]; if (instr & LI_NEGATIVE) mask = 0xfe000000; else mask = 0; prnem(tbl6[aalk(instr)]); delta = (instr & LI) | mask; dest = (ulong)DisAddr + delta;#if INCLUDE_TFSSYMTBL if (AddrToSym(-1,dest,func,&offset)) { printf("0x%lx (%s",delta,func); if (offset) printf(": 0x%lx",dest); printf(")\n"); } else#endif printf("0x%lx (addr=0x%lx)\n",delta,dest); return(0);}intopcode19(ulong instr){ if (instr == ISYNC) { printf("isync\n"); return(0); } switch(xo_oe(instr)) { case 0: prnem("mcrf"); printf("%s,%s\n",bf(instr),bfa(instr)); break; case 16: if ((instr & (BO_0 | BO_2)) != (BO_0 | BO_2)) { if (instr & LK) prnem("bclrl"); else prnem("bclr"); } else { if (instr & LK) prnem("blrl"); else prnem("blr"); } if ((instr & (BO_0 | BO_2)) != (BO_0 | BO_2)) printf("%s,%s",bo(instr),bi(instr)); printf("\n"); return(0); case 33: return(bt_ba_bb("crnor",instr)); case 50: printf("rfi\n"); return(0); case 51: printf("rfci\n"); return(0); case 129: return(bt_ba_bb("crandc",instr)); case 193: return(bt_ba_bb("crxor",instr)); case 225: return(bt_ba_bb("crnand",instr)); case 257: return(bt_ba_bb("crand",instr)); case 289: return(bt_ba_bb("creqv",instr)); case 417: return(bt_ba_bb("crorc",instr)); case 449: return(bt_ba_bb("cror",instr)); case 528: if ((instr & (BO_0 | BO_2)) != (BO_0 | BO_2)) prnem("bcctr"); else prnem("bctr"); if (instr & LK) printf("l"); if ((instr & (BO_0 | BO_2)) != (BO_0 | BO_2)) printf("%s,%s",bo(instr),bi(instr)); printf("\n"); return(0); } return(-1);}intopcode20(ulong instr){ return(ra_rs_sh_mb_me("rlwimi",instr));}intopcode21(ulong instr){ return(ra_rs_sh_mb_me("rlwinm",instr));}intopcode23(ulong instr){ prnemdot("rlwnm",instr & RC); printf("%s,%s,%s,0x%04X,0x%04X\n", ra(instr),rs(instr),rb(instr),mb(instr),me(instr)); return(0);}intopcode24(ulong instr){ prnem("ori"); printf("%s,%s,0x%04X%s", ra(instr),rs(instr),(ushort)(instr&IM), instr==0x60000000 ? " (nop)\n" : "\n"); return(0);}intopcode25(ulong instr){ return(ra_rs("oris",instr));}intopcode26(ulong instr){ return(ra_rs("xori",instr));}intopcode27(ulong instr){ return(ra_rs("xoris",instr));}intopcode28(ulong instr){ return(ra_rs("addi.",instr));}intopcode29(ulong instr){ return(ra_rs("addis.",instr));}intopcode31(ulong instr){ if (instr == SYNC) { printf("sync\n"); return(0); } switch(xo_oe(instr)) { case 8: return(rt_ra_rb(tbl13[oerc(instr)],instr)); case 10: return(rt_ra_rb(tbl2[oerc(instr)],instr)); case 20: return(rt_ra_rb("lwarx",instr)); case 23: return(rt_ra_rb("lwzx",instr)); case 40: return(rt_ra_rb(tbl12[oerc(instr)],instr)); case 55: return(rt_ra_rb("lwzux",instr)); case 87: return(rt_ra_rb("lbzx",instr)); case 104: return(rt_ra(tbl11[oerc(instr)],instr)); case 119: return(rt_ra_rb("lbzux",instr)); case 136: return(rt_ra_rb(tbl14[oerc(instr)],instr)); case 138: return(rt_ra_rb(tbl3[oerc(instr)],instr)); case 151: return(rs_ra_rb("stwx",instr)); case 183: return(rs_ra_rb("stwux",instr)); case 200: return(rt_ra(tbl16[oerc(instr)],instr)); case 202: return(rt_ra(tbl5[oerc(instr)],instr)); case 215: return(rs_ra_rb("stbx",instr)); case 232: return(rt_ra(tbl15[oerc(instr)],instr)); case 234: return(rt_ra(tbl4[oerc(instr)],instr)); case 235: return(rt_ra_rb(tbl10[oerc(instr)],instr)); case 266: return(rt_ra_rb(tbl1[oerc(instr)],instr)); case 279: return(rt_ra_rb("lhzx",instr)); case 311: return(rt_ra_rb("lhzux",instr)); case 459: return(rt_ra_rb(tbl9[oerc(instr)],instr)); case 491: return(rt_ra_rb(tbl8[oerc(instr)],instr)); case 534: return(rt_ra_rb("lwbrx",instr)); case 662: return(rs_ra_rb("stwbrx",instr)); case 512: prnem("mcrxr"); printf("%s\n",bf(instr)); return(0); case 533: return(rt_ra_rb("lswx",instr)); case 536: prnemdot("srw",instr & RC); printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr)); return(0); case 597: prnem("lswi"); printf("%s,%s,0x%04X\n",rt(instr),ra(instr),nb(instr)); return(0); case 661: return(rs_ra_rb("stswx",instr)); case 725: prnem("stswi"); printf("%s,%s,0x%04X\n",rs(instr),ra(instr),nb(instr)); return(0); case 790: return(rt_ra_rb("lhbrx",instr)); case 792: prnemdot("sraw",instr & RC); printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr)); return(0); case 824: prnemdot("srawi",instr & RC); printf("%s,%s,0x%04X\n", ra(instr),rs(instr),sh(instr)); return(0); case 854: printf("eieio\n"); /* yep, that's really an instruction */ return(0); case 918: return(rs_ra_rb("sthbrx",instr)); case 922: prnemdot("extsh",instr & RC); printf("%s,%s,%s\n", rs(instr),ra(instr),rb(instr)); return(0); case 954: prnemdot("extsb",instr & RC); printf("%s,%s,%s\n", rs(instr),ra(instr),rb(instr)); return(0); case 966: return(ra_rb("icci",instr)); case 982: return(ra_rb("icbi",instr)); case 998: return(ra_rb("icread",instr)); case 1014: return(ra_rb("dcbz",instr)); } switch(xo_nooe(instr)) { case 0: prnem("cmp"); printf("%s,0,%s,%s\n",bf(instr),ra(instr),rb(instr)); return(0); case 4: prnem("tw"); printf("0x%04X,%s,%s\n",to(instr),ra(instr),rb(instr)); return(0); case 11: prnemdot("mulhwu",instr & RC); printf("%s,%s,%s\n", rt(instr),ra(instr),rb(instr)); return(0); case 19: prnem("mfcr"); printf("%s\n",rt(instr)); return(0); case 24: prnemdot("slw",instr & RC); printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr)); return(0); case 26: prnemdot("cntizw",instr & RC); printf("%s,0,%s,%s\n", rs(instr),ra(instr),rb(instr)); return(0); case 28: prnemdot("andc",instr & RC); printf("%s,%s,%s\n", rs(instr),ra(instr),rb(instr)); return(0); case 32: prnem("cmpl"); printf("%s,0,%s,%s\n",bf(instr),ra(instr),rb(instr)); return(0); case 54: prnem("dcbst"); printf("%s,%s\n",ra(instr),rb(instr)); return(0); case 60: prnemdot("and",instr & RC); printf("%s,%s,%s\n", rs(instr),ra(instr),rb(instr)); return(0); case 75: prnemdot("mulhw",instr & RC); printf("%s,%s,%s\n", rt(instr),ra(instr),rb(instr)); return(0); case 83: prnem("mfmsr"); printf("%s\n",rt(instr)); return(0); case 86: prnem("dcbf"); printf("%s,%s\n",ra(instr),rb(instr)); return(0); case 124: prnemdot("nor",instr & RC); printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr)); return(0); case 131: prnem("wrtee"); printf("%s\n",rs(instr)); return(0); case 144: prnem("mtcrf"); printf("0x%x,%s\n",fxm(instr),rs(instr)); return(0); case 146: prnem("mtmsr"); printf("%s\n",rs(instr)); return(0); case 150: if (instr & 1) return(rs_ra_rb("stwcx.",instr)); else return(-1); case 163: prnem("wrteei"); if (instr & 0x8000) printf("1\n"); else printf("0\n"); return(0); case 246: prnem("dcbtst"); printf("%s,%s\n",ra(instr),rb(instr)); return(0); case 247: prnem("stbux"); printf("%s,%s\n",rs(instr),ra(instr)); return(0); case 262: prnem("icbt"); printf("%s,%s\n",ra(instr),rb(instr)); return(0); case 278: prnem("dcbt"); printf("%s,%s\n",ra(instr),rb(instr)); return(0); case 284: prnemdot("eqv",instr & RC); printf("%s,%s,%s\n", rs(instr),ra(instr),rb(instr)); return(0); case 316: prnemdot("xor",instr & RC); printf("%s,%s,%s\n", rs(instr),ra(instr),rb(instr)); return(0); case 323:#if USE_SPRDCR_NAMES printf("mf%s %s\n",dcrn(instr),rt(instr));#else prnem("mfdcr"); printf("%s,%s\n",dcrn(instr),rt(instr));#endif return(0); case 339:#if USE_SPRDCR_NAMES printf("mf%s,%s\n",sprf(instr),rt(instr));#else prnem("mfspr"); printf("%s,%s\n",sprf(instr),rt(instr));#endif return(0); case 343: prnem("lhax"); printf("%s,%s,%s\n",rt(instr),ra(instr),rb(instr)); return(0); case 370: prnem("tlbia"); printf("\n"); return(0); case 375: prnem("lhaux"); printf("%s,%s,%s\n",rt(instr),ra(instr),rb(instr)); return(0); case 407: return(rs_ra_rb("sthx",instr)); case 412: prnemdot("orc",instr & RC); printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr)); return(0); case 439: return(rs_ra_rb("sthux",instr)); case 444: prnemdot("or",instr & RC); printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr)); return(0); case 451:#if USE_SPRDCR_NAMES printf("mt%s %s\n",dcrn(instr),rs(instr));#else prnem("mtdcr"); printf("%s,%s\n",dcrn(instr),rs(instr));#endif return(0); case 454: prnem("dcci"); printf("%s,%s\n",ra(instr),rb(instr)); return(0); case 467:#if USE_SPRDCR_NAMES printf("mt%s,%s\n",sprf(instr),rs(instr));#else prnem("mtspr"); printf("%s,%s\n",sprf(instr),rs(instr));#endif return(0); case 470: prnem("dcbi"); printf("%s,%s\n",ra(instr),rb(instr)); return(0); case 476: prnemdot("nand",instr & RC); printf("%s,%s,%s\n", ra(instr),rs(instr),rb(instr)); return(0); case 486: return(rt_ra_rb("dcread",instr)); } printf("opcode31 error: 0x%02x%02x%02x%02x\n", ((uchar *)&instr)[0], ((uchar *)&instr)[1], ((uchar *)&instr)[2], ((uchar *)&instr)[3]); printf("xo_oe() = 0x%04X, xo_nooe() = 0x%04X\n", xo_oe(instr),xo_nooe(instr)); return(-1);}intopcode32(ulong instr){ return(rt_d_ra("lwz",instr));}intopcode33(ulong instr){ return(rt_d_ra("lwzu",instr));}intopcode34(ulong instr){ return(rt_d_ra("lbz",instr));}intopcode35(ulong instr){ return(rt_d_ra("lbzu",instr));}intopcode36(ulong instr){ return(rs_d_ra("stw",instr));}intopcode37(ulong instr){ return(rs_d_ra("stwu",instr));}intopcode38(ulong instr){ return(rt_d_ra("stb",instr));}intopcode39(ulong instr){ return(rt_d_ra("stbu",instr));}intopcode40(ulong instr){ return(rt_d_ra("lhz",instr));}intopcode41(ulong instr){ return(rt_d_ra("lhzu",instr));}intopcode42(ulong instr){ return(rt_d_ra("lha",instr));}intopcode43(ulong instr){ return(rt_d_ra("lhau",instr));}intopcode44(ulong instr){ return(rt_d_ra("sth",instr));}intopcode45(ulong instr){ return(rs_d_ra("sthu",instr));}intopcode46(ulong instr){ return(rt_d_ra("lmw",instr));}intopcode47(ulong instr){ return(rs_d_ra("stmw",instr));}#endif /* INCLUDE_DISASSEMBLER */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -