Changeset 8336 in vbox for trunk/src/VBox/Disassembler
- Timestamp:
- Apr 23, 2008 4:03:03 PM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 30104
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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"};
Note:
See TracChangeset
for help on using the changeset viewer.