📄 dis_sh.c
字号:
/* dissh2.c: * * General notice: * This code is part of a boot-monitor package developed as a generic base * platform for embedded system designs. As such, it is likely to be * distributed to various projects beyond the control of the original * author. Please notify the author of any enhancements made or bugs found * so that all may benefit from the changes. In addition, notification back * to the author will allow the new user to pick up changes that may have * been made by other users after this version of the code was distributed. * * Note1: the majority of this code was edited with 4-space tabs. * Note2: as more and more contributions are accepted, the term "author" * is becoming a mis-representation of credit. * * Original author: Ed Sutter * Email: esutter@lucent.com * Phone: 908-582-2351 */#include "config.h"#if INCLUDE_DISASSEMBLER#include "genlib.h"typedef unsigned long ulong;typedef unsigned short ushort;typedef unsigned char uchar;extern getreg();int inst0000(), inst0001(), inst0010(), inst0011();int inst0100(), inst0101(), inst0110(), inst0111();int inst1000(), inst1001(), inst1010(), inst1011();int inst1100(), inst1101(), inst1110(), inst1111();int (*functbl[])() = { inst0000, inst0001, inst0010, inst0011, inst0100, inst0101, inst0110, inst0111, inst1000, inst1001, inst1010, inst1011, inst1100, inst1101, inst1110, inst1111,};char *DisHelp[] = { "Disassemble memory", "-[m] {address | .} [lines]", " -m interactive (-more-)", 0,};static ushort *loc;intDis(argc,argv)int argc;char *argv[];{ void disass(ushort *,int,int); int lines, opt, more; ushort *at; more = 0; while ((opt=getopt(argc,argv,"m")) != -1) { switch(opt) { case 'm': more = 1; break; default: return(0); } } if (*argv[optind] == '.') getreg("PC",&at); else at = (ushort *)strtoul(argv[optind],0,0); if (argc == (optind+2)) lines = strtoul(argv[optind+1],0,0); else lines = 8; while(1) { disass((ushort *)at,lines,0); if (more && More()) at = loc; else break; } return(0);}voiddisass(ushort *inst, int lines, int next){ while (lines) { if (next) printf("Nxt inst: %04x ",*inst); else printf("%08lx: %04x ",(ulong)inst,*inst); if (functbl[(*inst & 0xf000) >> 12](inst) == -1) printf("???\n"); lines--; inst++; } loc = inst;}intinst0000(ushort *inst){ int rs8, rs4; rs8 = (*inst & 0x0f00) >> 8; rs4 = (*inst & 0x00f0) >> 4; if (*inst == 0x0008) printf("clrt\n"); else if (*inst == 0x0009) printf("nop\n"); else if (*inst == 0x000b) printf("rts\n"); else if (*inst == 0x0018) printf("sett\n"); else if (*inst == 0x0019) printf("div0u\n"); else if (*inst == 0x001b) printf("sleep\n"); else if (*inst == 0x0028) printf("clrmac\n"); else if (*inst == 0x002b) printf("rte\n"); else if ((*inst & 0x00ff) == 0x0002) printf("stc\tsr,r%d\n", rs8); else if ((*inst & 0x00ff) == 0x0003) printf("bsrf\tr%d\n", rs8); else if ((*inst & 0x000f) == 0x0004) printf("mov.b\tr%d,@(r0,r%d)\n", rs4,rs8); else if ((*inst & 0x000f) == 0x0005) printf("mov.w\tr%d,@(r0,r%d)\n", rs4,rs8); else if ((*inst & 0x000f) == 0x0006) printf("mov.l\tr%d,@(r0,r%d)\n", rs4,rs8); else if ((*inst & 0x000f) == 0x0007) printf("mul.l\tr%d,r%d\n", rs4,rs8); else if ((*inst & 0x00ff) == 0x000a) printf("sts\tmach,r%d\n", rs8); else if ((*inst & 0x000f) == 0x000c) printf("mov.b\t@(r0,r%d),@r%d\n", rs4,rs8); else if ((*inst & 0x000f) == 0x000d) printf("mov.w\t@(r0,r%d),r%d\n", rs4,rs8); else if ((*inst & 0x000f) == 0x000e) printf("mov.l\t@(r0,r%d),r%d\n", rs4,rs8); else if ((*inst & 0x000f) == 0x000f) printf("mac.l\t@r%d+,@r%d+\n", rs4,rs8); else if ((*inst & 0x00ff) == 0x0012) printf("stc\tgbr,r%d\n", rs8); else if ((*inst & 0x00ff) == 0x001a) printf("sts\tmacl,r%d\n", rs8); else if ((*inst & 0x00ff) == 0x0022) printf("stc\tvbr,r%d\n", rs8); else if ((*inst & 0x00ff) == 0x0023) printf("braf\tr%d\n", rs8); else if ((*inst & 0x00ff) == 0x0029) printf("movt\tr%d\n", rs8); else if ((*inst & 0x00ff) == 0x002a) printf("sts\tpr,r%d\n", rs8); else return(-1); return(0);}intinst0001(ushort *inst){ printf("mov.l\tr%d,@(0x%x,r%d)\n", (*inst & 0x00f0) >> 4,(*inst & 0x00f) * 4,(*inst & 0x0f00) >> 8); return(0);}char *mnemfmt0010[] = { "mov.b\tr%d,@r%d\n", "mov.w\tr%d,@r%d\n", "mov.l\tr%d,@r%d\n", 0, "mov.b\tr%d,@-r%d\n", "mov.w\tr%d,@-r%d\n", "mov.l\tr%d,@-r%d\n", "div0s\tr%d,r%d\n", "tst\tr%d,r%d\n", "and\tr%d,r%d\n", "xor\tr%d,r%d\n", "or\tr%d,r%d\n", "cmp/str\tr%d,r%d\n", "xtrct\tr%d,r%d\n", "mulu.w\tr%d,r%d\n", "muls.w\tr%d,r%d\n",};intinst0010(ushort *inst){ char *fmt; fmt = mnemfmt0010[*inst & 0x000f]; if (!fmt) return(-1); printf(fmt,(*inst & 0x00f0) >> 4,(*inst & 0x0f00) >> 8); return(0);}char *mnemfmt0011[] = { "cmp/eq\tr%d,r%d\n", 0, "cmp/hs\tr%d,r%d\n", "cmp/ge\tr%d,r%d\n", "div1\tr%d,r%d\n", "dmulu.l\tr%d,r%d\n", "cmp/hi\tr%d,r%d\n", "cmp/gt\tr%d,r%d\n", "sub\tr%d,r%d\n", 0, "subc\tr%d,r%d\n", "subv\tr%d,r%d\n", "add\tr%d,r%d\n", "dmuls.l\tr%d,r%d\n", "addc\tr%d,r%d\n", "addv\tr%d,r%d\n",};intinst0011(ushort *inst){ char *fmt; fmt = mnemfmt0011[*inst & 0x000f]; if (!fmt) return(-1); printf(fmt,(*inst & 0x00f0) >> 4,(*inst & 0x0f00) >> 8); return(0);}char *mnemfmt0100[] = { "shll\tr%d\n", "shlr\tr%d\n", "sts.l\tmach,@-r%d\n", "stc.l\tsr,@-r%d\n", "rotl\tr%d\n", "rotr\tr%d\n", "lds\t@r%d+,mach\n", "ldc.l\t@r%d+,sr\n", "shll2\tr%d\n", "shlr2\tr%d\n", "lds\tr%d,mach\n", "jsr\t@r%d\n", 0, 0, "ldc\t@r%d,sr\n", 0, "dt\tr%d\n", "cmp/pz\tr%d\n", "sts.l\tmacl,@-r%d\n", "stc.l\tgbr,@-r%d\n", 0, "cmp/pl\tr%d\n", "lds\t@r%d+,macl\n", "ldc.l\t@r%d+,gbr\n", "shll8\tr%d\n", "shlr8\tr%d\n", "lds\tr%d,macl\n", "tas.b\t@r%d\n", 0, 0, "ldc\t@r%d,gbr\n", 0, "shal\tr%d\n", "shar\tr%d\n", "sts.l\tpr,@-r%d\n", "stc.l\tvbr,@-r%d\n", "rotcl\tr%d\n", "rotcr\tr%d\n", "lds\t@r%d+,pr\n", "ldc.l\t@r%d+,vbr\n", "shll16\tr%d\n", "shlr16\tr%d\n", "lds\tr%d,pr\n", "jmp\t@r%d\n", 0, 0, "ldc\t@r%d,vbr\n",};intinst0100(ushort *inst){ char *fmt; if ((*inst & 0x000ff) == 0x000f) { printf("mac.w\t@r%d+,@r%d+\n", (*inst & 0x00f0) >> 4,(*inst & 0x0f00) >> 8); return(0); } fmt = mnemfmt0100[*inst & 0x00ff]; if (!fmt) return(-1); printf(fmt,(*inst & 0x0f00) >> 8); return(0);}intinst0101(ushort *inst){ printf("mov.l\t@(0x%x,r%d),r%d\n", ((*inst & 0x000f)*4),((*inst & 0x00f0) >> 4),(*inst & 0x0f00) >> 8); return(0);}char *mnemfmt0110[] = { "mov.b\t@r%d,r%d\n", "mov.w\t@r%d,r%d\n", "mov.l\t@r%d,r%d\n", "mov\tr%d,r%d\n", "mov.b\t@r%d+,r%d\n", "mov.w\t@r%d+,r%d\n", "mov.l\t@r%d+,r%d\n", "not\tr%d,r%d\n", "swap.b\tr%d,r%d\n", "swap.w\tr%d,r%d\n", "negc\tr%d,r%d\n", "neg\tr%d,r%d\n", "extu.b\tr%d,r%d\n", "extu.w\tr%d,r%d\n", "exts.b\tr%d,r%d\n", "exts.w\tr%d,r%d\n",};intinst0110(ushort *inst){ char *fmt; fmt = mnemfmt0110[*inst & 0x000f]; printf(fmt,(*inst & 0x00f0) >> 4,(*inst & 0x0f00) >> 8); return(0);}intinst0111(ushort *inst){ printf("add\t#0x%02x,r%d\n",(*inst & 0x00ff),(*inst & 0x0f00) >> 8); return(0);}intinst1000(ushort *inst){ unsigned long rs4, label, disp; rs4 = (*inst & 0x00f0) >> 4; label = (ulong)(inst + ((*inst & 0x00ff) * 2)); disp = *inst & 0x000f; if ((*inst & 0x0f00) == 0x0000) printf("mov.b\tr0,@(0x%lx,r%ld)\n", disp,rs4); else if ((*inst & 0x0f00) == 0x0100) printf("mov.w\tr0,@(0x%lx,r%ld)\n", (disp * 2),rs4); else if ((*inst & 0x0f00) == 0x0400) printf("mov.b\t@(0x%lx,r%ld),r0\n", disp,rs4); else if ((*inst & 0x0f00) == 0x0500) printf("mov.w\t@(0x%lx,r%ld),r0\n", (disp * 2),rs4); else if ((*inst & 0x0f00) == 0x0800) printf("cmp/eq\t#0x%02x,r0\n", (*inst & 0x00ff)); else if ((*inst & 0x0f00) == 0x0900) printf("bt\t0x%08lx\n", label); else if ((*inst & 0x0f00) == 0x0b00) printf("bf\t0x%08lx\n", label); else if ((*inst & 0x0f00) == 0x0d00) printf("bt/s\t0x%08lx\n", label); else if ((*inst & 0x0f00) == 0x0f00) printf("bf/s\t0x%08lx\n", label); else return(-1); return(0);}intinst1001(ushort *inst){ int disp, rs8; disp = (*inst & 0x00ff); rs8 = (*inst & 0x0f00) >> 8; printf("mov.w\t@(0x%x,pc),r%d (0x%04x -> r%d)\n", disp*2,rs8,*(ushort *)(inst+disp+2),rs8); return(0);}intinst1010(ushort *inst){ printf("bra\t0x%08x\n",(int)inst + ((*inst & 0x0fff) * 2) + 4); return(0);}intinst1011(ushort *inst){ printf("bsr\t0x%08x\n",(int)inst + ((*inst & 0x0fff) * 2)); return(0);}intinst1100(ushort *inst){ int disp; disp = *inst & 0x00ff; if ((*inst & 0x0f00) == 0x0000) printf("mov.b\tr0,@(0x%x,gbr)\n", disp); else if ((*inst & 0x0f00) == 0x0100) printf("mov.w\tr0,@(0x%x,gbr)\n", disp*2); else if ((*inst & 0x0f00) == 0x0200) printf("mov.l\tr0,@(0x%x,gbr)\n", disp*4); else if ((*inst & 0x0f00) == 0x0300) printf("trapa\t#0x%x\n", disp); else if ((*inst & 0x0f00) == 0x0400) printf("mov.b\t@(0x%x,gbr),r0\n", disp); else if ((*inst & 0x0f00) == 0x0500) printf("mov.w\t@(0x%x,gbr),r0\n", disp*2); else if ((*inst & 0x0f00) == 0x0600) printf("mov.l\t@(0x%x,gbr),r0\n", disp*4); else if ((*inst & 0x0f00) == 0x0700) printf("mova\t@(0x%x,pc),r0\n", disp*4); else if ((*inst & 0x0f00) == 0x0800) printf("tst\t#0x%x,r0\n", disp); else if ((*inst & 0x0f00) == 0x0900) printf("and\t#0x%02x,r0\n", disp); else if ((*inst & 0x0f00) == 0x0a00) printf("xor\t#0x%x,r0\n", disp); else if ((*inst & 0x0f00) == 0x0b00) printf("or\t#0x%x,r0\n", disp); else if ((*inst & 0x0f00) == 0x0c00) printf("tst.b\t#0x%x,@(r0,gbr)\n", disp); else if ((*inst & 0x0f00) == 0x0d00) printf("and.b\t#0x%02x,@(r0,gbr)\n",disp); else if ((*inst & 0x0f00) == 0x0e00) printf("xor.b\t#0x%x,@(r0,gbr)\n", disp); else if ((*inst & 0x0f00) == 0x0f00) printf("or.b\t#0x%x,@(r0,gbr)\n", disp); else return(-1); return(0);}intinst1101(ushort *inst){ int disp, rs8; disp = *inst & 0x00ff; rs8 = (*inst & 0x0f00) >> 8; printf("mov.l\t@(0x%x,pc),r%d (0x%08lx -> r%d)\n", disp*4,rs8, *(ulong *)((((int)inst&~3)+4)+(disp*4)), rs8); return(0);}intginst1101(ushort *inst){ printf("mov.l\t@(0x%x,pc),r%d (0x%08lx -> r%d)\n", ((*inst & 0x00ff)*4),(*inst & 0x0f00) >> 8, *(long *)(inst+((*inst & 0x00ff)*2)+2), (*inst & 0x0f00) >> 8); return(0);}intinst1110(ushort *inst){ printf("mov\t#0x%x,r%d\n",(*inst & 0x00ff),((*inst & 0x0f00) >> 8)); return(0);}intinst1111(ushort *inst){ return(-1);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -