mirror of https://github.com/icedland/iced.git
Add instr tests
This commit is contained in:
parent
5c1f873225
commit
12f2310984
|
@ -310,6 +310,11 @@
|
|||
<Compile Include="Intel\FormatterTests\SymbolResolverTestInfos.cs" />
|
||||
<Compile Include="Intel\FormatterTests\SymbolResolverTests.cs" />
|
||||
<Compile Include="Intel\FormatterTests\TestSymbolResolver.cs" />
|
||||
<Compile Include="Intel\InstructionTests\GetVirtualAddressTests.cs" />
|
||||
<Compile Include="Intel\InstructionTests\GetVirtualAddressTests16.cs" />
|
||||
<Compile Include="Intel\InstructionTests\GetVirtualAddressTests32.cs" />
|
||||
<Compile Include="Intel\InstructionTests\GetVirtualAddressTests64.cs" />
|
||||
<Compile Include="Intel\InstructionTests\InstructionTests_Misc.cs" />
|
||||
<Compile Include="Intel\MemorySizeTests.cs" />
|
||||
<Compile Include="Intel\RegisterTests.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
Copyright (C) 2018 de4dot@gmail.com
|
||||
|
||||
This file is part of Iced.
|
||||
|
||||
Iced is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Iced is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with Iced. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Iced.Intel;
|
||||
using Xunit;
|
||||
|
||||
namespace Iced.UnitTests.Intel.InstructionTests {
|
||||
sealed class VARegisterValueProviderImpl : IVARegisterValueProvider {
|
||||
readonly (Register register, int elementIndex, int elementSize, ulong value)[] results;
|
||||
|
||||
public VARegisterValueProviderImpl(params (Register register, ulong value)[] results) =>
|
||||
this.results = results.Select(a => (a.register, 0, 0, a.value)).ToArray();
|
||||
|
||||
public VARegisterValueProviderImpl(params (Register register, int elementIndex, int elementSize, ulong value)[] results) =>
|
||||
this.results = results;
|
||||
|
||||
public ulong GetRegisterValue(Register register, int elementIndex, int elementSize) {
|
||||
var results = this.results;
|
||||
for (int i = 0; i < results.Length; i++) {
|
||||
ref var info = ref results[i];
|
||||
if (info.register != register || info.elementIndex != elementIndex || info.elementSize != elementSize)
|
||||
continue;
|
||||
return info.value;
|
||||
}
|
||||
Assert.True(false);
|
||||
throw new InvalidOperationException();
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class GetVirtualAddressTests {
|
||||
private protected void TestBase(int bitness, string hexBytes, int operand, ulong expectedValue, VARegisterValueProviderImpl getRegValue) =>
|
||||
TestBase(bitness, hexBytes, operand, 0, expectedValue, getRegValue);
|
||||
|
||||
private protected void TestBase(int bitness, string hexBytes, int operand, int elementIndex, ulong expectedValue, VARegisterValueProviderImpl getRegValue) {
|
||||
var decoder = Decoder.Create(bitness, new ByteArrayCodeReader(hexBytes));
|
||||
switch (bitness) {
|
||||
case 16:
|
||||
decoder.InstructionPointer = DecoderConstants.DEFAULT_IP16;
|
||||
break;
|
||||
case 32:
|
||||
decoder.InstructionPointer = DecoderConstants.DEFAULT_IP32;
|
||||
break;
|
||||
case 64:
|
||||
decoder.InstructionPointer = DecoderConstants.DEFAULT_IP64;
|
||||
break;
|
||||
default:
|
||||
throw new InvalidOperationException();
|
||||
}
|
||||
var instr = decoder.Decode();
|
||||
ulong value1 = instr.GetVirtualAddress(operand, elementIndex, getRegValue);
|
||||
Assert.Equal(expectedValue, value1);
|
||||
ulong value2 = instr.GetVirtualAddress(operand, elementIndex, (register, elementIndex2, elementSize) =>
|
||||
getRegValue.GetRegisterValue(register, elementIndex2, elementSize));
|
||||
Assert.Equal(expectedValue, value2);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,159 @@
|
|||
/*
|
||||
Copyright (C) 2018 de4dot@gmail.com
|
||||
|
||||
This file is part of Iced.
|
||||
|
||||
Iced is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Iced is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with Iced. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using Iced.Intel;
|
||||
using Xunit;
|
||||
|
||||
namespace Iced.UnitTests.Intel.InstructionTests {
|
||||
public sealed class GetVirtualAddressTests16 : GetVirtualAddressTests {
|
||||
const int bitness = 16;
|
||||
|
||||
[Fact]
|
||||
void MemorySegSI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.SI, 0x123456789ABCE5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "A5", 1, 0x7654321001242B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegSI_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.SI, 0x123456789ABCE5D1), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 A5", 1, 0x7654321001242B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegESI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.ESI, 0x12345678FEDCBA8A), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "67 A5", 1, 0x76543210FFFFFFF1, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegESI_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.ESI, 0x12345678FEDCBA8A), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 67 A5", 1, 0x76543210FFFFFFF1, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemoryESDI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.DI, 0x123456789ABCE5D1), (Register.ES, 0x7654321001234567));
|
||||
TestBase(bitness, "A5", 0, 0x7654321001242B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemoryESEDI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDI, 0x12345678FEDCBA8A), (Register.ES, 0x7654321001234567));
|
||||
TestBase(bitness, "67 A5", 0, 0x76543210FFFFFFF1, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegDI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.DI, 0x123456789ABCE5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "C5F9 F7 D3", 0, 0x7654321001242B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegDI_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.DI, 0x123456789ABCE5D1), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 C5F9 F7 D3", 0, 0x7654321001242B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegEDI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDI, 0x12345678FEDCBA8A), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "67 C5F9 F7 D3", 0, 0x76543210FFFFFFF1, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegEDI_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDI, 0x12345678FEDCBA8A), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 67 C5F9 F7 D3", 0, 0x76543210FFFFFFF1, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_1() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 06 5AA5", 0, 0x765432100123EAC1, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_1_gs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.GS, 0x7654321001234567));
|
||||
TestBase(bitness, "65 01 06 5AA5", 0, 0x765432100123EAC1, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_2() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.BX, 0x123456789ABCE5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 07", 0, 0x7654321001242B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_2_es() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.BX, 0x123456789ABCE5D1), (Register.ES, 0x7654321001234567));
|
||||
TestBase(bitness, "26 01 07", 0, 0x7654321001242B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_3() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.BP, 0x123456789ABCE5D1), (Register.DI, 0xBECD), (Register.SS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 0B", 0, 0x765432100123EA05, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_3_cs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.BP, 0x123456789ABCE5D1), (Register.DI, 0xBECD), (Register.CS, 0x7654321001234567));
|
||||
TestBase(bitness, "2E 01 0B", 0, 0x765432100123EA05, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_4() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.SI, 0x123456789ABCE5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 44 A5", 0, 0x7654321001242ADD, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_4_ss() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.SI, 0x123456789ABCE5D1), (Register.SS, 0x7654321001234567));
|
||||
TestBase(bitness, "36 01 44 A5", 0, 0x7654321001242ADD, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_5() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.BP, 0x123456789ABCFFEF), (Register.SS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 46 5A", 0, 0x76543210012345B0, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_5_ds() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.BP, 0x123456789ABCFFEF), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "3E 01 46 5A", 0, 0x76543210012345B0, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_6() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.BX, 0x123456789ABCE5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 87 5AA5", 0, 0x765432100123D092, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_6_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.BX, 0x123456789ABCE5D1), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 01 87 5AA5", 0, 0x765432100123D092, getRegValue);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,219 @@
|
|||
/*
|
||||
Copyright (C) 2018 de4dot@gmail.com
|
||||
|
||||
This file is part of Iced.
|
||||
|
||||
Iced is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Iced is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with Iced. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using Iced.Intel;
|
||||
using Xunit;
|
||||
|
||||
namespace Iced.UnitTests.Intel.InstructionTests {
|
||||
public sealed class GetVirtualAddressTests32 : GetVirtualAddressTests {
|
||||
const int bitness = 32;
|
||||
|
||||
[Fact]
|
||||
void MemorySegSI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.SI, 0x123456789ABCE5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "67 A5", 1, 0x7654321001242B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegSI_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.SI, 0x123456789ABCE5D1), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 67 A5", 1, 0x7654321001242B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegESI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.ESI, 0x123456785879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "A5", 1, 0x76543210599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegESI_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.ESI, 0x123456785879E5D1), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 A5", 1, 0x76543210599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemoryESDI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.DI, 0x123456789ABCE5D1), (Register.ES, 0x7654321001234567));
|
||||
TestBase(bitness, "67 A5", 0, 0x7654321001242B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemoryESEDI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDI, 0x12345678FEDCBA8A), (Register.ES, 0x7654321001234567));
|
||||
TestBase(bitness, "A5", 0, 0x76543210FFFFFFF1, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegDI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.DI, 0x123456789ABCE5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "67 C5F9 F7 D3", 0, 0x7654321001242B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegDI_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.DI, 0x123456789ABCE5D1), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 67 C5F9 F7 D3", 0, 0x7654321001242B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegEDI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDI, 0x123456785879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "C5F9 F7 D3", 0, 0x76543210599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegEDI_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDI, 0x123456785879E5D1), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 C5F9 F7 D3", 0, 0x76543210599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_1() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBX, 0x894DC70F5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 33", 0, 0x76543210599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_1_es() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBX, 0x894DC70F5879E5D1), (Register.ES, 0x7654321001234567));
|
||||
TestBase(bitness, "26 01 33", 0, 0x76543210599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_2() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBP, 0x894DC70F5879E5D1), (Register.SS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 75 A5", 0, 0x76543210599D2ADD, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_2_cs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBP, 0x894DC70F5879E5D1), (Register.CS, 0x7654321001234567));
|
||||
TestBase(bitness, "2E 01 75 A5", 0, 0x76543210599D2ADD, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_2_ds() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBP, 0x894DC70F5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "3E 01 75 A5", 0, 0x76543210599D2ADD, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_3() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDX, 0x894DC70F5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 72 5A", 0, 0x76543210599D2B92, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_3_ss() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDX, 0x894DC70F5879E5D1), (Register.SS, 0x7654321001234567));
|
||||
TestBase(bitness, "36 01 72 5A", 0, 0x76543210599D2B92, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_4() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBX, 0x894DC70F5879E5D1), (Register.ESI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 34 33", 0, 0x765432100F001399, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_4_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBX, 0x894DC70F5879E5D1), (Register.ESI, 0x8ACE506BB562E861), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 01 34 33", 0, 0x765432100F001399, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_5() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBX, 0x894DC70F5879E5D1), (Register.ESI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 74 33 A5", 0, 0x765432100F00133E, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_5_gs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBX, 0x894DC70F5879E5D1), (Register.ESI, 0x8ACE506BB562E861), (Register.GS, 0x7654321001234567));
|
||||
TestBase(bitness, "65 01 74 33 A5", 0, 0x765432100F00133E, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_6() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBX, 0x894DC70F5879E5D1), (Register.ESI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 74 33 5A", 0, 0x765432100F0013F3, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_7() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDX, 0x894DC70F5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 34 15 34125AA5", 0, 0x76543210FEF73D6C, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_8() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDX, 0x894DC70F5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 34 15 34125A75", 0, 0x76543210CEF73D6C, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_9() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBX, 0x894DC70F5879E5D1), (Register.ESI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 74 33 A5", 0, 0x765432100F00133E, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_10() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBX, 0x894DC70F5879E5D1), (Register.ESI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 74 73 A5", 0, 0x76543210C462FB9F, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_11() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBX, 0x894DC70F5879E5D1), (Register.ESI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 74 B3 A5", 0, 0x765432102F28CC61, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_12() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EBX, 0x894DC70F5879E5D1), (Register.ESI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 74 F3 A5", 0, 0x7654321004B46DE5, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_13() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.XMM1, 1, 4, 0x8ACE506BB562E861), (Register.DS, 0, 0, 0x7654321001234567));
|
||||
TestBase(bitness, "62 F27D09 A0 34 0D 8967A55A", 0, 1, 0x76543210112B9551, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_14() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.XMM1, 2, 4, 0x8ACE506BB562E861), (Register.DS, 0, 0, 0x7654321001234567));
|
||||
TestBase(bitness, "62 F27D09 A0 34 CD 8967A55A", 0, 2, 0x7654321006DFEFF8, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_15() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.XMM1, 1, 8, 0x8ACE506BB562E861), (Register.DS, 0, 0, 0x7654321001234567));
|
||||
TestBase(bitness, "62 F27D09 A1 34 0D 8967A55A", 0, 1, 0x76543210112B9551, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_16() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.XMM1, 2, 8, 0x8ACE506BB562E861), (Register.DS, 0, 0, 0x7654321001234567));
|
||||
TestBase(bitness, "62 F27D09 A1 34 CD 8967A55A", 0, 2, 0x7654321006DFEFF8, getRegValue);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,255 @@
|
|||
/*
|
||||
Copyright (C) 2018 de4dot@gmail.com
|
||||
|
||||
This file is part of Iced.
|
||||
|
||||
Iced is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Iced is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with Iced. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using Iced.Intel;
|
||||
using Xunit;
|
||||
|
||||
namespace Iced.UnitTests.Intel.InstructionTests {
|
||||
public sealed class GetVirtualAddressTests64 : GetVirtualAddressTests {
|
||||
const int bitness = 64;
|
||||
|
||||
[Fact]
|
||||
void MemorySegESI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.ESI, 0x5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "67 A5", 1, 0x76543210599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegESI_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.ESI, 0x5879E5D1), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 67 A5", 1, 0x76543210599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegRSI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RSI, 0x894DC70F5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "A5", 1, 0xFFA1F91F599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegRSI_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RSI, 0x894DC70F5879E5D1), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 A5", 1, 0xFFA1F91F599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemoryESEDI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDI, 0x5879E5D1), (Register.ES, 0x7654321001234567));
|
||||
TestBase(bitness, "67 A5", 0, 0x76543210599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemoryESRDI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RDI, 0x894DC70F5879E5D1), (Register.ES, 0x7654321001234567));
|
||||
TestBase(bitness, "A5", 0, 0xFFA1F91F599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegEDI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDI, 0x5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "67 C5F9 F7 D3", 0, 0x76543210599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegEDI_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.EDI, 0x5879E5D1), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 67 C5F9 F7 D3", 0, 0x76543210599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegRDI() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RDI, 0x894DC70F5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "C5F9 F7 D3", 0, 0xFFA1F91F599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySegRDI_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RDI, 0x894DC70F5879E5D1), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 C5F9 F7 D3", 0, 0xFFA1F91F599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory64() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "A2 123456789ABCDEF0", 0, 0x6732EEAA79797979, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory64_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 A2 123456789ABCDEF0", 0, 0x6732EEAA79797979, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_rip() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 35 34125AA5", 0, DecoderConstants.DEFAULT_IP64 + 6 - 0x5AA5EDCC + 0x7654321001234567, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_rip_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 01 35 34125A75", 0, DecoderConstants.DEFAULT_IP64 + 7 + 0x755A1234 + 0x7654321001234567, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_eip() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "67 01 35 34125AA5", 0, ((DecoderConstants.DEFAULT_IP64 + 7 + 0xA55A1234) & 0xFFFFFFFF) + 0x7654321001234567, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_eip_gs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.GS, 0x7654321001234567));
|
||||
TestBase(bitness, "65 67 01 35 34125A75", 0, ((DecoderConstants.DEFAULT_IP64 + 8 + 0x755A1234) & 0xFFFFFFFF) + 0x7654321001234567, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_1() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBX, 0x894DC70F5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 33", 0, 0xFFA1F91F599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_1_es() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBX, 0x894DC70F5879E5D1), (Register.ES, 0x7654321001234567));
|
||||
TestBase(bitness, "26 01 33", 0, 0xFFA1F91F599D2B38, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_2() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBP, 0x894DC70F5879E5D1), (Register.SS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 75 A5", 0, 0xFFA1F91F599D2ADD, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_2_cs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBP, 0x894DC70F5879E5D1), (Register.CS, 0x7654321001234567));
|
||||
TestBase(bitness, "2E 01 75 A5", 0, 0xFFA1F91F599D2ADD, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_2_ds() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBP, 0x894DC70F5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "3E 01 75 A5", 0, 0xFFA1F91F599D2ADD, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_3() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RDX, 0x894DC70F5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 72 5A", 0, 0xFFA1F91F599D2B92, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_3_ss() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RDX, 0x894DC70F5879E5D1), (Register.SS, 0x7654321001234567));
|
||||
TestBase(bitness, "36 01 72 5A", 0, 0xFFA1F91F599D2B92, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_4() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBX, 0x894DC70F5879E5D1), (Register.RSI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 34 33", 0, 0x8A70498B0F001399, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_4_fs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBX, 0x894DC70F5879E5D1), (Register.RSI, 0x8ACE506BB562E861), (Register.FS, 0x7654321001234567));
|
||||
TestBase(bitness, "64 01 34 33", 0, 0x8A70498B0F001399, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_5() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBX, 0x894DC70F5879E5D1), (Register.RSI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 74 33 A5", 0, 0x8A70498B0F00133E, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_5_gs() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBX, 0x894DC70F5879E5D1), (Register.RSI, 0x8ACE506BB562E861), (Register.GS, 0x7654321001234567));
|
||||
TestBase(bitness, "65 01 74 33 A5", 0, 0x8A70498B0F00133E, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_6() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBX, 0x894DC70F5879E5D1), (Register.RSI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 74 33 5A", 0, 0x8A70498B0F0013F3, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_7() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RDX, 0x894DC70F5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 34 15 34125AA5", 0, 0xFFA1F91EFEF73D6C, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_8() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RDX, 0x894DC70F5879E5D1), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 34 15 34125A75", 0, 0xFFA1F91FCEF73D6C, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_9() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBX, 0x894DC70F5879E5D1), (Register.RSI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 74 33 A5", 0, 0x8A70498B0F00133E, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_10() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBX, 0x894DC70F5879E5D1), (Register.RSI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 74 73 A5", 0, 0x153E99F6C462FB9F, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_11() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBX, 0x894DC70F5879E5D1), (Register.RSI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 74 B3 A5", 0, 0x2ADB3ACE2F28CC61, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_12() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.RBX, 0x894DC70F5879E5D1), (Register.RSI, 0x8ACE506BB562E861), (Register.DS, 0x7654321001234567));
|
||||
TestBase(bitness, "01 74 F3 A5", 0, 0x56147C7D04B46DE5, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_13() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.XMM1, 1, 4, 0x8ACE506BB562E861), (Register.DS, 0, 0, 0x7654321001234567));
|
||||
TestBase(bitness, "62 F27D09 A0 34 0D 8967A55A", 0, 1, 0x76543211112B9551, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_14() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.XMM1, 2, 4, 0x8ACE506BB562E861), (Register.DS, 0, 0, 0x7654321001234567));
|
||||
TestBase(bitness, "62 F27D09 A0 34 CD 8967A55A", 0, 2, 0x7654321606DFEFF8, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_15() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.XMM1, 1, 8, 0x8ACE506BB562E861), (Register.DS, 0, 0, 0x7654321001234567));
|
||||
TestBase(bitness, "62 F27D09 A1 34 0D 8967A55A", 0, 1, 0x0122827C112B9551, getRegValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Memory_16() {
|
||||
var getRegValue = new VARegisterValueProviderImpl((Register.XMM1, 2, 8, 0x8ACE506BB562E861), (Register.DS, 0, 0, 0x7654321001234567));
|
||||
TestBase(bitness, "62 F27D09 A1 34 CD 8967A55A", 0, 2, 0xCCC6B56E06DFEFF8, getRegValue);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
Copyright (C) 2018 de4dot@gmail.com
|
||||
|
||||
This file is part of Iced.
|
||||
|
||||
Iced is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Iced is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with Iced. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using Iced.Intel;
|
||||
using Xunit;
|
||||
|
||||
namespace Iced.UnitTests.Intel.InstructionTests {
|
||||
public sealed class InstructionTests_Misc {
|
||||
static int GetEnumSize(Type enumType) {
|
||||
Assert.True(enumType.IsEnum);
|
||||
int maxValue = -1;
|
||||
foreach (var f in enumType.GetFields()) {
|
||||
if (f.IsLiteral) {
|
||||
int value = (int)f.GetValue(null);
|
||||
Assert.Equal(maxValue + 1, value);
|
||||
maxValue = value;
|
||||
}
|
||||
}
|
||||
return maxValue + 1;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void MemorySize_is_not_too_big() {
|
||||
int maxValue = GetEnumSize(typeof(MemorySize)) - 1;
|
||||
Assert.True(maxValue < (1 << Instruction.TEST_MemorySizeBits));
|
||||
Assert.True(maxValue >= (1 << (Instruction.TEST_MemorySizeBits - 1)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void OpKind_is_not_too_big() {
|
||||
int maxValue = GetEnumSize(typeof(OpKind)) - 1;
|
||||
Assert.True(maxValue < (1 << Instruction.TEST_OpKindBits));
|
||||
Assert.True(maxValue >= (1 << (Instruction.TEST_OpKindBits - 1)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Code_is_not_too_big() {
|
||||
int maxValue = GetEnumSize(typeof(Code)) - 1;
|
||||
Assert.True(maxValue < (1 << Instruction.TEST_CodeBits));
|
||||
Assert.True(maxValue >= (1 << (Instruction.TEST_CodeBits - 1)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void Register_is_not_too_big() {
|
||||
int maxValue = GetEnumSize(typeof(Register)) - 1;
|
||||
Assert.True(maxValue < (1 << Instruction.TEST_RegisterBits));
|
||||
Assert.True(maxValue >= (1 << (Instruction.TEST_RegisterBits - 1)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void OpKind_Register_is_zero() {
|
||||
// The opcode handlers assume it's zero. They have Debug.Assert()s too.
|
||||
Assert.True(OpKind.Register == 0);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
void INVALID_Code_value_is_zero() {
|
||||
// A 'default' Instruction should be an invalid instruction
|
||||
Assert.True((int)Code.INVALID == 0);
|
||||
Instruction instr1 = default;
|
||||
Assert.Equal(Code.INVALID, instr1.Code);
|
||||
var instr2 = new Instruction();
|
||||
Assert.Equal(Code.INVALID, instr2.Code);
|
||||
Assert.True(Instruction.TEST_BitByBitEquals(ref instr1, ref instr2));
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue