| File: | obj-scan-build/../i386/i386/db_disasm.c |
| Location: | line 958, column 6 |
| Description: | Branch condition evaluates to a garbage value |
| 1 | /* | |||
| 2 | * Mach Operating System | |||
| 3 | * Copyright (c) 1994,1991,1990 Carnegie Mellon University | |||
| 4 | * All Rights Reserved. | |||
| 5 | * | |||
| 6 | * Permission to use, copy, modify and distribute this software and its | |||
| 7 | * documentation is hereby granted, provided that both the copyright | |||
| 8 | * notice and this permission notice appear in all copies of the | |||
| 9 | * software, derivative works or modified versions, and any portions | |||
| 10 | * thereof, and that both notices appear in supporting documentation. | |||
| 11 | * | |||
| 12 | * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" | |||
| 13 | * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR | |||
| 14 | * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. | |||
| 15 | * | |||
| 16 | * Carnegie Mellon requests users of this software to return to | |||
| 17 | * | |||
| 18 | * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU | |||
| 19 | * School of Computer Science | |||
| 20 | * Carnegie Mellon University | |||
| 21 | * Pittsburgh PA 15213-3890 | |||
| 22 | * | |||
| 23 | * any improvements or extensions that they make and grant Carnegie Mellon | |||
| 24 | * the rights to redistribute these changes. | |||
| 25 | */ | |||
| 26 | ||||
| 27 | #if MACH_KDB1 | |||
| 28 | ||||
| 29 | /* | |||
| 30 | * Instruction disassembler. | |||
| 31 | */ | |||
| 32 | #include <mach/boolean.h> | |||
| 33 | #include <machine/db_machdep.h> | |||
| 34 | ||||
| 35 | #include <ddb/db_access.h> | |||
| 36 | #include <ddb/db_output.h> | |||
| 37 | #include <ddb/db_sym.h> | |||
| 38 | ||||
| 39 | #include <kern/task.h> | |||
| 40 | ||||
| 41 | /* | |||
| 42 | * Switch to disassemble 16-bit code. | |||
| 43 | */ | |||
| 44 | boolean_t db_disasm_16 = FALSE((boolean_t) 0); | |||
| 45 | ||||
| 46 | /* | |||
| 47 | * Size attributes | |||
| 48 | */ | |||
| 49 | #define BYTE0 0 | |||
| 50 | #define WORD1 1 | |||
| 51 | #define LONG2 2 | |||
| 52 | #define QUAD3 3 | |||
| 53 | #define SNGL4 4 | |||
| 54 | #define DBLR5 5 | |||
| 55 | #define EXTR6 6 | |||
| 56 | #define SDEP7 7 | |||
| 57 | #define NONE8 8 | |||
| 58 | ||||
| 59 | /* | |||
| 60 | * Addressing modes | |||
| 61 | */ | |||
| 62 | #define E1 1 /* general effective address */ | |||
| 63 | #define Eind2 2 /* indirect address (jump, call) */ | |||
| 64 | #define El3 3 /* address, long size */ | |||
| 65 | #define Ew4 4 /* address, word size */ | |||
| 66 | #define Eb5 5 /* address, byte size */ | |||
| 67 | #define R6 6 /* register, in 'reg' field */ | |||
| 68 | #define Rw7 7 /* word register, in 'reg' field */ | |||
| 69 | #define Ri8 8 /* register in instruction */ | |||
| 70 | #define S9 9 /* segment reg, in 'reg' field */ | |||
| 71 | #define Si10 10 /* segment reg, in instruction */ | |||
| 72 | #define A11 11 /* accumulator */ | |||
| 73 | #define BX12 12 /* (bx) */ | |||
| 74 | #define CL13 13 /* cl, for shifts */ | |||
| 75 | #define DX14 14 /* dx, for IO */ | |||
| 76 | #define SI15 15 /* si */ | |||
| 77 | #define DI16 16 /* di */ | |||
| 78 | #define CR17 17 /* control register */ | |||
| 79 | #define DR18 18 /* debug register */ | |||
| 80 | #define TR19 19 /* test register */ | |||
| 81 | #define I20 20 /* immediate, unsigned */ | |||
| 82 | #define Is21 21 /* immediate, signed */ | |||
| 83 | #define Ib22 22 /* byte immediate, unsigned */ | |||
| 84 | #define Ibs23 23 /* byte immediate, signed */ | |||
| 85 | #define Iw24 24 /* word immediate, unsigned */ | |||
| 86 | #define Il25 25 /* long immediate */ | |||
| 87 | #define O26 26 /* direct address */ | |||
| 88 | #define Db27 27 /* byte displacement from EIP */ | |||
| 89 | #define Dl28 28 /* long displacement from EIP */ | |||
| 90 | #define o129 29 /* constant 1 */ | |||
| 91 | #define o330 30 /* constant 3 */ | |||
| 92 | #define OS31 31 /* immediate offset/segment */ | |||
| 93 | #define ST32 32 /* FP stack top */ | |||
| 94 | #define STI33 33 /* FP stack */ | |||
| 95 | #define X34 34 /* extended FP op */ | |||
| 96 | #define XA35 35 /* for 'fstcw %ax' */ | |||
| 97 | #define Iba36 36 /* byte immediate, don't print if 0xa */ | |||
| 98 | ||||
| 99 | struct inst { | |||
| 100 | char * i_name; /* name */ | |||
| 101 | short i_has_modrm; /* has regmodrm byte */ | |||
| 102 | short i_size; /* operand size */ | |||
| 103 | int i_mode; /* addressing modes */ | |||
| 104 | char * i_extra; /* pointer to extra opcode table */ | |||
| 105 | }; | |||
| 106 | ||||
| 107 | #define op1(x)(x) (x) | |||
| 108 | #define op2(x,y)((x)|((y)<<8)) ((x)|((y)<<8)) | |||
| 109 | #define op3(x,y,z)((x)|((y)<<8)|((z)<<16)) ((x)|((y)<<8)|((z)<<16)) | |||
| 110 | ||||
| 111 | struct finst { | |||
| 112 | char * f_name; /* name for memory instruction */ | |||
| 113 | int f_size; /* size for memory instruction */ | |||
| 114 | int f_rrmode; /* mode for rr instruction */ | |||
| 115 | char * f_rrname; /* name for rr instruction | |||
| 116 | (or pointer to table) */ | |||
| 117 | }; | |||
| 118 | ||||
| 119 | char * db_Grp6[] = { | |||
| 120 | "sldt", | |||
| 121 | "str", | |||
| 122 | "lldt", | |||
| 123 | "ltr", | |||
| 124 | "verr", | |||
| 125 | "verw", | |||
| 126 | "", | |||
| 127 | "" | |||
| 128 | }; | |||
| 129 | ||||
| 130 | char * db_Grp7[] = { | |||
| 131 | "sgdt", | |||
| 132 | "sidt", | |||
| 133 | "lgdt", | |||
| 134 | "lidt", | |||
| 135 | "smsw", | |||
| 136 | "", | |||
| 137 | "lmsw", | |||
| 138 | "invlpg" | |||
| 139 | }; | |||
| 140 | ||||
| 141 | char * db_Grp8[] = { | |||
| 142 | "", | |||
| 143 | "", | |||
| 144 | "", | |||
| 145 | "", | |||
| 146 | "bt", | |||
| 147 | "bts", | |||
| 148 | "btr", | |||
| 149 | "btc" | |||
| 150 | }; | |||
| 151 | ||||
| 152 | struct inst db_inst_0f0x[] = { | |||
| 153 | /*00*/ { "", TRUE((boolean_t) 1), NONE8, op1(Ew)(4), (char *)db_Grp6 }, | |||
| 154 | /*01*/ { "", TRUE((boolean_t) 1), NONE8, op1(Ew)(4), (char *)db_Grp7 }, | |||
| 155 | /*02*/ { "lar", TRUE((boolean_t) 1), LONG2, op2(E,R)((1)|((6)<<8)), 0 }, | |||
| 156 | /*03*/ { "lsl", TRUE((boolean_t) 1), LONG2, op2(E,R)((1)|((6)<<8)), 0 }, | |||
| 157 | /*04*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 158 | /*05*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 159 | /*06*/ { "clts", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 160 | /*07*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 161 | ||||
| 162 | /*08*/ { "invd", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 163 | /*09*/ { "wbinvd",FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 164 | /*0a*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 165 | /*0b*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 166 | /*0c*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 167 | /*0d*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 168 | /*0e*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 169 | /*0f*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 170 | }; | |||
| 171 | ||||
| 172 | struct inst db_inst_0f2x[] = { | |||
| 173 | /*20*/ { "mov", TRUE((boolean_t) 1), LONG2, op2(CR,El)((17)|((3)<<8)), 0 }, /* use El for reg */ | |||
| 174 | /*21*/ { "mov", TRUE((boolean_t) 1), LONG2, op2(DR,El)((18)|((3)<<8)), 0 }, /* since mod == 11 */ | |||
| 175 | /*22*/ { "mov", TRUE((boolean_t) 1), LONG2, op2(El,CR)((3)|((17)<<8)), 0 }, | |||
| 176 | /*23*/ { "mov", TRUE((boolean_t) 1), LONG2, op2(El,DR)((3)|((18)<<8)), 0 }, | |||
| 177 | /*24*/ { "mov", TRUE((boolean_t) 1), LONG2, op2(TR,El)((19)|((3)<<8)), 0 }, | |||
| 178 | /*25*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 179 | /*26*/ { "mov", TRUE((boolean_t) 1), LONG2, op2(El,TR)((3)|((19)<<8)), 0 }, | |||
| 180 | /*27*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 181 | ||||
| 182 | /*28*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 183 | /*29*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 184 | /*2a*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 185 | /*2b*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 186 | /*2c*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 187 | /*2d*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 188 | /*2e*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 189 | /*2f*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 190 | }; | |||
| 191 | ||||
| 192 | struct inst db_inst_0f8x[] = { | |||
| 193 | /*80*/ { "jo", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 194 | /*81*/ { "jno", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 195 | /*82*/ { "jb", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 196 | /*83*/ { "jnb", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 197 | /*84*/ { "jz", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 198 | /*85*/ { "jnz", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 199 | /*86*/ { "jbe", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 200 | /*87*/ { "jnbe", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 201 | ||||
| 202 | /*88*/ { "js", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 203 | /*89*/ { "jns", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 204 | /*8a*/ { "jp", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 205 | /*8b*/ { "jnp", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 206 | /*8c*/ { "jl", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 207 | /*8d*/ { "jnl", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 208 | /*8e*/ { "jle", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 209 | /*8f*/ { "jnle", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 210 | }; | |||
| 211 | ||||
| 212 | struct inst db_inst_0f9x[] = { | |||
| 213 | /*90*/ { "seto", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 214 | /*91*/ { "setno", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 215 | /*92*/ { "setb", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 216 | /*93*/ { "setnb", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 217 | /*94*/ { "setz", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 218 | /*95*/ { "setnz", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 219 | /*96*/ { "setbe", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 220 | /*97*/ { "setnbe",TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 221 | ||||
| 222 | /*98*/ { "sets", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 223 | /*99*/ { "setns", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 224 | /*9a*/ { "setp", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 225 | /*9b*/ { "setnp", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 226 | /*9c*/ { "setl", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 227 | /*9d*/ { "setnl", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 228 | /*9e*/ { "setle", TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 229 | /*9f*/ { "setnle",TRUE((boolean_t) 1), NONE8, op1(Eb)(5), 0 }, | |||
| 230 | }; | |||
| 231 | ||||
| 232 | struct inst db_inst_0fax[] = { | |||
| 233 | /*a0*/ { "push", FALSE((boolean_t) 0), NONE8, op1(Si)(10), 0 }, | |||
| 234 | /*a1*/ { "pop", FALSE((boolean_t) 0), NONE8, op1(Si)(10), 0 }, | |||
| 235 | /*a2*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 236 | /*a3*/ { "bt", TRUE((boolean_t) 1), LONG2, op2(R,E)((6)|((1)<<8)), 0 }, | |||
| 237 | /*a4*/ { "shld", TRUE((boolean_t) 1), LONG2, op3(Ib,E,R)((22)|((1)<<8)|((6)<<16)), 0 }, | |||
| 238 | /*a5*/ { "shld", TRUE((boolean_t) 1), LONG2, op3(CL,E,R)((13)|((1)<<8)|((6)<<16)), 0 }, | |||
| 239 | /*a6*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 240 | /*a7*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 241 | ||||
| 242 | /*a8*/ { "push", FALSE((boolean_t) 0), NONE8, op1(Si)(10), 0 }, | |||
| 243 | /*a9*/ { "pop", FALSE((boolean_t) 0), NONE8, op1(Si)(10), 0 }, | |||
| 244 | /*aa*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 245 | /*ab*/ { "bts", TRUE((boolean_t) 1), LONG2, op2(R,E)((6)|((1)<<8)), 0 }, | |||
| 246 | /*ac*/ { "shrd", TRUE((boolean_t) 1), LONG2, op3(Ib,E,R)((22)|((1)<<8)|((6)<<16)), 0 }, | |||
| 247 | /*ad*/ { "shrd", TRUE((boolean_t) 1), LONG2, op3(CL,E,R)((13)|((1)<<8)|((6)<<16)), 0 }, | |||
| 248 | /*a6*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 249 | /*a7*/ { "imul", TRUE((boolean_t) 1), LONG2, op2(E,R)((1)|((6)<<8)), 0 }, | |||
| 250 | }; | |||
| 251 | ||||
| 252 | struct inst db_inst_0fbx[] = { | |||
| 253 | /*b0*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 254 | /*b1*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 255 | /*b2*/ { "lss", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 256 | /*b3*/ { "btr", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 257 | /*b4*/ { "lfs", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 258 | /*b5*/ { "lgs", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 259 | /*b6*/ { "movzb", TRUE((boolean_t) 1), LONG2, op2(Eb,R)((5)|((6)<<8)), 0 }, | |||
| 260 | /*b7*/ { "movzw", TRUE((boolean_t) 1), LONG2, op2(Ew,R)((4)|((6)<<8)), 0 }, | |||
| 261 | ||||
| 262 | /*b8*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 263 | /*b9*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 264 | /*ba*/ { "", TRUE((boolean_t) 1), LONG2, op2(Ibs,E)((23)|((1)<<8)), (char *)db_Grp8 }, | |||
| 265 | /*bb*/ { "btc", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 266 | /*bc*/ { "bsf", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 267 | /*bd*/ { "bsr", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 268 | /*be*/ { "movsb", TRUE((boolean_t) 1), LONG2, op2(Eb,R)((5)|((6)<<8)), 0 }, | |||
| 269 | /*bf*/ { "movsw", TRUE((boolean_t) 1), LONG2, op2(Ew,R)((4)|((6)<<8)), 0 }, | |||
| 270 | }; | |||
| 271 | ||||
| 272 | struct inst db_inst_0fcx[] = { | |||
| 273 | /*c0*/ { "xadd", TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 274 | /*c1*/ { "xadd", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 275 | /*c2*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 276 | /*c3*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 277 | /*c4*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 278 | /*c5*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 279 | /*c6*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 280 | /*c7*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 281 | /*c8*/ { "bswap", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 282 | /*c9*/ { "bswap", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 283 | /*ca*/ { "bswap", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 284 | /*cb*/ { "bswap", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 285 | /*cc*/ { "bswap", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 286 | /*cd*/ { "bswap", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 287 | /*ce*/ { "bswap", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 288 | /*cf*/ { "bswap", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 289 | }; | |||
| 290 | ||||
| 291 | struct inst db_inst_0fdx[] = { | |||
| 292 | /*c0*/ { "cmpxchg",TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 293 | /*c1*/ { "cmpxchg",TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 294 | /*c2*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 295 | /*c3*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 296 | /*c4*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 297 | /*c5*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 298 | /*c6*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 299 | /*c7*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 300 | /*c8*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 301 | /*c9*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 302 | /*ca*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 303 | /*cb*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 304 | /*cc*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 305 | /*cd*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 306 | /*ce*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 307 | /*cf*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 308 | }; | |||
| 309 | ||||
| 310 | struct inst *db_inst_0f[] = { | |||
| 311 | db_inst_0f0x, | |||
| 312 | 0, | |||
| 313 | db_inst_0f2x, | |||
| 314 | 0, | |||
| 315 | 0, | |||
| 316 | 0, | |||
| 317 | 0, | |||
| 318 | 0, | |||
| 319 | db_inst_0f8x, | |||
| 320 | db_inst_0f9x, | |||
| 321 | db_inst_0fax, | |||
| 322 | db_inst_0fbx, | |||
| 323 | db_inst_0fcx, | |||
| 324 | db_inst_0fdx, | |||
| 325 | 0, | |||
| 326 | 0 | |||
| 327 | }; | |||
| 328 | ||||
| 329 | char * db_Esc92[] = { | |||
| 330 | "fnop", "", "", "", "", "", "", "" | |||
| 331 | }; | |||
| 332 | char * db_Esc93[] = { | |||
| 333 | "", "", "", "", "", "", "", "" | |||
| 334 | }; | |||
| 335 | char * db_Esc94[] = { | |||
| 336 | "fchs", "fabs", "", "", "ftst", "fxam", "", "" | |||
| 337 | }; | |||
| 338 | char * db_Esc95[] = { | |||
| 339 | "fld1", "fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","" | |||
| 340 | }; | |||
| 341 | char * db_Esc96[] = { | |||
| 342 | "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp", | |||
| 343 | "fincstp" | |||
| 344 | }; | |||
| 345 | char * db_Esc97[] = { | |||
| 346 | "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos" | |||
| 347 | }; | |||
| 348 | ||||
| 349 | char * db_Esca4[] = { | |||
| 350 | "", "fucompp","", "", "", "", "", "" | |||
| 351 | }; | |||
| 352 | ||||
| 353 | char * db_Escb4[] = { | |||
| 354 | "", "", "fnclex","fninit","", "", "", "" | |||
| 355 | }; | |||
| 356 | ||||
| 357 | char * db_Esce3[] = { | |||
| 358 | "", "fcompp","", "", "", "", "", "" | |||
| 359 | }; | |||
| 360 | ||||
| 361 | char * db_Escf4[] = { | |||
| 362 | "fnstsw","", "", "", "", "", "", "" | |||
| 363 | }; | |||
| 364 | ||||
| 365 | struct finst db_Esc8[] = { | |||
| 366 | /*0*/ { "fadd", SNGL4, op2(STI,ST)((33)|((32)<<8)), 0 }, | |||
| 367 | /*1*/ { "fmul", SNGL4, op2(STI,ST)((33)|((32)<<8)), 0 }, | |||
| 368 | /*2*/ { "fcom", SNGL4, op2(STI,ST)((33)|((32)<<8)), 0 }, | |||
| 369 | /*3*/ { "fcomp", SNGL4, op2(STI,ST)((33)|((32)<<8)), 0 }, | |||
| 370 | /*4*/ { "fsub", SNGL4, op2(STI,ST)((33)|((32)<<8)), 0 }, | |||
| 371 | /*5*/ { "fsubr", SNGL4, op2(STI,ST)((33)|((32)<<8)), 0 }, | |||
| 372 | /*6*/ { "fdiv", SNGL4, op2(STI,ST)((33)|((32)<<8)), 0 }, | |||
| 373 | /*7*/ { "fdivr", SNGL4, op2(STI,ST)((33)|((32)<<8)), 0 }, | |||
| 374 | }; | |||
| 375 | ||||
| 376 | struct finst db_Esc9[] = { | |||
| 377 | /*0*/ { "fld", SNGL4, op1(STI)(33), 0 }, | |||
| 378 | /*1*/ { "", NONE8, op1(STI)(33), "fxch" }, | |||
| 379 | /*2*/ { "fst", SNGL4, op1(X)(34), (char *)db_Esc92 }, | |||
| 380 | /*3*/ { "fstp", SNGL4, op1(X)(34), (char *)db_Esc93 }, | |||
| 381 | /*4*/ { "fldenv", NONE8, op1(X)(34), (char *)db_Esc94 }, | |||
| 382 | /*5*/ { "fldcw", NONE8, op1(X)(34), (char *)db_Esc95 }, | |||
| 383 | /*6*/ { "fnstenv",NONE8, op1(X)(34), (char *)db_Esc96 }, | |||
| 384 | /*7*/ { "fnstcw", NONE8, op1(X)(34), (char *)db_Esc97 }, | |||
| 385 | }; | |||
| 386 | ||||
| 387 | struct finst db_Esca[] = { | |||
| 388 | /*0*/ { "fiadd", WORD1, 0, 0 }, | |||
| 389 | /*1*/ { "fimul", WORD1, 0, 0 }, | |||
| 390 | /*2*/ { "ficom", WORD1, 0, 0 }, | |||
| 391 | /*3*/ { "ficomp", WORD1, 0, 0 }, | |||
| 392 | /*4*/ { "fisub", WORD1, op1(X)(34), (char *)db_Esca4 }, | |||
| 393 | /*5*/ { "fisubr", WORD1, 0, 0 }, | |||
| 394 | /*6*/ { "fidiv", WORD1, 0, 0 }, | |||
| 395 | /*7*/ { "fidivr", WORD1, 0, 0 } | |||
| 396 | }; | |||
| 397 | ||||
| 398 | struct finst db_Escb[] = { | |||
| 399 | /*0*/ { "fild", WORD1, 0, 0 }, | |||
| 400 | /*1*/ { "", NONE8, 0, 0 }, | |||
| 401 | /*2*/ { "fist", WORD1, 0, 0 }, | |||
| 402 | /*3*/ { "fistp", WORD1, 0, 0 }, | |||
| 403 | /*4*/ { "", WORD1, op1(X)(34), (char *)db_Escb4 }, | |||
| 404 | /*5*/ { "fld", EXTR6, 0, 0 }, | |||
| 405 | /*6*/ { "", WORD1, 0, 0 }, | |||
| 406 | /*7*/ { "fstp", EXTR6, 0, 0 }, | |||
| 407 | }; | |||
| 408 | ||||
| 409 | struct finst db_Escc[] = { | |||
| 410 | /*0*/ { "fadd", DBLR5, op2(ST,STI)((32)|((33)<<8)), 0 }, | |||
| 411 | /*1*/ { "fmul", DBLR5, op2(ST,STI)((32)|((33)<<8)), 0 }, | |||
| 412 | /*2*/ { "fcom", DBLR5, op2(ST,STI)((32)|((33)<<8)), 0 }, | |||
| 413 | /*3*/ { "fcomp", DBLR5, op2(ST,STI)((32)|((33)<<8)), 0 }, | |||
| 414 | /*4*/ { "fsub", DBLR5, op2(ST,STI)((32)|((33)<<8)), "fsubr" }, | |||
| 415 | /*5*/ { "fsubr", DBLR5, op2(ST,STI)((32)|((33)<<8)), "fsub" }, | |||
| 416 | /*6*/ { "fdiv", DBLR5, op2(ST,STI)((32)|((33)<<8)), "fdivr" }, | |||
| 417 | /*7*/ { "fdivr", DBLR5, op2(ST,STI)((32)|((33)<<8)), "fdiv" }, | |||
| 418 | }; | |||
| 419 | ||||
| 420 | struct finst db_Escd[] = { | |||
| 421 | /*0*/ { "fld", DBLR5, op1(STI)(33), "ffree" }, | |||
| 422 | /*1*/ { "", NONE8, 0, 0 }, | |||
| 423 | /*2*/ { "fst", DBLR5, op1(STI)(33), 0 }, | |||
| 424 | /*3*/ { "fstp", DBLR5, op1(STI)(33), 0 }, | |||
| 425 | /*4*/ { "frstor", NONE8, op1(STI)(33), "fucom" }, | |||
| 426 | /*5*/ { "", NONE8, op1(STI)(33), "fucomp" }, | |||
| 427 | /*6*/ { "fnsave", NONE8, 0, 0 }, | |||
| 428 | /*7*/ { "fnstsw", NONE8, 0, 0 }, | |||
| 429 | }; | |||
| 430 | ||||
| 431 | struct finst db_Esce[] = { | |||
| 432 | /*0*/ { "fiadd", LONG2, op2(ST,STI)((32)|((33)<<8)), "faddp" }, | |||
| 433 | /*1*/ { "fimul", LONG2, op2(ST,STI)((32)|((33)<<8)), "fmulp" }, | |||
| 434 | /*2*/ { "ficom", LONG2, 0, 0 }, | |||
| 435 | /*3*/ { "ficomp", LONG2, op1(X)(34), (char *)db_Esce3 }, | |||
| 436 | /*4*/ { "fisub", LONG2, op2(ST,STI)((32)|((33)<<8)), "fsubrp" }, | |||
| 437 | /*5*/ { "fisubr", LONG2, op2(ST,STI)((32)|((33)<<8)), "fsubp" }, | |||
| 438 | /*6*/ { "fidiv", LONG2, op2(ST,STI)((32)|((33)<<8)), "fdivrp" }, | |||
| 439 | /*7*/ { "fidivr", LONG2, op2(ST,STI)((32)|((33)<<8)), "fdivp" }, | |||
| 440 | }; | |||
| 441 | ||||
| 442 | struct finst db_Escf[] = { | |||
| 443 | /*0*/ { "fild", LONG2, 0, 0 }, | |||
| 444 | /*1*/ { "", LONG2, 0, 0 }, | |||
| 445 | /*2*/ { "fist", LONG2, 0, 0 }, | |||
| 446 | /*3*/ { "fistp", LONG2, 0, 0 }, | |||
| 447 | /*4*/ { "fbld", NONE8, op1(XA)(35), (char *)db_Escf4 }, | |||
| 448 | /*5*/ { "fld", QUAD3, 0, 0 }, | |||
| 449 | /*6*/ { "fbstp", NONE8, 0, 0 }, | |||
| 450 | /*7*/ { "fstp", QUAD3, 0, 0 }, | |||
| 451 | }; | |||
| 452 | ||||
| 453 | struct finst *db_Esc_inst[] = { | |||
| 454 | db_Esc8, db_Esc9, db_Esca, db_Escb, | |||
| 455 | db_Escc, db_Escd, db_Esce, db_Escf | |||
| 456 | }; | |||
| 457 | ||||
| 458 | char * db_Grp1[] = { | |||
| 459 | "add", | |||
| 460 | "or", | |||
| 461 | "adc", | |||
| 462 | "sbb", | |||
| 463 | "and", | |||
| 464 | "sub", | |||
| 465 | "xor", | |||
| 466 | "cmp" | |||
| 467 | }; | |||
| 468 | ||||
| 469 | char * db_Grp2[] = { | |||
| 470 | "rol", | |||
| 471 | "ror", | |||
| 472 | "rcl", | |||
| 473 | "rcr", | |||
| 474 | "shl", | |||
| 475 | "shr", | |||
| 476 | "shl", | |||
| 477 | "sar" | |||
| 478 | }; | |||
| 479 | ||||
| 480 | struct inst db_Grp3[] = { | |||
| 481 | { "test", TRUE((boolean_t) 1), NONE8, op2(I,E)((20)|((1)<<8)), 0 }, | |||
| 482 | { "test", TRUE((boolean_t) 1), NONE8, op2(I,E)((20)|((1)<<8)), 0 }, | |||
| 483 | { "not", TRUE((boolean_t) 1), NONE8, op1(E)(1), 0 }, | |||
| 484 | { "neg", TRUE((boolean_t) 1), NONE8, op1(E)(1), 0 }, | |||
| 485 | { "mul", TRUE((boolean_t) 1), NONE8, op2(E,A)((1)|((11)<<8)), 0 }, | |||
| 486 | { "imul", TRUE((boolean_t) 1), NONE8, op2(E,A)((1)|((11)<<8)), 0 }, | |||
| 487 | { "div", TRUE((boolean_t) 1), NONE8, op2(E,A)((1)|((11)<<8)), 0 }, | |||
| 488 | { "idiv", TRUE((boolean_t) 1), NONE8, op2(E,A)((1)|((11)<<8)), 0 }, | |||
| 489 | }; | |||
| 490 | ||||
| 491 | struct inst db_Grp4[] = { | |||
| 492 | { "inc", TRUE((boolean_t) 1), BYTE0, op1(E)(1), 0 }, | |||
| 493 | { "dec", TRUE((boolean_t) 1), BYTE0, op1(E)(1), 0 }, | |||
| 494 | { "", TRUE((boolean_t) 1), NONE8, 0, 0 }, | |||
| 495 | { "", TRUE((boolean_t) 1), NONE8, 0, 0 }, | |||
| 496 | { "", TRUE((boolean_t) 1), NONE8, 0, 0 }, | |||
| 497 | { "", TRUE((boolean_t) 1), NONE8, 0, 0 }, | |||
| 498 | { "", TRUE((boolean_t) 1), NONE8, 0, 0 }, | |||
| 499 | { "", TRUE((boolean_t) 1), NONE8, 0, 0 } | |||
| 500 | }; | |||
| 501 | ||||
| 502 | struct inst db_Grp5[] = { | |||
| 503 | { "inc", TRUE((boolean_t) 1), LONG2, op1(E)(1), 0 }, | |||
| 504 | { "dec", TRUE((boolean_t) 1), LONG2, op1(E)(1), 0 }, | |||
| 505 | { "call", TRUE((boolean_t) 1), NONE8, op1(Eind)(2),0 }, | |||
| 506 | { "lcall", TRUE((boolean_t) 1), NONE8, op1(Eind)(2),0 }, | |||
| 507 | { "jmp", TRUE((boolean_t) 1), NONE8, op1(Eind)(2),0 }, | |||
| 508 | { "ljmp", TRUE((boolean_t) 1), NONE8, op1(Eind)(2),0 }, | |||
| 509 | { "push", TRUE((boolean_t) 1), LONG2, op1(E)(1), 0 }, | |||
| 510 | { "", TRUE((boolean_t) 1), NONE8, 0, 0 } | |||
| 511 | }; | |||
| 512 | ||||
| 513 | struct inst db_inst_table[256] = { | |||
| 514 | /*00*/ { "add", TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 515 | /*01*/ { "add", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 516 | /*02*/ { "add", TRUE((boolean_t) 1), BYTE0, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 517 | /*03*/ { "add", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 518 | /*04*/ { "add", FALSE((boolean_t) 0), BYTE0, op2(Is, A)((21)|((11)<<8)), 0 }, | |||
| 519 | /*05*/ { "add", FALSE((boolean_t) 0), LONG2, op2(Is, A)((21)|((11)<<8)), 0 }, | |||
| 520 | /*06*/ { "push", FALSE((boolean_t) 0), NONE8, op1(Si)(10), 0 }, | |||
| 521 | /*07*/ { "pop", FALSE((boolean_t) 0), NONE8, op1(Si)(10), 0 }, | |||
| 522 | ||||
| 523 | /*08*/ { "or", TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 524 | /*09*/ { "or", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 525 | /*0a*/ { "or", TRUE((boolean_t) 1), BYTE0, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 526 | /*0b*/ { "or", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 527 | /*0c*/ { "or", FALSE((boolean_t) 0), BYTE0, op2(I, A)((20)|((11)<<8)), 0 }, | |||
| 528 | /*0d*/ { "or", FALSE((boolean_t) 0), LONG2, op2(I, A)((20)|((11)<<8)), 0 }, | |||
| 529 | /*0e*/ { "push", FALSE((boolean_t) 0), NONE8, op1(Si)(10), 0 }, | |||
| 530 | /*0f*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 531 | ||||
| 532 | /*10*/ { "adc", TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 533 | /*11*/ { "adc", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 534 | /*12*/ { "adc", TRUE((boolean_t) 1), BYTE0, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 535 | /*13*/ { "adc", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 536 | /*14*/ { "adc", FALSE((boolean_t) 0), BYTE0, op2(Is, A)((21)|((11)<<8)), 0 }, | |||
| 537 | /*15*/ { "adc", FALSE((boolean_t) 0), LONG2, op2(Is, A)((21)|((11)<<8)), 0 }, | |||
| 538 | /*16*/ { "push", FALSE((boolean_t) 0), NONE8, op1(Si)(10), 0 }, | |||
| 539 | /*17*/ { "pop", FALSE((boolean_t) 0), NONE8, op1(Si)(10), 0 }, | |||
| 540 | ||||
| 541 | /*18*/ { "sbb", TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 542 | /*19*/ { "sbb", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 543 | /*1a*/ { "sbb", TRUE((boolean_t) 1), BYTE0, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 544 | /*1b*/ { "sbb", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 545 | /*1c*/ { "sbb", FALSE((boolean_t) 0), BYTE0, op2(Is, A)((21)|((11)<<8)), 0 }, | |||
| 546 | /*1d*/ { "sbb", FALSE((boolean_t) 0), LONG2, op2(Is, A)((21)|((11)<<8)), 0 }, | |||
| 547 | /*1e*/ { "push", FALSE((boolean_t) 0), NONE8, op1(Si)(10), 0 }, | |||
| 548 | /*1f*/ { "pop", FALSE((boolean_t) 0), NONE8, op1(Si)(10), 0 }, | |||
| 549 | ||||
| 550 | /*20*/ { "and", TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 551 | /*21*/ { "and", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 552 | /*22*/ { "and", TRUE((boolean_t) 1), BYTE0, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 553 | /*23*/ { "and", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 554 | /*24*/ { "and", FALSE((boolean_t) 0), BYTE0, op2(I, A)((20)|((11)<<8)), 0 }, | |||
| 555 | /*25*/ { "and", FALSE((boolean_t) 0), LONG2, op2(I, A)((20)|((11)<<8)), 0 }, | |||
| 556 | /*26*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 557 | /*27*/ { "aaa", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 558 | ||||
| 559 | /*28*/ { "sub", TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 560 | /*29*/ { "sub", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 561 | /*2a*/ { "sub", TRUE((boolean_t) 1), BYTE0, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 562 | /*2b*/ { "sub", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 563 | /*2c*/ { "sub", FALSE((boolean_t) 0), BYTE0, op2(Is, A)((21)|((11)<<8)), 0 }, | |||
| 564 | /*2d*/ { "sub", FALSE((boolean_t) 0), LONG2, op2(Is, A)((21)|((11)<<8)), 0 }, | |||
| 565 | /*2e*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 566 | /*2f*/ { "das", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 567 | ||||
| 568 | /*30*/ { "xor", TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 569 | /*31*/ { "xor", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 570 | /*32*/ { "xor", TRUE((boolean_t) 1), BYTE0, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 571 | /*33*/ { "xor", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 572 | /*34*/ { "xor", FALSE((boolean_t) 0), BYTE0, op2(I, A)((20)|((11)<<8)), 0 }, | |||
| 573 | /*35*/ { "xor", FALSE((boolean_t) 0), LONG2, op2(I, A)((20)|((11)<<8)), 0 }, | |||
| 574 | /*36*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 575 | /*37*/ { "daa", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 576 | ||||
| 577 | /*38*/ { "cmp", TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 578 | /*39*/ { "cmp", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 579 | /*3a*/ { "cmp", TRUE((boolean_t) 1), BYTE0, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 580 | /*3b*/ { "cmp", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 581 | /*3c*/ { "cmp", FALSE((boolean_t) 0), BYTE0, op2(Is, A)((21)|((11)<<8)), 0 }, | |||
| 582 | /*3d*/ { "cmp", FALSE((boolean_t) 0), LONG2, op2(Is, A)((21)|((11)<<8)), 0 }, | |||
| 583 | /*3e*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 584 | /*3f*/ { "aas", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 585 | ||||
| 586 | /*40*/ { "inc", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 587 | /*41*/ { "inc", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 588 | /*42*/ { "inc", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 589 | /*43*/ { "inc", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 590 | /*44*/ { "inc", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 591 | /*45*/ { "inc", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 592 | /*46*/ { "inc", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 593 | /*47*/ { "inc", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 594 | ||||
| 595 | /*48*/ { "dec", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 596 | /*49*/ { "dec", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 597 | /*4a*/ { "dec", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 598 | /*4b*/ { "dec", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 599 | /*4c*/ { "dec", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 600 | /*4d*/ { "dec", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 601 | /*4e*/ { "dec", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 602 | /*4f*/ { "dec", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 603 | ||||
| 604 | /*50*/ { "push", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 605 | /*51*/ { "push", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 606 | /*52*/ { "push", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 607 | /*53*/ { "push", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 608 | /*54*/ { "push", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 609 | /*55*/ { "push", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 610 | /*56*/ { "push", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 611 | /*57*/ { "push", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 612 | ||||
| 613 | /*58*/ { "pop", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 614 | /*59*/ { "pop", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 615 | /*5a*/ { "pop", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 616 | /*5b*/ { "pop", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 617 | /*5c*/ { "pop", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 618 | /*5d*/ { "pop", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 619 | /*5e*/ { "pop", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 620 | /*5f*/ { "pop", FALSE((boolean_t) 0), LONG2, op1(Ri)(8), 0 }, | |||
| 621 | ||||
| 622 | /*60*/ { "pusha", FALSE((boolean_t) 0), LONG2, 0, 0 }, | |||
| 623 | /*61*/ { "popa", FALSE((boolean_t) 0), LONG2, 0, 0 }, | |||
| 624 | /*62*/ { "bound", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 625 | /*63*/ { "arpl", TRUE((boolean_t) 1), NONE8, op2(Ew,Rw)((4)|((7)<<8)), 0 }, | |||
| 626 | ||||
| 627 | /*64*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 628 | /*65*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 629 | /*66*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 630 | /*67*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 631 | ||||
| 632 | /*68*/ { "push", FALSE((boolean_t) 0), LONG2, op1(I)(20), 0 }, | |||
| 633 | /*69*/ { "imul", TRUE((boolean_t) 1), LONG2, op3(I,E,R)((20)|((1)<<8)|((6)<<16)), 0 }, | |||
| 634 | /*6a*/ { "push", FALSE((boolean_t) 0), LONG2, op1(Ib)(22), 0 }, | |||
| 635 | /*6b*/ { "imul", TRUE((boolean_t) 1), LONG2, op3(Ibs,E,R)((23)|((1)<<8)|((6)<<16)),0 }, | |||
| 636 | /*6c*/ { "ins", FALSE((boolean_t) 0), BYTE0, op2(DX, DI)((14)|((16)<<8)), 0 }, | |||
| 637 | /*6d*/ { "ins", FALSE((boolean_t) 0), LONG2, op2(DX, DI)((14)|((16)<<8)), 0 }, | |||
| 638 | /*6e*/ { "outs", FALSE((boolean_t) 0), BYTE0, op2(SI, DX)((15)|((14)<<8)), 0 }, | |||
| 639 | /*6f*/ { "outs", FALSE((boolean_t) 0), LONG2, op2(SI, DX)((15)|((14)<<8)), 0 }, | |||
| 640 | ||||
| 641 | /*70*/ { "jo", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 642 | /*71*/ { "jno", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 643 | /*72*/ { "jb", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 644 | /*73*/ { "jnb", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 645 | /*74*/ { "jz", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 646 | /*75*/ { "jnz", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 647 | /*76*/ { "jbe", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 648 | /*77*/ { "jnbe", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 649 | ||||
| 650 | /*78*/ { "js", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 651 | /*79*/ { "jns", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 652 | /*7a*/ { "jp", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 653 | /*7b*/ { "jnp", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 654 | /*7c*/ { "jl", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 655 | /*7d*/ { "jnl", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 656 | /*7e*/ { "jle", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 657 | /*7f*/ { "jnle", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 658 | ||||
| 659 | /*80*/ { "", TRUE((boolean_t) 1), BYTE0, op2(I, E)((20)|((1)<<8)), (char *)db_Grp1 }, | |||
| 660 | /*81*/ { "", TRUE((boolean_t) 1), LONG2, op2(I, E)((20)|((1)<<8)), (char *)db_Grp1 }, | |||
| 661 | /*82*/ { "", TRUE((boolean_t) 1), BYTE0, op2(Is,E)((21)|((1)<<8)), (char *)db_Grp1 }, | |||
| 662 | /*83*/ { "", TRUE((boolean_t) 1), LONG2, op2(Ibs,E)((23)|((1)<<8)), (char *)db_Grp1 }, | |||
| 663 | /*84*/ { "test", TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 664 | /*85*/ { "test", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 665 | /*86*/ { "xchg", TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 666 | /*87*/ { "xchg", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 667 | ||||
| 668 | /*88*/ { "mov", TRUE((boolean_t) 1), BYTE0, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 669 | /*89*/ { "mov", TRUE((boolean_t) 1), LONG2, op2(R, E)((6)|((1)<<8)), 0 }, | |||
| 670 | /*8a*/ { "mov", TRUE((boolean_t) 1), BYTE0, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 671 | /*8b*/ { "mov", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 672 | /*8c*/ { "mov", TRUE((boolean_t) 1), NONE8, op2(S, Ew)((9)|((4)<<8)), 0 }, | |||
| 673 | /*8d*/ { "lea", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 674 | /*8e*/ { "mov", TRUE((boolean_t) 1), NONE8, op2(Ew, S)((4)|((9)<<8)), 0 }, | |||
| 675 | /*8f*/ { "pop", TRUE((boolean_t) 1), LONG2, op1(E)(1), 0 }, | |||
| 676 | ||||
| 677 | /*90*/ { "nop", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 678 | /*91*/ { "xchg", FALSE((boolean_t) 0), LONG2, op2(A, Ri)((11)|((8)<<8)), 0 }, | |||
| 679 | /*92*/ { "xchg", FALSE((boolean_t) 0), LONG2, op2(A, Ri)((11)|((8)<<8)), 0 }, | |||
| 680 | /*93*/ { "xchg", FALSE((boolean_t) 0), LONG2, op2(A, Ri)((11)|((8)<<8)), 0 }, | |||
| 681 | /*94*/ { "xchg", FALSE((boolean_t) 0), LONG2, op2(A, Ri)((11)|((8)<<8)), 0 }, | |||
| 682 | /*95*/ { "xchg", FALSE((boolean_t) 0), LONG2, op2(A, Ri)((11)|((8)<<8)), 0 }, | |||
| 683 | /*96*/ { "xchg", FALSE((boolean_t) 0), LONG2, op2(A, Ri)((11)|((8)<<8)), 0 }, | |||
| 684 | /*97*/ { "xchg", FALSE((boolean_t) 0), LONG2, op2(A, Ri)((11)|((8)<<8)), 0 }, | |||
| 685 | ||||
| 686 | /*98*/ { "cbw", FALSE((boolean_t) 0), SDEP7, 0, "cwde" }, /* cbw/cwde */ | |||
| 687 | /*99*/ { "cwd", FALSE((boolean_t) 0), SDEP7, 0, "cdq" }, /* cwd/cdq */ | |||
| 688 | /*9a*/ { "lcall", FALSE((boolean_t) 0), NONE8, op1(OS)(31), 0 }, | |||
| 689 | /*9b*/ { "wait", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 690 | /*9c*/ { "pushf", FALSE((boolean_t) 0), LONG2, 0, 0 }, | |||
| 691 | /*9d*/ { "popf", FALSE((boolean_t) 0), LONG2, 0, 0 }, | |||
| 692 | /*9e*/ { "sahf", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 693 | /*9f*/ { "lahf", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 694 | ||||
| 695 | /*a0*/ { "mov", FALSE((boolean_t) 0), BYTE0, op2(O, A)((26)|((11)<<8)), 0 }, | |||
| 696 | /*a1*/ { "mov", FALSE((boolean_t) 0), LONG2, op2(O, A)((26)|((11)<<8)), 0 }, | |||
| 697 | /*a2*/ { "mov", FALSE((boolean_t) 0), BYTE0, op2(A, O)((11)|((26)<<8)), 0 }, | |||
| 698 | /*a3*/ { "mov", FALSE((boolean_t) 0), LONG2, op2(A, O)((11)|((26)<<8)), 0 }, | |||
| 699 | /*a4*/ { "movs", FALSE((boolean_t) 0), BYTE0, op2(SI,DI)((15)|((16)<<8)), 0 }, | |||
| 700 | /*a5*/ { "movs", FALSE((boolean_t) 0), LONG2, op2(SI,DI)((15)|((16)<<8)), 0 }, | |||
| 701 | /*a6*/ { "cmps", FALSE((boolean_t) 0), BYTE0, op2(SI,DI)((15)|((16)<<8)), 0 }, | |||
| 702 | /*a7*/ { "cmps", FALSE((boolean_t) 0), LONG2, op2(SI,DI)((15)|((16)<<8)), 0 }, | |||
| 703 | ||||
| 704 | /*a8*/ { "test", FALSE((boolean_t) 0), BYTE0, op2(I, A)((20)|((11)<<8)), 0 }, | |||
| 705 | /*a9*/ { "test", FALSE((boolean_t) 0), LONG2, op2(I, A)((20)|((11)<<8)), 0 }, | |||
| 706 | /*aa*/ { "stos", FALSE((boolean_t) 0), BYTE0, op1(DI)(16), 0 }, | |||
| 707 | /*ab*/ { "stos", FALSE((boolean_t) 0), LONG2, op1(DI)(16), 0 }, | |||
| 708 | /*ac*/ { "lods", FALSE((boolean_t) 0), BYTE0, op1(SI)(15), 0 }, | |||
| 709 | /*ad*/ { "lods", FALSE((boolean_t) 0), LONG2, op1(SI)(15), 0 }, | |||
| 710 | /*ae*/ { "scas", FALSE((boolean_t) 0), BYTE0, op1(DI)(16), 0 }, | |||
| 711 | /*af*/ { "scas", FALSE((boolean_t) 0), LONG2, op1(DI)(16), 0 }, | |||
| 712 | ||||
| 713 | /*b0*/ { "mov", FALSE((boolean_t) 0), BYTE0, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 714 | /*b1*/ { "mov", FALSE((boolean_t) 0), BYTE0, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 715 | /*b2*/ { "mov", FALSE((boolean_t) 0), BYTE0, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 716 | /*b3*/ { "mov", FALSE((boolean_t) 0), BYTE0, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 717 | /*b4*/ { "mov", FALSE((boolean_t) 0), BYTE0, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 718 | /*b5*/ { "mov", FALSE((boolean_t) 0), BYTE0, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 719 | /*b6*/ { "mov", FALSE((boolean_t) 0), BYTE0, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 720 | /*b7*/ { "mov", FALSE((boolean_t) 0), BYTE0, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 721 | ||||
| 722 | /*b8*/ { "mov", FALSE((boolean_t) 0), LONG2, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 723 | /*b9*/ { "mov", FALSE((boolean_t) 0), LONG2, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 724 | /*ba*/ { "mov", FALSE((boolean_t) 0), LONG2, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 725 | /*bb*/ { "mov", FALSE((boolean_t) 0), LONG2, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 726 | /*bc*/ { "mov", FALSE((boolean_t) 0), LONG2, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 727 | /*bd*/ { "mov", FALSE((boolean_t) 0), LONG2, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 728 | /*be*/ { "mov", FALSE((boolean_t) 0), LONG2, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 729 | /*bf*/ { "mov", FALSE((boolean_t) 0), LONG2, op2(I, Ri)((20)|((8)<<8)), 0 }, | |||
| 730 | ||||
| 731 | /*c0*/ { "", TRUE((boolean_t) 1), BYTE0, op2(Ib, E)((22)|((1)<<8)), (char *)db_Grp2 }, | |||
| 732 | /*c1*/ { "", TRUE((boolean_t) 1), LONG2, op2(Ib, E)((22)|((1)<<8)), (char *)db_Grp2 }, | |||
| 733 | /*c2*/ { "ret", FALSE((boolean_t) 0), NONE8, op1(Iw)(24), 0 }, | |||
| 734 | /*c3*/ { "ret", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 735 | /*c4*/ { "les", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 736 | /*c5*/ { "lds", TRUE((boolean_t) 1), LONG2, op2(E, R)((1)|((6)<<8)), 0 }, | |||
| 737 | /*c6*/ { "mov", TRUE((boolean_t) 1), BYTE0, op2(I, E)((20)|((1)<<8)), 0 }, | |||
| 738 | /*c7*/ { "mov", TRUE((boolean_t) 1), LONG2, op2(I, E)((20)|((1)<<8)), 0 }, | |||
| 739 | ||||
| 740 | /*c8*/ { "enter", FALSE((boolean_t) 0), NONE8, op2(Ib, Iw)((22)|((24)<<8)), 0 }, | |||
| 741 | /*c9*/ { "leave", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 742 | /*ca*/ { "lret", FALSE((boolean_t) 0), NONE8, op1(Iw)(24), 0 }, | |||
| 743 | /*cb*/ { "lret", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 744 | /*cc*/ { "int", FALSE((boolean_t) 0), NONE8, op1(o3)(30), 0 }, | |||
| 745 | /*cd*/ { "int", FALSE((boolean_t) 0), NONE8, op1(Ib)(22), 0 }, | |||
| 746 | /*ce*/ { "into", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 747 | /*cf*/ { "iret", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 748 | ||||
| 749 | /*d0*/ { "", TRUE((boolean_t) 1), BYTE0, op2(o1, E)((29)|((1)<<8)), (char *)db_Grp2 }, | |||
| 750 | /*d1*/ { "", TRUE((boolean_t) 1), LONG2, op2(o1, E)((29)|((1)<<8)), (char *)db_Grp2 }, | |||
| 751 | /*d2*/ { "", TRUE((boolean_t) 1), BYTE0, op2(CL, E)((13)|((1)<<8)), (char *)db_Grp2 }, | |||
| 752 | /*d3*/ { "", TRUE((boolean_t) 1), LONG2, op2(CL, E)((13)|((1)<<8)), (char *)db_Grp2 }, | |||
| 753 | /*d4*/ { "aam", FALSE((boolean_t) 0), NONE8, op1(Iba)(36), 0 }, | |||
| 754 | /*d5*/ { "aad", FALSE((boolean_t) 0), NONE8, op1(Iba)(36), 0 }, | |||
| 755 | /*d6*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 756 | /*d7*/ { "xlat", FALSE((boolean_t) 0), BYTE0, op1(BX)(12), 0 }, | |||
| 757 | ||||
| 758 | /*d8*/ { "", TRUE((boolean_t) 1), NONE8, 0, (char *)db_Esc8 }, | |||
| 759 | /*d9*/ { "", TRUE((boolean_t) 1), NONE8, 0, (char *)db_Esc9 }, | |||
| 760 | /*da*/ { "", TRUE((boolean_t) 1), NONE8, 0, (char *)db_Esca }, | |||
| 761 | /*db*/ { "", TRUE((boolean_t) 1), NONE8, 0, (char *)db_Escb }, | |||
| 762 | /*dc*/ { "", TRUE((boolean_t) 1), NONE8, 0, (char *)db_Escc }, | |||
| 763 | /*dd*/ { "", TRUE((boolean_t) 1), NONE8, 0, (char *)db_Escd }, | |||
| 764 | /*de*/ { "", TRUE((boolean_t) 1), NONE8, 0, (char *)db_Esce }, | |||
| 765 | /*df*/ { "", TRUE((boolean_t) 1), NONE8, 0, (char *)db_Escf }, | |||
| 766 | ||||
| 767 | /*e0*/ { "loopne",FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 768 | /*e1*/ { "loope", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 769 | /*e2*/ { "loop", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 770 | /*e3*/ { "jcxz", FALSE((boolean_t) 0), SDEP7, op1(Db)(27), "jecxz" }, | |||
| 771 | /*e4*/ { "in", FALSE((boolean_t) 0), BYTE0, op2(Ib, A)((22)|((11)<<8)), 0 }, | |||
| 772 | /*e5*/ { "in", FALSE((boolean_t) 0), LONG2, op2(Ib, A)((22)|((11)<<8)) , 0 }, | |||
| 773 | /*e6*/ { "out", FALSE((boolean_t) 0), BYTE0, op2(A, Ib)((11)|((22)<<8)), 0 }, | |||
| 774 | /*e7*/ { "out", FALSE((boolean_t) 0), LONG2, op2(A, Ib)((11)|((22)<<8)) , 0 }, | |||
| 775 | ||||
| 776 | /*e8*/ { "call", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 777 | /*e9*/ { "jmp", FALSE((boolean_t) 0), NONE8, op1(Dl)(28), 0 }, | |||
| 778 | /*ea*/ { "ljmp", FALSE((boolean_t) 0), NONE8, op1(OS)(31), 0 }, | |||
| 779 | /*eb*/ { "jmp", FALSE((boolean_t) 0), NONE8, op1(Db)(27), 0 }, | |||
| 780 | /*ec*/ { "in", FALSE((boolean_t) 0), BYTE0, op2(DX, A)((14)|((11)<<8)), 0 }, | |||
| 781 | /*ed*/ { "in", FALSE((boolean_t) 0), LONG2, op2(DX, A)((14)|((11)<<8)) , 0 }, | |||
| 782 | /*ee*/ { "out", FALSE((boolean_t) 0), BYTE0, op2(A, DX)((11)|((14)<<8)), 0 }, | |||
| 783 | /*ef*/ { "out", FALSE((boolean_t) 0), LONG2, op2(A, DX)((11)|((14)<<8)) , 0 }, | |||
| 784 | ||||
| 785 | /*f0*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 786 | /*f1*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 787 | /*f2*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 788 | /*f3*/ { "", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 789 | /*f4*/ { "hlt", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 790 | /*f5*/ { "cmc", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 791 | /*f6*/ { "", TRUE((boolean_t) 1), BYTE0, 0, (char *)db_Grp3 }, | |||
| 792 | /*f7*/ { "", TRUE((boolean_t) 1), LONG2, 0, (char *)db_Grp3 }, | |||
| 793 | ||||
| 794 | /*f8*/ { "clc", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 795 | /*f9*/ { "stc", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 796 | /*fa*/ { "cli", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 797 | /*fb*/ { "sti", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 798 | /*fc*/ { "cld", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 799 | /*fd*/ { "std", FALSE((boolean_t) 0), NONE8, 0, 0 }, | |||
| 800 | /*fe*/ { "", TRUE((boolean_t) 1), NONE8, 0, (char *)db_Grp4 }, | |||
| 801 | /*ff*/ { "", TRUE((boolean_t) 1), NONE8, 0, (char *)db_Grp5 }, | |||
| 802 | }; | |||
| 803 | ||||
| 804 | struct inst db_bad_inst = | |||
| 805 | { "???", FALSE((boolean_t) 0), NONE8, 0, 0 } | |||
| 806 | ; | |||
| 807 | ||||
| 808 | #define f_mod(byte)((byte)>>6) ((byte)>>6) | |||
| 809 | #define f_reg(byte)(((byte)>>3)&0x7) (((byte)>>3)&0x7) | |||
| 810 | #define f_rm(byte)((byte)&0x7) ((byte)&0x7) | |||
| 811 | ||||
| 812 | #define sib_ss(byte)((byte)>>6) ((byte)>>6) | |||
| 813 | #define sib_index(byte)(((byte)>>3)&0x7) (((byte)>>3)&0x7) | |||
| 814 | #define sib_base(byte)((byte)&0x7) ((byte)&0x7) | |||
| 815 | ||||
| 816 | struct i_addr { | |||
| 817 | int is_reg; /* if reg, reg number is in 'disp' */ | |||
| 818 | int disp; | |||
| 819 | char * base; | |||
| 820 | char * index; | |||
| 821 | int ss; | |||
| 822 | }; | |||
| 823 | ||||
| 824 | char * db_index_reg_16[8] = { | |||
| 825 | "%bx,%si", | |||
| 826 | "%bx,%di", | |||
| 827 | "%bp,%si", | |||
| 828 | "%bp,%di", | |||
| 829 | "%si", | |||
| 830 | "%di", | |||
| 831 | "%bp", | |||
| 832 | "%bx" | |||
| 833 | }; | |||
| 834 | ||||
| 835 | char * db_reg[3][8] = { | |||
| 836 | { "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh" }, | |||
| 837 | { "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di" }, | |||
| 838 | { "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi" } | |||
| 839 | }; | |||
| 840 | ||||
| 841 | char * db_seg_reg[8] = { | |||
| 842 | "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "", "" | |||
| 843 | }; | |||
| 844 | ||||
| 845 | /* | |||
| 846 | * lengths for size attributes | |||
| 847 | */ | |||
| 848 | int db_lengths[] = { | |||
| 849 | 1, /* BYTE */ | |||
| 850 | 2, /* WORD */ | |||
| 851 | 4, /* LONG */ | |||
| 852 | 8, /* QUAD */ | |||
| 853 | 4, /* SNGL */ | |||
| 854 | 8, /* DBLR */ | |||
| 855 | 10, /* EXTR */ | |||
| 856 | }; | |||
| 857 | ||||
| 858 | #define get_value_inc(result, loc, size, is_signed, task)result = db_get_task_value((loc), (size), (is_signed), (task) ); (loc) += (size); \ | |||
| 859 | result = db_get_task_value((loc), (size), (is_signed), (task)); \ | |||
| 860 | (loc) += (size); | |||
| 861 | ||||
| 862 | /* | |||
| 863 | * Read address at location and return updated location. | |||
| 864 | */ | |||
| 865 | db_addr_t | |||
| 866 | db_read_address( | |||
| 867 | db_addr_t loc, | |||
| 868 | int short_addr, | |||
| 869 | int regmodrm, | |||
| 870 | struct i_addr *addrp, /* out */ | |||
| 871 | task_t task) | |||
| 872 | { | |||
| 873 | int mod, rm, sib, index, disp; | |||
| 874 | ||||
| 875 | mod = f_mod(regmodrm)((regmodrm)>>6); | |||
| 876 | rm = f_rm(regmodrm)((regmodrm)&0x7); | |||
| 877 | ||||
| 878 | if (mod == 3) { | |||
| 879 | addrp->is_reg = TRUE((boolean_t) 1); | |||
| 880 | addrp->disp = rm; | |||
| 881 | return loc; | |||
| 882 | } | |||
| 883 | addrp->is_reg = FALSE((boolean_t) 0); | |||
| 884 | addrp->index = 0; | |||
| 885 | ||||
| 886 | if (short_addr) { | |||
| 887 | addrp->index = 0; | |||
| 888 | addrp->ss = 0; | |||
| 889 | switch (mod) { | |||
| 890 | case 0: | |||
| 891 | if (rm == 6) { | |||
| 892 | get_value_inc(disp, loc, 2, TRUE, task)disp = db_get_task_value((loc), (2), (((boolean_t) 1)), (task )); (loc) += (2);; | |||
| 893 | addrp->disp = disp; | |||
| 894 | addrp->base = 0; | |||
| 895 | } | |||
| 896 | else { | |||
| 897 | addrp->disp = 0; | |||
| 898 | addrp->base = db_index_reg_16[rm]; | |||
| 899 | } | |||
| 900 | break; | |||
| 901 | case 1: | |||
| 902 | get_value_inc(disp, loc, 1, TRUE, task)disp = db_get_task_value((loc), (1), (((boolean_t) 1)), (task )); (loc) += (1);; | |||
| 903 | addrp->disp = disp; | |||
| 904 | addrp->base = db_index_reg_16[rm]; | |||
| 905 | break; | |||
| 906 | case 2: | |||
| 907 | get_value_inc(disp, loc, 2, TRUE, task)disp = db_get_task_value((loc), (2), (((boolean_t) 1)), (task )); (loc) += (2);; | |||
| 908 | addrp->disp = disp; | |||
| 909 | addrp->base = db_index_reg_16[rm]; | |||
| 910 | break; | |||
| 911 | } | |||
| 912 | } | |||
| 913 | else { | |||
| 914 | if (mod != 3 && rm == 4) { | |||
| 915 | get_value_inc(sib, loc, 1, FALSE, task)sib = db_get_task_value((loc), (1), (((boolean_t) 0)), (task) ); (loc) += (1);; | |||
| 916 | rm = sib_base(sib)((sib)&0x7); | |||
| 917 | index = sib_index(sib)(((sib)>>3)&0x7); | |||
| 918 | if (index != 4) | |||
| 919 | addrp->index = db_reg[LONG2][index]; | |||
| 920 | addrp->ss = sib_ss(sib)((sib)>>6); | |||
| 921 | } | |||
| 922 | ||||
| 923 | switch (mod) { | |||
| 924 | case 0: | |||
| 925 | if (rm == 5) { | |||
| 926 | get_value_inc(addrp->disp, loc, 4, FALSE, task)addrp->disp = db_get_task_value((loc), (4), (((boolean_t) 0 )), (task)); (loc) += (4);; | |||
| 927 | addrp->base = 0; | |||
| 928 | } | |||
| 929 | else { | |||
| 930 | addrp->disp = 0; | |||
| 931 | addrp->base = db_reg[LONG2][rm]; | |||
| 932 | } | |||
| 933 | break; | |||
| 934 | ||||
| 935 | case 1: | |||
| 936 | get_value_inc(disp, loc, 1, TRUE, task)disp = db_get_task_value((loc), (1), (((boolean_t) 1)), (task )); (loc) += (1);; | |||
| 937 | addrp->disp = disp; | |||
| 938 | addrp->base = db_reg[LONG2][rm]; | |||
| 939 | break; | |||
| 940 | ||||
| 941 | case 2: | |||
| 942 | get_value_inc(disp, loc, 4, FALSE, task)disp = db_get_task_value((loc), (4), (((boolean_t) 0)), (task )); (loc) += (4);; | |||
| 943 | addrp->disp = disp; | |||
| 944 | addrp->base = db_reg[LONG2][rm]; | |||
| 945 | break; | |||
| 946 | } | |||
| 947 | } | |||
| 948 | return loc; | |||
| 949 | } | |||
| 950 | ||||
| 951 | void | |||
| 952 | db_print_address( | |||
| 953 | const char * seg, | |||
| 954 | int size, | |||
| 955 | const struct i_addr *addrp, | |||
| 956 | task_t task) | |||
| 957 | { | |||
| 958 | if (addrp->is_reg) { | |||
| ||||
| 959 | db_printf("%s", db_reg[size][addrp->disp]); | |||
| 960 | return; | |||
| 961 | } | |||
| 962 | ||||
| 963 | if (seg) { | |||
| 964 | db_printf("%s:", seg); | |||
| 965 | } | |||
| 966 | ||||
| 967 | if (addrp->base != 0 || addrp->index != 0) { | |||
| 968 | db_printf("%#n", addrp->disp); | |||
| 969 | db_printf("("); | |||
| 970 | if (addrp->base) | |||
| 971 | db_printf("%s", addrp->base); | |||
| 972 | if (addrp->index) | |||
| 973 | db_printf(",%s,%d", addrp->index, 1<<addrp->ss); | |||
| 974 | db_printf(")"); | |||
| 975 | } else | |||
| 976 | db_task_printsym((db_addr_t)addrp->disp, DB_STGY_ANY0, task); | |||
| 977 | } | |||
| 978 | ||||
| 979 | /* | |||
| 980 | * Disassemble floating-point ("escape") instruction | |||
| 981 | * and return updated location. | |||
| 982 | */ | |||
| 983 | db_addr_t | |||
| 984 | db_disasm_esc( | |||
| 985 | db_addr_t loc, | |||
| 986 | int inst, | |||
| 987 | int short_addr, | |||
| 988 | int size, | |||
| 989 | const char * seg, | |||
| 990 | task_t task) | |||
| 991 | { | |||
| 992 | int regmodrm; | |||
| 993 | struct finst *fp; | |||
| 994 | int mod; | |||
| 995 | struct i_addr address; | |||
| 996 | char * name; | |||
| 997 | ||||
| 998 | get_value_inc(regmodrm, loc, 1, FALSE, task)regmodrm = db_get_task_value((loc), (1), (((boolean_t) 0)), ( task)); (loc) += (1);; | |||
| 999 | fp = &db_Esc_inst[inst - 0xd8][f_reg(regmodrm)(((regmodrm)>>3)&0x7)]; | |||
| 1000 | mod = f_mod(regmodrm)((regmodrm)>>6); | |||
| 1001 | if (mod != 3) { | |||
| 1002 | /* | |||
| 1003 | * Normal address modes. | |||
| 1004 | */ | |||
| 1005 | loc = db_read_address(loc, short_addr, regmodrm, &address, task); | |||
| 1006 | db_printf(fp->f_name); | |||
| 1007 | switch(fp->f_size) { | |||
| 1008 | case SNGL4: | |||
| 1009 | db_printf("s"); | |||
| 1010 | break; | |||
| 1011 | case DBLR5: | |||
| 1012 | db_printf("l"); | |||
| 1013 | break; | |||
| 1014 | case EXTR6: | |||
| 1015 | db_printf("t"); | |||
| 1016 | break; | |||
| 1017 | case WORD1: | |||
| 1018 | db_printf("s"); | |||
| 1019 | break; | |||
| 1020 | case LONG2: | |||
| 1021 | db_printf("l"); | |||
| 1022 | break; | |||
| 1023 | case QUAD3: | |||
| 1024 | db_printf("q"); | |||
| 1025 | break; | |||
| 1026 | default: | |||
| 1027 | break; | |||
| 1028 | } | |||
| 1029 | db_printf("\t"); | |||
| 1030 | db_print_address(seg, BYTE0, &address, task); | |||
| 1031 | } | |||
| 1032 | else { | |||
| 1033 | /* | |||
| 1034 | * 'reg-reg' - special formats | |||
| 1035 | */ | |||
| 1036 | switch (fp->f_rrmode) { | |||
| 1037 | case op2(ST,STI)((32)|((33)<<8)): | |||
| 1038 | name = (fp->f_rrname) ? fp->f_rrname : fp->f_name; | |||
| 1039 | db_printf("%s\t%%st,%%st(%d)",name,f_rm(regmodrm)((regmodrm)&0x7)); | |||
| 1040 | break; | |||
| 1041 | case op2(STI,ST)((33)|((32)<<8)): | |||
| 1042 | name = (fp->f_rrname) ? fp->f_rrname : fp->f_name; | |||
| 1043 | db_printf("%s\t%%st(%d),%%st",name, f_rm(regmodrm)((regmodrm)&0x7)); | |||
| 1044 | break; | |||
| 1045 | case op1(STI)(33): | |||
| 1046 | name = (fp->f_rrname) ? fp->f_rrname : fp->f_name; | |||
| 1047 | db_printf("%s\t%%st(%d)",name, f_rm(regmodrm)((regmodrm)&0x7)); | |||
| 1048 | break; | |||
| 1049 | case op1(X)(34): | |||
| 1050 | db_printf("%s", ((char **)fp->f_rrname)[f_rm(regmodrm)((regmodrm)&0x7)]); | |||
| 1051 | break; | |||
| 1052 | case op1(XA)(35): | |||
| 1053 | db_printf("%s\t%%ax", | |||
| 1054 | ((char **)fp->f_rrname)[f_rm(regmodrm)((regmodrm)&0x7)]); | |||
| 1055 | break; | |||
| 1056 | default: | |||
| 1057 | db_printf("<bad instruction>"); | |||
| 1058 | break; | |||
| 1059 | } | |||
| 1060 | } | |||
| 1061 | ||||
| 1062 | return loc; | |||
| 1063 | } | |||
| 1064 | ||||
| 1065 | /* | |||
| 1066 | * Disassemble instruction at 'loc'. 'altfmt' specifies an | |||
| 1067 | * (optional) alternate format. Return address of start of | |||
| 1068 | * next instruction. | |||
| 1069 | */ | |||
| 1070 | db_addr_t | |||
| 1071 | db_disasm( | |||
| 1072 | db_addr_t loc, | |||
| 1073 | boolean_t altfmt, | |||
| 1074 | task_t task) | |||
| 1075 | { | |||
| 1076 | int inst; | |||
| 1077 | int size; | |||
| 1078 | int short_addr; | |||
| 1079 | char * seg; | |||
| 1080 | struct inst * ip; | |||
| 1081 | char * i_name; | |||
| 1082 | int i_size; | |||
| 1083 | int i_mode; | |||
| 1084 | int regmodrm; | |||
| 1085 | boolean_t first; | |||
| 1086 | int displ; | |||
| 1087 | int prefix; | |||
| 1088 | int imm; | |||
| 1089 | int imm2; | |||
| 1090 | int len; | |||
| 1091 | struct i_addr address; | |||
| 1092 | ||||
| 1093 | get_value_inc(inst, loc, 1, FALSE, task)inst = db_get_task_value((loc), (1), (((boolean_t) 0)), (task )); (loc) += (1);; | |||
| 1094 | if (db_disasm_16) { | |||
| ||||
| 1095 | short_addr = TRUE((boolean_t) 1); | |||
| 1096 | size = WORD1; | |||
| 1097 | } | |||
| 1098 | else { | |||
| 1099 | short_addr = FALSE((boolean_t) 0); | |||
| 1100 | size = LONG2; | |||
| 1101 | } | |||
| 1102 | seg = 0; | |||
| 1103 | regmodrm = 0; | |||
| 1104 | ||||
| 1105 | /* | |||
| 1106 | * Get prefixes | |||
| 1107 | */ | |||
| 1108 | prefix = TRUE((boolean_t) 1); | |||
| 1109 | do { | |||
| 1110 | switch (inst) { | |||
| 1111 | case 0x66: /* data16 */ | |||
| 1112 | if (size == LONG2) | |||
| 1113 | size = WORD1; | |||
| 1114 | else | |||
| 1115 | size = LONG2; | |||
| 1116 | break; | |||
| 1117 | case 0x67: | |||
| 1118 | short_addr = !short_addr; | |||
| 1119 | break; | |||
| 1120 | case 0x26: | |||
| 1121 | seg = "%es"; | |||
| 1122 | break; | |||
| 1123 | case 0x36: | |||
| 1124 | seg = "%ss"; | |||
| 1125 | break; | |||
| 1126 | case 0x2e: | |||
| 1127 | seg = "%cs"; | |||
| 1128 | break; | |||
| 1129 | case 0x3e: | |||
| 1130 | seg = "%ds"; | |||
| 1131 | break; | |||
| 1132 | case 0x64: | |||
| 1133 | seg = "%fs"; | |||
| 1134 | break; | |||
| 1135 | case 0x65: | |||
| 1136 | seg = "%gs"; | |||
| 1137 | break; | |||
| 1138 | case 0xf0: | |||
| 1139 | db_printf("lock "); | |||
| 1140 | break; | |||
| 1141 | case 0xf2: | |||
| 1142 | db_printf("repne "); | |||
| 1143 | break; | |||
| 1144 | case 0xf3: | |||
| 1145 | db_printf("repe "); /* XXX repe VS rep */ | |||
| 1146 | break; | |||
| 1147 | default: | |||
| 1148 | prefix = FALSE((boolean_t) 0); | |||
| 1149 | break; | |||
| 1150 | } | |||
| 1151 | if (prefix) { | |||
| 1152 | get_value_inc(inst, loc, 1, FALSE, task)inst = db_get_task_value((loc), (1), (((boolean_t) 0)), (task )); (loc) += (1);; | |||
| 1153 | } | |||
| 1154 | } while (prefix); | |||
| 1155 | ||||
| 1156 | if (inst >= 0xd8 && inst <= 0xdf) { | |||
| 1157 | loc = db_disasm_esc(loc, inst, short_addr, size, seg, task); | |||
| 1158 | db_printf("\n"); | |||
| 1159 | return loc; | |||
| 1160 | } | |||
| 1161 | ||||
| 1162 | if (inst == 0x0f) { | |||
| 1163 | get_value_inc(inst, loc, 1, FALSE, task)inst = db_get_task_value((loc), (1), (((boolean_t) 0)), (task )); (loc) += (1);; | |||
| 1164 | ip = db_inst_0f[inst>>4]; | |||
| 1165 | if (ip == 0) { | |||
| 1166 | ip = &db_bad_inst; | |||
| 1167 | } | |||
| 1168 | else { | |||
| 1169 | ip = &ip[inst&0xf]; | |||
| 1170 | } | |||
| 1171 | } | |||
| 1172 | else | |||
| 1173 | ip = &db_inst_table[inst]; | |||
| 1174 | ||||
| 1175 | if (ip->i_has_modrm) { | |||
| 1176 | get_value_inc(regmodrm, loc, 1, FALSE, task)regmodrm = db_get_task_value((loc), (1), (((boolean_t) 0)), ( task)); (loc) += (1);; | |||
| 1177 | loc = db_read_address(loc, short_addr, regmodrm, &address, task); | |||
| 1178 | } | |||
| 1179 | ||||
| 1180 | i_name = ip->i_name; | |||
| 1181 | i_size = ip->i_size; | |||
| 1182 | i_mode = ip->i_mode; | |||
| 1183 | ||||
| 1184 | if (ip->i_extra == (char *)db_Grp1 || | |||
| 1185 | ip->i_extra == (char *)db_Grp2 || | |||
| 1186 | ip->i_extra == (char *)db_Grp6 || | |||
| 1187 | ip->i_extra == (char *)db_Grp7 || | |||
| 1188 | ip->i_extra == (char *)db_Grp8) { | |||
| 1189 | i_name = ((char **)ip->i_extra)[f_reg(regmodrm)(((regmodrm)>>3)&0x7)]; | |||
| 1190 | } | |||
| 1191 | else if (ip->i_extra == (char *)db_Grp3) { | |||
| 1192 | ip = (struct inst *)ip->i_extra; | |||
| 1193 | ip = &ip[f_reg(regmodrm)(((regmodrm)>>3)&0x7)]; | |||
| 1194 | i_name = ip->i_name; | |||
| 1195 | i_mode = ip->i_mode; | |||
| 1196 | } | |||
| 1197 | else if (ip->i_extra == (char *)db_Grp4 || | |||
| 1198 | ip->i_extra == (char *)db_Grp5) { | |||
| 1199 | ip = (struct inst *)ip->i_extra; | |||
| 1200 | ip = &ip[f_reg(regmodrm)(((regmodrm)>>3)&0x7)]; | |||
| 1201 | i_name = ip->i_name; | |||
| 1202 | i_mode = ip->i_mode; | |||
| 1203 | i_size = ip->i_size; | |||
| 1204 | } | |||
| 1205 | ||||
| 1206 | if (i_size == SDEP7) { | |||
| 1207 | if (size == WORD1) | |||
| 1208 | db_printf(i_name); | |||
| 1209 | else | |||
| 1210 | db_printf(ip->i_extra); | |||
| 1211 | } | |||
| 1212 | else { | |||
| 1213 | db_printf(i_name); | |||
| 1214 | if (i_size != NONE8) { | |||
| 1215 | if (i_size == BYTE0) { | |||
| 1216 | db_printf("b"); | |||
| 1217 | size = BYTE0; | |||
| 1218 | } | |||
| 1219 | else if (i_size == WORD1) { | |||
| 1220 | db_printf("w"); | |||
| 1221 | size = WORD1; | |||
| 1222 | } | |||
| 1223 | else if (size == WORD1) | |||
| 1224 | db_printf("w"); | |||
| 1225 | else | |||
| 1226 | db_printf("l"); | |||
| 1227 | } | |||
| 1228 | } | |||
| 1229 | db_printf("\t"); | |||
| 1230 | for (first = TRUE((boolean_t) 1); | |||
| 1231 | i_mode != 0; | |||
| 1232 | i_mode >>= 8, first = FALSE((boolean_t) 0)) | |||
| 1233 | { | |||
| 1234 | if (!first) | |||
| 1235 | db_printf(","); | |||
| 1236 | ||||
| 1237 | switch (i_mode & 0xFF) { | |||
| 1238 | ||||
| 1239 | case E1: | |||
| 1240 | db_print_address(seg, size, &address, task); | |||
| 1241 | break; | |||
| 1242 | ||||
| 1243 | case Eind2: | |||
| 1244 | db_printf("*"); | |||
| 1245 | db_print_address(seg, size, &address, task); | |||
| 1246 | break; | |||
| 1247 | ||||
| 1248 | case El3: | |||
| 1249 | db_print_address(seg, LONG2, &address, task); | |||
| 1250 | break; | |||
| 1251 | ||||
| 1252 | case Ew4: | |||
| 1253 | db_print_address(seg, WORD1, &address, task); | |||
| 1254 | break; | |||
| 1255 | ||||
| 1256 | case Eb5: | |||
| 1257 | db_print_address(seg, BYTE0, &address, task); | |||
| 1258 | break; | |||
| 1259 | ||||
| 1260 | case R6: | |||
| 1261 | db_printf("%s", db_reg[size][f_reg(regmodrm)(((regmodrm)>>3)&0x7)]); | |||
| 1262 | break; | |||
| 1263 | ||||
| 1264 | case Rw7: | |||
| 1265 | db_printf("%s", db_reg[WORD1][f_reg(regmodrm)(((regmodrm)>>3)&0x7)]); | |||
| 1266 | break; | |||
| 1267 | ||||
| 1268 | case Ri8: | |||
| 1269 | db_printf("%s", db_reg[size][f_rm(inst)((inst)&0x7)]); | |||
| 1270 | break; | |||
| 1271 | ||||
| 1272 | case S9: | |||
| 1273 | db_printf("%s", db_seg_reg[f_reg(regmodrm)(((regmodrm)>>3)&0x7)]); | |||
| 1274 | break; | |||
| 1275 | ||||
| 1276 | case Si10: | |||
| 1277 | db_printf("%s", db_seg_reg[f_reg(inst)(((inst)>>3)&0x7)]); | |||
| 1278 | break; | |||
| 1279 | ||||
| 1280 | case A11: | |||
| 1281 | db_printf("%s", db_reg[size][0]); /* acc */ | |||
| 1282 | break; | |||
| 1283 | ||||
| 1284 | case BX12: | |||
| 1285 | if (seg) | |||
| 1286 | db_printf("%s:", seg); | |||
| 1287 | db_printf("(%s)", short_addr ? "%bx" : "%ebx"); | |||
| 1288 | break; | |||
| 1289 | ||||
| 1290 | case CL13: | |||
| 1291 | db_printf("%%cl"); | |||
| 1292 | break; | |||
| 1293 | ||||
| 1294 | case DX14: | |||
| 1295 | db_printf("%%dx"); | |||
| 1296 | break; | |||
| 1297 | ||||
| 1298 | case SI15: | |||
| 1299 | if (seg) | |||
| 1300 | db_printf("%s:", seg); | |||
| 1301 | db_printf("(%s)", short_addr ? "%si" : "%esi"); | |||
| 1302 | break; | |||
| 1303 | ||||
| 1304 | case DI16: | |||
| 1305 | db_printf("%%es:(%s)", short_addr ? "%di" : "%edi"); | |||
| 1306 | break; | |||
| 1307 | ||||
| 1308 | case CR17: | |||
| 1309 | db_printf("%%cr%d", f_reg(regmodrm)(((regmodrm)>>3)&0x7)); | |||
| 1310 | break; | |||
| 1311 | ||||
| 1312 | case DR18: | |||
| 1313 | db_printf("%%dr%d", f_reg(regmodrm)(((regmodrm)>>3)&0x7)); | |||
| 1314 | break; | |||
| 1315 | ||||
| 1316 | case TR19: | |||
| 1317 | db_printf("%%tr%d", f_reg(regmodrm)(((regmodrm)>>3)&0x7)); | |||
| 1318 | break; | |||
| 1319 | ||||
| 1320 | case I20: | |||
| 1321 | len = db_lengths[size]; | |||
| 1322 | get_value_inc(imm, loc, len, FALSE, task)imm = db_get_task_value((loc), (len), (((boolean_t) 0)), (task )); (loc) += (len);;/* unsigned */ | |||
| 1323 | db_printf("$%#n", imm); | |||
| 1324 | break; | |||
| 1325 | ||||
| 1326 | case Is21: | |||
| 1327 | len = db_lengths[size]; | |||
| 1328 | get_value_inc(imm, loc, len, TRUE, task)imm = db_get_task_value((loc), (len), (((boolean_t) 1)), (task )); (loc) += (len);; /* signed */ | |||
| 1329 | db_printf("$%#r", imm); | |||
| 1330 | break; | |||
| 1331 | ||||
| 1332 | case Ib22: | |||
| 1333 | get_value_inc(imm, loc, 1, FALSE, task)imm = db_get_task_value((loc), (1), (((boolean_t) 0)), (task) ); (loc) += (1);; /* unsigned */ | |||
| 1334 | db_printf("$%#n", imm); | |||
| 1335 | break; | |||
| 1336 | ||||
| 1337 | case Iba36: | |||
| 1338 | get_value_inc(imm, loc, 1, FALSE, task)imm = db_get_task_value((loc), (1), (((boolean_t) 0)), (task) ); (loc) += (1);; | |||
| 1339 | if (imm != 0x0a) | |||
| 1340 | db_printf("$%#r", imm); | |||
| 1341 | break; | |||
| 1342 | ||||
| 1343 | case Ibs23: | |||
| 1344 | get_value_inc(imm, loc, 1, TRUE, task)imm = db_get_task_value((loc), (1), (((boolean_t) 1)), (task) ); (loc) += (1);; /* signed */ | |||
| 1345 | db_printf("$%#r", imm); | |||
| 1346 | break; | |||
| 1347 | ||||
| 1348 | case Iw24: | |||
| 1349 | get_value_inc(imm, loc, 2, FALSE, task)imm = db_get_task_value((loc), (2), (((boolean_t) 0)), (task) ); (loc) += (2);; /* unsigned */ | |||
| 1350 | db_printf("$%#n", imm); | |||
| 1351 | break; | |||
| 1352 | ||||
| 1353 | case Il25: | |||
| 1354 | get_value_inc(imm, loc, 4, FALSE, task)imm = db_get_task_value((loc), (4), (((boolean_t) 0)), (task) ); (loc) += (4);; | |||
| 1355 | db_printf("$%#n", imm); | |||
| 1356 | break; | |||
| 1357 | ||||
| 1358 | case O26: | |||
| 1359 | if (short_addr) { | |||
| 1360 | get_value_inc(displ, loc, 2, TRUE, task)displ = db_get_task_value((loc), (2), (((boolean_t) 1)), (task )); (loc) += (2);; | |||
| 1361 | } | |||
| 1362 | else { | |||
| 1363 | get_value_inc(displ, loc, 4, TRUE, task)displ = db_get_task_value((loc), (4), (((boolean_t) 1)), (task )); (loc) += (4);; | |||
| 1364 | } | |||
| 1365 | if (seg) | |||
| 1366 | db_printf("%s:%#r",seg, displ); | |||
| 1367 | else | |||
| 1368 | db_task_printsym((db_addr_t)displ, DB_STGY_ANY0, task); | |||
| 1369 | break; | |||
| 1370 | ||||
| 1371 | case Db27: | |||
| 1372 | get_value_inc(displ, loc, 1, TRUE, task)displ = db_get_task_value((loc), (1), (((boolean_t) 1)), (task )); (loc) += (1);; | |||
| 1373 | if (short_addr) { | |||
| 1374 | /* offset only affects low 16 bits */ | |||
| 1375 | displ = (loc & 0xffff0000) | |||
| 1376 | | ((loc + displ) & 0xffff); | |||
| 1377 | } | |||
| 1378 | else | |||
| 1379 | displ = displ + loc; | |||
| 1380 | db_task_printsym((db_addr_t)displ,DB_STGY_XTRN1,task); | |||
| 1381 | break; | |||
| 1382 | ||||
| 1383 | case Dl28: | |||
| 1384 | if (short_addr) { | |||
| 1385 | get_value_inc(displ, loc, 2, TRUE, task)displ = db_get_task_value((loc), (2), (((boolean_t) 1)), (task )); (loc) += (2);; | |||
| 1386 | /* offset only affects low 16 bits */ | |||
| 1387 | displ = (loc & 0xffff0000) | |||
| 1388 | | ((loc + displ) & 0xffff); | |||
| 1389 | } | |||
| 1390 | else { | |||
| 1391 | get_value_inc(displ, loc, 4, TRUE, task)displ = db_get_task_value((loc), (4), (((boolean_t) 1)), (task )); (loc) += (4);; | |||
| 1392 | displ = displ + loc; | |||
| 1393 | } | |||
| 1394 | db_task_printsym((db_addr_t)displ, DB_STGY_XTRN1, task); | |||
| 1395 | break; | |||
| 1396 | ||||
| 1397 | case o129: | |||
| 1398 | db_printf("$1"); | |||
| 1399 | break; | |||
| 1400 | ||||
| 1401 | case o330: | |||
| 1402 | db_printf("$3"); | |||
| 1403 | break; | |||
| 1404 | ||||
| 1405 | case OS31: | |||
| 1406 | if (short_addr) { | |||
| 1407 | get_value_inc(imm, loc, 2, FALSE, task)imm = db_get_task_value((loc), (2), (((boolean_t) 0)), (task) ); (loc) += (2);; /* offset */ | |||
| 1408 | } | |||
| 1409 | else { | |||
| 1410 | get_value_inc(imm, loc, 4, FALSE, task)imm = db_get_task_value((loc), (4), (((boolean_t) 0)), (task) ); (loc) += (4);; /* offset */ | |||
| 1411 | } | |||
| 1412 | get_value_inc(imm2, loc, 2, FALSE, task)imm2 = db_get_task_value((loc), (2), (((boolean_t) 0)), (task )); (loc) += (2);; /* segment */ | |||
| 1413 | db_printf("$%#n,%#n", imm2, imm); | |||
| 1414 | break; | |||
| 1415 | } | |||
| 1416 | } | |||
| 1417 | ||||
| 1418 | if (altfmt == 0 && !db_disasm_16) { | |||
| 1419 | if (inst == 0xe9 || inst == 0xeb) { | |||
| 1420 | /* | |||
| 1421 | * GAS pads to longword boundary after unconditional jumps. | |||
| 1422 | */ | |||
| 1423 | loc = (loc + (4-1)) & ~(4-1); | |||
| 1424 | } | |||
| 1425 | } | |||
| 1426 | db_printf("\n"); | |||
| 1427 | return loc; | |||
| 1428 | } | |||
| 1429 | ||||
| 1430 | #endif /* MACH_KDB */ |