|
|
1.1 root 1: /*
2: * The unassembler; this routine converts
3: * the internal form of a machine instruction into
4: * an intermediate form printable by cc3. The output can
5: * be made to look a lot like any assembler format by rewriting cc3.
6: * This is the new VAX base, including
7: * all edits up to revision 48.
8: */
9: #ifdef vax
10: #include "INC$LIB:cc2.h"
11: #else
12: #include "cc2.h"
13: #endif
14:
15: unassemble(ip1)
16: register INS *ip1;
17: {
18: register INS *ip2;
19: register int rel;
20: register int i, lab;
21: register int nlf;
22: register int opflag;
23:
24: switch (ip1->i_type) {
25:
26: case LLLINK:
27: genone(ZWORD, A_LID|A_DIR, ip1->i_labno);
28: break;
29:
30: case ENTER:
31: genseg(ip1->i_seg);
32: break;
33:
34: case ALIGN:
35: bput(ALIGN); bput(0);
36: break;
37:
38: case BLOCK:
39: bput(BLOCK); zput(ip1->i_len);
40: break;
41:
42: case LLABEL:
43: bput(LLABEL); iput(ip1->i_labno);
44: break;
45:
46: case JUMP:
47: if ((rel=ip1->i_rel) == ZJMP) {
48: genone(ZJMP, A_LID|A_DIR, ip1->i_labno);
49: break;
50: }
51: if (ip1->i_long != 0) {
52: nlf = 0;
53: ip2 = ip1->i_fp;
54: if (ip2!=NULL && ip2!=&ins && ip2->i_type==LLABEL)
55: lab = ip2->i_labno;
56: else {
57: lab = newlab();
58: ++nlf;
59: }
60: genone(revrel(rel), A_LID|A_DIR, lab);
61: genone(ZJMP, A_LID|A_DIR, ip1->i_labno);
62: if (nlf != 0)
63: bput(LLABEL), iput(lab);
64: break;
65: }
66: genone(rel, A_LID|A_DIR, ip1->i_labno);
67: break;
68:
69: case LINE:
70: bput(LINE), iput(ip1->i_line);
71: break;
72:
73: case CODE:
74: if (isvariant(VEMU87)) {
75: /*
76: * Under the VEMU87 emulation option, the assembler
77: * precedes 8087 opcodes with emulator calls.
78: */
79: i = opinfo[ip1->i_op].op_style;
80: if (is8087op(i))
81: genone(ZCALL, A_GID|A_DIR, "emu87");
82: }
83: bput(CODE); bput(ip1->i_op);
84: opflag = opinfo[ip1->i_op].op_flag;
85: for (i=0; i<ip1->i_naddr; ++i)
86: genfield(&ip1->i_af[i], opflag);
87: break;
88: }
89: }
90:
91: static short revtab[] = {
92: ZJBE,
93: ZJB,
94: ZJAE,
95: ZJA,
96: -1,
97: ZJNE,
98: ZJLE,
99: ZJL,
100: ZJGE,
101: ZJG,
102: -1,
103: ZJE,
104: ZJO,
105: ZJS,
106: ZJNO,
107: ZJPO,
108: ZJPE,
109: ZJNS
110: };
111:
112: revrel(rel)
113: register rel;
114: {
115: if (rel<ZJA || rel>ZJS || (rel=revtab[rel-ZJA])<0)
116: cbotch("bad rev");
117: return (rel);
118: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.