--- np2/i386c/ia32/resolve.c 2003/12/08 00:55:31 1.1 +++ np2/i386c/ia32/resolve.c 2004/01/23 14:33:26 1.4 @@ -1,4 +1,4 @@ -/* $Id: resolve.c,v 1.1 2003/12/08 00:55:31 yui Exp $ */ +/* $Id: resolve.c,v 1.4 2004/01/23 14:33:26 monaka Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -40,6 +40,8 @@ DWORD calc_ea_dst(DWORD op) { + __ASSERT(op < 0x100); + if (!CPU_INST_AS32) return ((*calc_ea_dst_tbl[op])() & 0xffff); return (*calc_ea32_dst_tbl[op])(); @@ -352,11 +354,10 @@ ea32_sib(void) DWORD base, idx, scale; GET_PCBYTE(op); - dst = 0; /* compiler happy */ - base = op & 7; idx = (op >> 3) & 7; scale = (op >> 6) & 3; + switch (base) { case 0: case 1: case 2: case 3: case 6: case 7: CPU_INST_SEGREG_INDEX = DS_FIX; @@ -372,6 +373,11 @@ ea32_sib(void) CPU_INST_SEGREG_INDEX = DS_FIX; GET_PCDWORD(dst); break; + + default: + dst = 0; /* compiler happy */ + ia32_panic("ea32_sib: invalid base = %d", base); + break; } if (idx != 4) dst += CPU_REGS_DWORD(idx) << scale; @@ -452,11 +458,12 @@ ea32_sib_disp8(void) DWORD base, idx, scale; GET_PCBYTE(op); - GET_PCBYTESD(adrs); - base = op & 7; idx = (op >> 3) & 7; scale = (op >> 6) & 3; + + GET_PCBYTESD(adrs); + switch (base) { case 0: case 1: case 2: case 3: case 6: case 7: CPU_INST_SEGREG_INDEX = DS_FIX; @@ -549,11 +556,12 @@ ea32_sib_disp32(void) DWORD base, idx, scale; GET_PCBYTE(op); - GET_PCDWORD(adrs); - base = op & 7; idx = (op >> 3) & 7; scale = (op >> 6) & 3; + + GET_PCDWORD(adrs); + switch (base) { case 0: case 1: case 2: case 3: case 6: case 7: CPU_INST_SEGREG_INDEX = DS_FIX;