-
Notifications
You must be signed in to change notification settings - Fork 0
/
Assembler.cs
98 lines (88 loc) · 3.23 KB
/
Assembler.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using System;
using System.Linq;
using System.Collections.Generic;
using Int8 = System.SByte;
using UInt8 = System.Byte;
namespace Narrative {
public class Assembler {
public bool debug = false;
public List<List<UInt8>> code = new List<List<UInt8>>();
public UInt8[] finalize ( ) {
UInt8[] result = code.SelectMany(x => x).ToArray();
code.Clear();
return result;
}
public void PrettyPrint ( ) {
foreach (var line in code)
Console.WriteLine($" {BitConverter.ToString(line.ToArray()).Replace("-", " ")}");
}
public enum Register : UInt8 {
EAX = 0,
ECX = 1,
EDX = 2,
EBX = 3,
ESP = 4,
EBP = 5,
ESI = 6,
EDI = 7
}
public void MOVi64r ( Register r, Int64 imm ) {
if ( debug ) Console.WriteLine($"MOVi64r {r} {imm:X}");
List<UInt8> line = new List<UInt8>();
line.Add(0x48); // REX.W
line.Add((UInt8)(0xB8 + (UInt8)r)); // o270 + r
line.AddRange(BitConverter.GetBytes(imm));
code.Add(line);
}
public void MOVr0m64 ( Int64 address ) {
if ( debug ) Console.WriteLine($"MOVr0m64 {address:X}");
List<UInt8> line = new List<UInt8>();
line.Add(0x48); // REX.W
line.Add(0xA3); // o243 + r0
line.AddRange(BitConverter.GetBytes(address));
code.Add(line);
}
public void MOVi32r ( Register r, Int32 imm ) {
if ( debug ) Console.WriteLine($"MOVi32r {r} {imm:X}");
List<UInt8> line = new List<UInt8>();
line.Add((UInt8)(0xB8 + (UInt8)r)); // o270 + r
line.AddRange(BitConverter.GetBytes(imm));
code.Add(line);
}
public void MOVr0m32 ( Int32 address ) {
if ( debug ) Console.WriteLine($"MOVr0m32 {address:X}");
List<UInt8> line = new List<UInt8>();
line.Add(0xA3); // o243 + r0
line.AddRange(BitConverter.GetBytes(address));
code.Add(line);
}
public void ADDi8r ( UInt8 r, Int8 imm ) {
if ( debug ) Console.WriteLine($"ADDi32r {r} {imm:X}");
List<UInt8> line = new List<UInt8>();
line.Add(0x83); // o203
line.Add((UInt8)(0xC0 + (UInt8)r)); // o300 + r
line.Add((UInt8)imm);
code.Add(line);
}
public void PUSHi32 ( Int32 imm ) {
if ( debug ) Console.WriteLine($"PUSHi32 {imm:X}");
List<UInt8> line = new List<UInt8>();
line.Add(0x68); // o150
line.AddRange(BitConverter.GetBytes(imm));
code.Add(line);
}
public void RET ( ) {
if ( debug ) Console.WriteLine($"RET");
List<UInt8> line = new List<UInt8>();
line.Add(0xC3); // o303
code.Add(line);
}
public void CALLr ( Register r ) {
if ( debug ) Console.WriteLine($"CALLr {r}");
List<UInt8> line = new List<UInt8>();
line.Add(0xFF); // o377
line.Add((UInt8)(0xD0 + (UInt8)r)); // o320 + r
code.Add(line);
}
}
}