Changeset 8336
- Timestamp:
- 04/23/08 18:03:03 (9 months ago)
- Files:
-
- trunk/include/VBox/dis.h (modified) (2 diffs)
- trunk/include/VBox/disopcode.h (modified) (6 diffs)
- trunk/src/VBox/Disassembler/DisasmCore.cpp (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/include/VBox/dis.h
r8333 r8336 145 145 #define USE_DISPLACEMENT16 RT_BIT_64(15) 146 146 #define USE_DISPLACEMENT32 RT_BIT_64(16) 147 #define USE_IMMEDIATE8 RT_BIT_64(17) 148 #define USE_IMMEDIATE8_REL RT_BIT_64(18) 149 #define USE_IMMEDIATE16 RT_BIT_64(19) 150 #define USE_IMMEDIATE16_REL RT_BIT_64(20) 151 #define USE_IMMEDIATE32 RT_BIT_64(21) 152 #define USE_IMMEDIATE32_REL RT_BIT_64(22) 153 #define USE_IMMEDIATE64 RT_BIT_64(23) 154 #define USE_IMMEDIATE_ADDR_0_32 RT_BIT_64(24) 155 #define USE_IMMEDIATE_ADDR_16_32 RT_BIT_64(25) 156 #define USE_IMMEDIATE_ADDR_0_16 RT_BIT_64(26) 157 #define USE_IMMEDIATE_ADDR_16_16 RT_BIT_64(27) 147 #define USE_DISPLACEMENT64 RT_BIT_64(17) 148 #define USE_IMMEDIATE8 RT_BIT_64(18) 149 #define USE_IMMEDIATE8_REL RT_BIT_64(19) 150 #define USE_IMMEDIATE16 RT_BIT_64(20) 151 #define USE_IMMEDIATE16_REL RT_BIT_64(21) 152 #define USE_IMMEDIATE32 RT_BIT_64(22) 153 #define USE_IMMEDIATE32_REL RT_BIT_64(23) 154 #define USE_IMMEDIATE64 RT_BIT_64(24) 155 #define USE_IMMEDIATE_ADDR_0_32 RT_BIT_64(25) 156 #define USE_IMMEDIATE_ADDR_16_32 RT_BIT_64(26) 157 #define USE_IMMEDIATE_ADDR_0_16 RT_BIT_64(27) 158 #define USE_IMMEDIATE_ADDR_16_16 RT_BIT_64(28) 158 159 /** DS:ESI */ 159 #define USE_POINTER_DS_BASED RT_BIT_64(2 8)160 #define USE_POINTER_DS_BASED RT_BIT_64(29) 160 161 /** ES:EDI */ 161 #define USE_POINTER_ES_BASED RT_BIT_64( 29)162 #define USE_IMMEDIATE16_SX8 RT_BIT_64(3 0)163 #define USE_IMMEDIATE32_SX8 RT_BIT_64(3 1)162 #define USE_POINTER_ES_BASED RT_BIT_64(30) 163 #define USE_IMMEDIATE16_SX8 RT_BIT_64(31) 164 #define USE_IMMEDIATE32_SX8 RT_BIT_64(32) 164 165 165 166 #define USE_IMMEDIATE (USE_IMMEDIATE8|USE_IMMEDIATE16|USE_IMMEDIATE32|USE_IMMEDIATE64|USE_IMMEDIATE8_REL|USE_IMMEDIATE16_REL|USE_IMMEDIATE32_REL|USE_IMMEDIATE_ADDR_0_32|USE_IMMEDIATE_ADDR_16_32|USE_IMMEDIATE_ADDR_0_16|USE_IMMEDIATE_ADDR_16_16|USE_IMMEDIATE16_SX8|USE_IMMEDIATE32_SX8) … … 335 336 336 337 int32_t disp8, disp16, disp32; 337 338 338 uint32_t size; 339 339 340 int64_t disp64; 340 341 uint64_t flags; 341 342 trunk/include/VBox/disopcode.h
r8299 r8336 616 616 #define OP_PARM_REG_ESI 7 617 617 #define OP_PARM_REG_EDI 8 618 #define OP_PARM_REG_GEN32_END OP_PARM_REG_EDI 618 619 619 620 #define OP_PARM_REG_ES 9 … … 624 625 #define OP_PARM_REG_FS 13 625 626 #define OP_PARM_REG_GS 14 627 #define OP_PARM_REG_SEG_END OP_PARM_REG_GS 626 628 627 629 #define OP_PARM_REG_AX 15 … … 634 636 #define OP_PARM_REG_SI 21 635 637 #define OP_PARM_REG_DI 22 638 #define OP_PARM_REG_GEN16_END OP_PARM_REG_DI 636 639 637 640 #define OP_PARM_REG_AL 23 … … 644 647 #define OP_PARM_REG_DH 29 645 648 #define OP_PARM_REG_BH 30 649 #define OP_PARM_REG_GEN8_END OP_PARM_REG_BH 646 650 647 651 #define OP_PARM_REGFP_0 31 … … 654 658 #define OP_PARM_REGFP_6 37 655 659 #define OP_PARM_REGFP_7 38 660 #define OP_PARM_REG_FP_END OP_PARM_REGFP_7 656 661 657 662 #define OP_PARM_NTA 39 … … 697 702 #define OP_PARM_REG_R14 114 698 703 #define OP_PARM_REG_R15 115 704 #define OP_PARM_REG_GEN64_END OP_PARM_REG_R15 699 705 700 706 trunk/src/VBox/Disassembler/DisasmCore.cpp
r8333 r8336 1222 1222 } 1223 1223 else 1224 if (pCpu->addrmode == CPUMODE_64BIT) 1225 { 1226 Assert(OP_PARM_VSUBTYPE(pParam->param) != OP_PARM_p); 1227 /* near 64 bits pointer */ 1228 /* 1229 * Note: used only in "mov al|ax|eax, [Addr]" and "mov [Addr], al|ax|eax" 1230 * so we treat it like displacement. 1231 */ 1232 pParam->disp64 = DISReadQWord(pCpu, lpszCodeBlock); 1233 pParam->flags |= USE_DISPLACEMENT64; 1234 1235 disasmAddStringF(pParam->szParam, sizeof(pParam->szParam), "[0%08X%08Xh]", (uint32_t)(pParam->disp64 >> 32), (uint32_t)pParam->disp64); 1236 return sizeof(uint32_t); 1237 } 1238 else 1224 1239 { 1225 1240 if (OP_PARM_VSUBTYPE(pParam->param) == OP_PARM_p) … … 1260 1275 } 1261 1276 } 1277 if (pCpu->addrmode == CPUMODE_64BIT) 1278 { 1279 return sizeof(uint64_t); 1280 } 1262 1281 else 1263 1282 { … … 1286 1305 } 1287 1306 1288 if (pParam->param < OP_PARM_REG_SEG_START)1307 if (pParam->param <= OP_PARM_REG_GEN32_END) 1289 1308 { 1290 1309 /* 32-bit EAX..EDI registers. */ … … 1296 1315 pParam->flags |= USE_REG_GEN32; 1297 1316 pParam->size = 4; 1317 } 1318 else 1319 if (pCpu->opmode == CPUMODE_64BIT) 1320 { 1321 /* Use 64-bit registers. */ 1322 pParam->base.reg_gen = pParam->param - OP_PARM_REG_GEN32_START; 1323 if ( (pCpu->prefix & PREFIX_REX) 1324 && (pCpu->prefix_rex & PREFIX_REX_FLAGS)) 1325 pParam->base.reg_gen += 8; 1326 1327 pParam->flags |= USE_REG_GEN64; 1328 pParam->size = 8; 1298 1329 } 1299 1330 else … … 1307 1338 } 1308 1339 else 1309 if (pParam->param < OP_PARM_REG_GEN16_START)1340 if (pParam->param <= OP_PARM_REG_SEG_END) 1310 1341 { 1311 1342 /* Segment ES..GS registers. */ … … 1315 1346 } 1316 1347 else 1317 if (pParam->param < OP_PARM_REG_GEN8_START)1348 if (pParam->param <= OP_PARM_REG_GEN16_END) 1318 1349 { 1319 1350 /* 16-bit AX..DI registers. */ … … 1323 1354 } 1324 1355 else 1325 if (pParam->param < OP_PARM_REG_FP_START)1356 if (pParam->param <= OP_PARM_REG_GEN8_END) 1326 1357 { 1327 1358 /* 8-bit AL..DL, AH..DH registers. */ … … 1331 1362 } 1332 1363 else 1333 if (pParam->param <= OP_PARM_REG FP_7)1364 if (pParam->param <= OP_PARM_REG_FP_END) 1334 1365 { 1335 1366 /* FPU registers. */ … … 1356 1387 } 1357 1388 else 1389 if (pCpu->addrmode == CPUMODE_64BIT) 1390 { 1391 pParam->base.reg_gen = USE_REG_RSI; 1392 pParam->flags |= USE_REG_GEN64; 1393 } 1394 else 1358 1395 { 1359 1396 pParam->base.reg_gen = USE_REG_SI; … … 1375 1412 } 1376 1413 else 1414 if (pCpu->addrmode == CPUMODE_64BIT) 1415 { 1416 pParam->base.reg_gen = USE_REG_RSI; 1417 pParam->flags |= USE_REG_GEN64; 1418 } 1419 else 1377 1420 { 1378 1421 pParam->base.reg_gen = USE_REG_SI; … … 1395 1438 } 1396 1439 else 1440 if (pCpu->addrmode == CPUMODE_64BIT) 1441 { 1442 pParam->base.reg_gen = USE_REG_RDI; 1443 pParam->flags |= USE_REG_GEN64; 1444 } 1445 else 1397 1446 { 1398 1447 pParam->base.reg_gen = USE_REG_DI; … … 1412 1461 pParam->base.reg_gen = USE_REG_EDI; 1413 1462 pParam->flags |= USE_REG_GEN32; 1463 } 1464 else 1465 if (pCpu->addrmode == CPUMODE_64BIT) 1466 { 1467 pParam->base.reg_gen = USE_REG_RDI; 1468 pParam->flags |= USE_REG_GEN64; 1414 1469 } 1415 1470 else … … 1506 1561 //little hack to make sure the ModRM byte is included in the returned size 1507 1562 if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 1508 {1509 1563 size = sizeof(uint8_t); //ModRM byte 1510 }1511 1564 1512 1565 size += ParseInstruction(lpszCodeBlock, pOp, pCpu); … … 1861 1914 #if !defined(DIS_CORE_ONLY) && defined(LOG_ENABLED) 1862 1915 const char *szModRMReg8[] = {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH"}; 1916 const char *szModRMReg8_64[] = {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH", "R8L", "R9L", "R10L", "R11L", "R12L", "R13L", "R14L", "R15L"}; 1863 1917 const char *szModRMReg16[] = {"AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI"}; 1864 1918 const char *szModRMReg32[] = {"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"};

