From e31a9119ff04435fef5bd0e92aa1ce5d79e70c08 Mon Sep 17 00:00:00 2001 From: flobernd Date: Thu, 30 Oct 2014 01:00:05 +0100 Subject: [PATCH] Added performance test Some minor bugfixes --- .../CustomDataSource/CustomDataSource.vcxproj | 8 +- Examples/Examples.sln | 38 ++++- Examples/PerformanceTest/Main.cpp | 121 ++++++++++++++ .../PerformanceTest/PerformanceTest.vcxproj | 157 ++++++++++++++++++ .../PerformanceTest.vcxproj.filters | 6 + Examples/SimpleDemo/SimpleDemo.vcxproj | 8 +- .../SymbolResolver/SymbolResolver.vcxproj | 10 +- OptableGenerator/OptableGenerator.vcxproj | 8 +- .../VXInstructionDecoder.cpp | 3 +- .../VXInstructionFormatter.cpp | 11 +- 10 files changed, 344 insertions(+), 26 deletions(-) create mode 100644 Examples/PerformanceTest/Main.cpp create mode 100644 Examples/PerformanceTest/PerformanceTest.vcxproj create mode 100644 Examples/PerformanceTest/PerformanceTest.vcxproj.filters diff --git a/Examples/CustomDataSource/CustomDataSource.vcxproj b/Examples/CustomDataSource/CustomDataSource.vcxproj index 2c8b641..6e9f686 100644 --- a/Examples/CustomDataSource/CustomDataSource.vcxproj +++ b/Examples/CustomDataSource/CustomDataSource.vcxproj @@ -69,19 +69,19 @@ true - ../../VerteronDisassemblerEngine/;$(IncludePath) + ..\..\VerteronDisassemblerEngine\;$(IncludePath) true - ../../VerteronDisassemblerEngine/;$(IncludePath) + ..\..\VerteronDisassemblerEngine\;$(IncludePath) false - ../../VerteronDisassemblerEngine/;$(IncludePath) + ..\..\VerteronDisassemblerEngine\;$(IncludePath) false - ../../VerteronDisassemblerEngine/;$(IncludePath) + ..\..\VerteronDisassemblerEngine\;$(IncludePath) diff --git a/Examples/Examples.sln b/Examples/Examples.sln index 3f1cf9a..a700b31 100644 --- a/Examples/Examples.sln +++ b/Examples/Examples.sln @@ -3,54 +3,86 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.30723.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SimpleDemo", "SimpleDemo\SimpleDemo.vcxproj", "{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "1 - Simple Demo", "SimpleDemo\SimpleDemo.vcxproj", "{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CustomDataSource", "CustomDataSource\CustomDataSource.vcxproj", "{EB0F5A04-EE14-4779-9B29-322876CD45C8}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "2 - Custom DataSource", "CustomDataSource\CustomDataSource.vcxproj", "{EB0F5A04-EE14-4779-9B29-322876CD45C8}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SymbolResolver", "SymbolResolver\SymbolResolver.vcxproj", "{B6CA4362-2714-451C-8063-12195ABD7CD7}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "3 - Symbol Resolver", "SymbolResolver\SymbolResolver.vcxproj", "{B6CA4362-2714-451C-8063-12195ABD7CD7}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VerteronDisassemblerEngine", "..\VerteronDisassemblerEngine\VerteronDisassemblerEngine.vcxproj", "{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "4 - Performance Test", "PerformanceTest\PerformanceTest.vcxproj", "{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Debug|Win32.ActiveCfg = Debug|Win32 {BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Debug|Win32.Build.0 = Debug|Win32 {BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Debug|x64.ActiveCfg = Debug|x64 {BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Debug|x64.Build.0 = Debug|x64 + {BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Release|Mixed Platforms.Build.0 = Release|Win32 {BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Release|Win32.ActiveCfg = Release|Win32 {BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Release|Win32.Build.0 = Release|Win32 {BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Release|x64.ActiveCfg = Release|x64 {BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Release|x64.Build.0 = Release|x64 + {EB0F5A04-EE14-4779-9B29-322876CD45C8}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {EB0F5A04-EE14-4779-9B29-322876CD45C8}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {EB0F5A04-EE14-4779-9B29-322876CD45C8}.Debug|Win32.ActiveCfg = Debug|Win32 {EB0F5A04-EE14-4779-9B29-322876CD45C8}.Debug|Win32.Build.0 = Debug|Win32 {EB0F5A04-EE14-4779-9B29-322876CD45C8}.Debug|x64.ActiveCfg = Debug|x64 {EB0F5A04-EE14-4779-9B29-322876CD45C8}.Debug|x64.Build.0 = Debug|x64 + {EB0F5A04-EE14-4779-9B29-322876CD45C8}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {EB0F5A04-EE14-4779-9B29-322876CD45C8}.Release|Mixed Platforms.Build.0 = Release|Win32 {EB0F5A04-EE14-4779-9B29-322876CD45C8}.Release|Win32.ActiveCfg = Release|Win32 {EB0F5A04-EE14-4779-9B29-322876CD45C8}.Release|Win32.Build.0 = Release|Win32 {EB0F5A04-EE14-4779-9B29-322876CD45C8}.Release|x64.ActiveCfg = Release|x64 {EB0F5A04-EE14-4779-9B29-322876CD45C8}.Release|x64.Build.0 = Release|x64 + {B6CA4362-2714-451C-8063-12195ABD7CD7}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {B6CA4362-2714-451C-8063-12195ABD7CD7}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {B6CA4362-2714-451C-8063-12195ABD7CD7}.Debug|Win32.ActiveCfg = Debug|Win32 {B6CA4362-2714-451C-8063-12195ABD7CD7}.Debug|Win32.Build.0 = Debug|Win32 {B6CA4362-2714-451C-8063-12195ABD7CD7}.Debug|x64.ActiveCfg = Debug|x64 {B6CA4362-2714-451C-8063-12195ABD7CD7}.Debug|x64.Build.0 = Debug|x64 + {B6CA4362-2714-451C-8063-12195ABD7CD7}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {B6CA4362-2714-451C-8063-12195ABD7CD7}.Release|Mixed Platforms.Build.0 = Release|Win32 {B6CA4362-2714-451C-8063-12195ABD7CD7}.Release|Win32.ActiveCfg = Release|Win32 {B6CA4362-2714-451C-8063-12195ABD7CD7}.Release|Win32.Build.0 = Release|Win32 {B6CA4362-2714-451C-8063-12195ABD7CD7}.Release|x64.ActiveCfg = Release|x64 {B6CA4362-2714-451C-8063-12195ABD7CD7}.Release|x64.Build.0 = Release|x64 + {F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|Win32.ActiveCfg = Debug|Win32 {F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|Win32.Build.0 = Debug|Win32 {F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|x64.ActiveCfg = Debug|x64 {F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|x64.Build.0 = Debug|x64 + {F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|Mixed Platforms.Build.0 = Release|Win32 {F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|Win32.ActiveCfg = Release|Win32 {F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|Win32.Build.0 = Release|Win32 {F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|x64.ActiveCfg = Release|x64 {F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|x64.Build.0 = Release|x64 + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Debug|Win32.ActiveCfg = Debug|Win32 + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Debug|Win32.Build.0 = Debug|Win32 + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Debug|x64.ActiveCfg = Debug|x64 + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Debug|x64.Build.0 = Debug|x64 + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Release|Win32.ActiveCfg = Release|Win32 + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Release|Win32.Build.0 = Release|Win32 + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Release|x64.ActiveCfg = Release|x64 + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Examples/PerformanceTest/Main.cpp b/Examples/PerformanceTest/Main.cpp new file mode 100644 index 0000000..bb1f9e6 --- /dev/null +++ b/Examples/PerformanceTest/Main.cpp @@ -0,0 +1,121 @@ +/************************************************************************************************** + + Verteron Disassembler Engine + Version 1.0 + + Remarks : Freeware, Copyright must be included + + Original Author : Florian Bernd + Modifications : + + Last change : 29. October 2014 + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +**************************************************************************************************/ +#include +#include +#include +#include "VXDisassembler.h" +#include + +using namespace Verteron; +using namespace Disassembler; + +void testDecodingAndFormatting(uintptr_t baseAddress, PIMAGE_NT_HEADERS ntHeaders) +{ + VXInstructionInfo info; + VXInstructionDecoder decoder; + VXIntelInstructionFormatter formatter; + decoder.setDisassemblerMode(VXDisassemblerMode::M64BIT); + PIMAGE_SECTION_HEADER sectionHeader = + reinterpret_cast( + reinterpret_cast(ntHeaders) + sizeof(IMAGE_NT_HEADERS) + + ntHeaders->FileHeader.SizeOfOptionalHeader - sizeof(IMAGE_OPTIONAL_HEADER)); + // Decode all code sections + for (unsigned int i = 0; i < ntHeaders->FileHeader.NumberOfSections; ++i) + { + if (sectionHeader->Characteristics & IMAGE_SCN_CNT_CODE) + { + std::cout << sectionHeader->SizeOfRawData / 1024 << " KiB" << std::endl; + VXMemoryDataSource input(reinterpret_cast( + baseAddress + sectionHeader->VirtualAddress), sectionHeader->SizeOfRawData); + decoder.setDataSource(&input); + decoder.setInstructionPointer(baseAddress + sectionHeader->VirtualAddress); + while (decoder.decodeInstruction(info)) + { + + } + } + sectionHeader++; + } +} + +int _tmain(int argc, _TCHAR* argv[]) +{ + + // Find kernel32.dll in memory + void *ntdllBase = GetModuleHandle(L"kernel32.dll"); + PIMAGE_DOS_HEADER dosHeader = static_cast(ntdllBase); + if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE) + { + std::cout << "Error: kernel32.dll is corrupted."; + return 1; + } + PIMAGE_NT_HEADERS ntHeaders = + reinterpret_cast( + reinterpret_cast(dosHeader) + dosHeader->e_lfanew); + if (ntHeaders->Signature != IMAGE_NT_SIGNATURE) + { + std::cout << "Error: kernel32.dll is corrupted."; + return 1; + } + + double pcFrequency = 0.0; + uint64_t pcStart = 0; + LARGE_INTEGER li; + + // Start the performance counter + if (!QueryPerformanceFrequency(&li)) + { + std::cout << "Error: QueryPerformanceFrequency failed."; + return 1; + } + pcFrequency = static_cast(li.QuadPart) / 1000.0; + if (!QueryPerformanceCounter(&li)) + { + std::cout << "Error: QueryPerformanceCounter failed."; + return 1; + } + pcStart = li.QuadPart; + // Perform decoding test + testDecodingAndFormatting(reinterpret_cast(ntdllBase), ntHeaders); + // Stop the performance counter + if (!QueryPerformanceCounter(&li)) + { + std::cout << "Error: QueryPerformanceCounter failed."; + return 1; + } + std::cout << "Time: " << static_cast(li.QuadPart - pcStart) / pcFrequency + << std::endl; + + std::cin.get(); + + return 0; +} diff --git a/Examples/PerformanceTest/PerformanceTest.vcxproj b/Examples/PerformanceTest/PerformanceTest.vcxproj new file mode 100644 index 0000000..87e34c4 --- /dev/null +++ b/Examples/PerformanceTest/PerformanceTest.vcxproj @@ -0,0 +1,157 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {4A0B7BE7-72C9-4A95-90CA-D56C50F10401} + Win32Proj + PerformanceTest + 4 - Performance Test + + + + Application + true + v120 + Unicode + + + Application + true + v120 + Unicode + + + Application + false + v120 + true + Unicode + + + Application + false + v120 + true + Unicode + + + + + + + + + + + + + + + + + + + true + ..\..\VerteronDisassemblerEngine\;$(IncludePath) + + + true + ..\..\VerteronDisassemblerEngine\;$(IncludePath) + + + false + ..\..\VerteronDisassemblerEngine\;$(IncludePath) + + + false + ..\..\VerteronDisassemblerEngine\;$(IncludePath) + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + + + Console + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + + + Console + true + true + true + + + + + + + + {f5c6f0a7-f75d-42bd-a8ab-a2d1d5f67099} + + + + + + \ No newline at end of file diff --git a/Examples/PerformanceTest/PerformanceTest.vcxproj.filters b/Examples/PerformanceTest/PerformanceTest.vcxproj.filters new file mode 100644 index 0000000..d3e9077 --- /dev/null +++ b/Examples/PerformanceTest/PerformanceTest.vcxproj.filters @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Examples/SimpleDemo/SimpleDemo.vcxproj b/Examples/SimpleDemo/SimpleDemo.vcxproj index 9b7971d..15332e3 100644 --- a/Examples/SimpleDemo/SimpleDemo.vcxproj +++ b/Examples/SimpleDemo/SimpleDemo.vcxproj @@ -69,19 +69,19 @@ true - ../../VerteronDisassemblerEngine/;$(IncludePath) + ..\..\VerteronDisassemblerEngine\;$(IncludePath) true - ../../VerteronDisassemblerEngine/;$(IncludePath) + ..\..\VerteronDisassemblerEngine\;$(IncludePath) false - ../../VerteronDisassemblerEngine/;$(IncludePath) + ..\..\VerteronDisassemblerEngine\;$(IncludePath) false - ../../VerteronDisassemblerEngine/;$(IncludePath) + ..\..\VerteronDisassemblerEngine\;$(IncludePath) diff --git a/Examples/SymbolResolver/SymbolResolver.vcxproj b/Examples/SymbolResolver/SymbolResolver.vcxproj index fab1ded..adcc661 100644 --- a/Examples/SymbolResolver/SymbolResolver.vcxproj +++ b/Examples/SymbolResolver/SymbolResolver.vcxproj @@ -22,7 +22,7 @@ {B6CA4362-2714-451C-8063-12195ABD7CD7} Win32Proj SymbolResolver - 3 - SymbolResolver + 3 - Symbol Resolver @@ -69,19 +69,19 @@ true - ../../VerteronDisassemblerEngine/;$(IncludePath) + ..\..\VerteronDisassemblerEngine\;$(IncludePath) true - ../../VerteronDisassemblerEngine/;$(IncludePath) + ..\..\VerteronDisassemblerEngine\;$(IncludePath) false - ../../VerteronDisassemblerEngine/;$(IncludePath) + ..\..\VerteronDisassemblerEngine\;$(IncludePath) false - ../../VerteronDisassemblerEngine/;$(IncludePath) + ..\..\VerteronDisassemblerEngine\;$(IncludePath) diff --git a/OptableGenerator/OptableGenerator.vcxproj b/OptableGenerator/OptableGenerator.vcxproj index 1635741..f194f5b 100644 --- a/OptableGenerator/OptableGenerator.vcxproj +++ b/OptableGenerator/OptableGenerator.vcxproj @@ -68,19 +68,19 @@ true - ../VerteronDisassemblerEngine/;$(IncludePath) + ..\VerteronDisassemblerEngine\;$(IncludePath) true - ../VerteronDisassemblerEngine/;$(IncludePath) + ..\VerteronDisassemblerEngine\;$(IncludePath) false - ../VerteronDisassemblerEngine/;$(IncludePath) + ..\VerteronDisassemblerEngine\;$(IncludePath) false - ../VerteronDisassemblerEngine/;$(IncludePath) + ..\VerteronDisassemblerEngine\;$(IncludePath) diff --git a/VerteronDisassemblerEngine/VXInstructionDecoder.cpp b/VerteronDisassemblerEngine/VXInstructionDecoder.cpp index 492c39c..16c3552 100644 --- a/VerteronDisassemblerEngine/VXInstructionDecoder.cpp +++ b/VerteronDisassemblerEngine/VXInstructionDecoder.cpp @@ -493,7 +493,7 @@ bool VXInstructionDecoder::decodeOperands(VXInstructionInfo& info) { if (info.operand[i - 1].type != VXOperandType::NONE) { - info.operand[i - 1].access_mode = VXOperandAccessMode::READ; + info.operand[i].access_mode = VXOperandAccessMode::READ; if (!decodeOperand(info, info.operand[i], info.instrDefinition->operand[i].type, info.instrDefinition->operand[i].size)) { @@ -502,6 +502,7 @@ bool VXInstructionDecoder::decodeOperands(VXInstructionInfo& info) } } // Update operand access modes + info.operand[0].access_mode = VXOperandAccessMode::READ; if (info.operand[0].type != VXOperandType::NONE) { if (info.instrDefinition->flags & IDF_OPERAND1_WRITE) diff --git a/VerteronDisassemblerEngine/VXInstructionFormatter.cpp b/VerteronDisassemblerEngine/VXInstructionFormatter.cpp index ef2617b..aca7cc8 100644 --- a/VerteronDisassemblerEngine/VXInstructionFormatter.cpp +++ b/VerteronDisassemblerEngine/VXInstructionFormatter.cpp @@ -256,11 +256,12 @@ void VXIntelInstructionFormatter::formatOperand(const VXInstructionInfo &info, outputAppendFormatted("%s:", registerToString(info.segment)); } outputAppend("["); - if (operand.base == VXRegister::RIP) - { - // TODO: Add option - outputAppendAddress(info, calcAbsoluteTarget(info, operand)); - } else + // TODO: Fix zero sized memory operands (lea eax, [rip+1] | lidt [0]) + //if (operand.base == VXRegister::RIP) + //{ + // // TODO: Add option + // outputAppendAddress(info, calcAbsoluteTarget(info, operand)); + //} else { if (operand.base != VXRegister::NONE) {