/
i386.go
102 lines (95 loc) · 1.97 KB
/
i386.go
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
99
100
101
102
package regnum
import (
"fmt"
"strings"
)
// The mapping between hardware registers and DWARF registers is specified
// in the System V ABI Intel386 Architecture Processor Supplement page 25,
// table 2.14
// https://www.uclibc.org/docs/psABI-i386.pdf
const (
I386_Eax = 0
I386_Ecx = 1
I386_Edx = 2
I386_Ebx = 3
I386_Esp = 4
I386_Ebp = 5
I386_Esi = 6
I386_Edi = 7
I386_Eip = 8
I386_Eflags = 9
I386_ST0 = 11 // ST(1) through ST(7) follow
I386_XMM0 = 21 // XMM1 through XMM7 follow
I386_Es = 40
I386_Cs = 41
I386_Ss = 42
I386_Ds = 43
I386_Fs = 44
I386_Gs = 45
)
var i386DwarfToName = map[int]string{
I386_Eax: "Eax",
I386_Ecx: "Ecx",
I386_Edx: "Edx",
I386_Ebx: "Ebx",
I386_Esp: "Esp",
I386_Ebp: "Ebp",
I386_Esi: "Esi",
I386_Edi: "Edi",
I386_Eip: "Eip",
I386_Eflags: "Eflags",
I386_ST0: "ST(0)",
I386_ST0 + 1: "ST(1)",
I386_ST0 + 2: "ST(2)",
I386_ST0 + 3: "ST(3)",
I386_ST0 + 4: "ST(4)",
I386_ST0 + 5: "ST(5)",
I386_ST0 + 6: "ST(6)",
I386_ST0 + 7: "ST(7)",
I386_XMM0: "XMM0",
I386_XMM0 + 1: "XMM1",
I386_XMM0 + 2: "XMM2",
I386_XMM0 + 3: "XMM3",
I386_XMM0 + 4: "XMM4",
I386_XMM0 + 5: "XMM5",
I386_XMM0 + 6: "XMM6",
I386_XMM0 + 7: "XMM7",
I386_Es: "Es",
I386_Cs: "Cs",
I386_Ss: "Ss",
I386_Ds: "Ds",
I386_Fs: "Fs",
I386_Gs: "Gs",
}
var I386NameToDwarf = func() map[string]int {
r := make(map[string]int)
for regNum, regName := range i386DwarfToName {
r[strings.ToLower(regName)] = regNum
}
r["eflags"] = 9
r["st0"] = 11
r["st1"] = 12
r["st2"] = 13
r["st3"] = 14
r["st4"] = 15
r["st5"] = 16
r["st6"] = 17
r["st7"] = 18
return r
}()
func I386MaxRegNum() int {
max := int(I386_Eip)
for i := range i386DwarfToName {
if i > max {
max = i
}
}
return max
}
func I386ToName(num int) string {
name, ok := i386DwarfToName[num]
if ok {
return name
}
return fmt.Sprintf("unknown%d", num)
}