Add instr tests

This commit is contained in:
de4dot 2018-09-06 02:01:32 +02:00
parent 5c1f873225
commit 12f2310984
6 changed files with 797 additions and 0 deletions

View File

@ -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" />

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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));
}
}
}