-
Notifications
You must be signed in to change notification settings - Fork 2
/
寄存器常量.java
93 lines (80 loc) · 4.27 KB
/
寄存器常量.java
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
package cn.org.assembler.constants;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import cn.org.assembler.模型.代码行类.操作数类型;
import cn.org.assembler.模型.操作数信息类;
public class 寄存器常量 {
private static final String 四字寄存器前缀 = "R";
private static final String 双字寄存器前缀 = "E";
private static final String 单字累加寄存器名 = "AX";
private static final String 单字计数寄存器名 = "CX";
private static final String 单字数据寄存器名 = "DX";
private static final String 单字BX寄存器名 = "BX";
private static final String 单字SP寄存器名 = "SP";
private static final String 单字BP寄存器名 = "BP";
private static final String 单字SI寄存器名 = "SI";
private static final String 单字目标地址寄存器名 = "DI";
private static final String 单字节累加寄存器名 = "AL";
private static final String 单字节计数寄存器名 = "CL";
private static final String 单字节数据寄存器名 = "DL";
private static final String 单字节BX寄存器名 = "BL";
private static final String 单字节SP寄存器名 = "SPL";
private static final String 单字节BP寄存器名 = "BPL";
private static final String 单字节SI寄存器名 = "SIL";
private static final String 单字节目标地址寄存器名 = "DIL";
private static final HashSet<String> 单字寄存器 = new HashSet<>();
private static final HashSet<String> 单字节寄存器 = new HashSet<>();
private static final HashMap<String, Integer> 寄存器对应码 = new HashMap<>();
// Table 3-1, Intel® 64 and IA-32 architectures software developer’s manual combined volumes Vol 2
static {
寄存器对应码.put(单字累加寄存器名, 0);
寄存器对应码.put(单字计数寄存器名, 1);
寄存器对应码.put(单字数据寄存器名, 2);
寄存器对应码.put(单字BX寄存器名, 3);
寄存器对应码.put(单字SP寄存器名, 4);
寄存器对应码.put(单字BP寄存器名, 5);
寄存器对应码.put(单字SI寄存器名, 6);
寄存器对应码.put(单字目标地址寄存器名, 7);
寄存器对应码.put(单字节累加寄存器名, 0);
寄存器对应码.put(单字节计数寄存器名, 1);
寄存器对应码.put(单字节数据寄存器名, 2);
寄存器对应码.put(单字节BX寄存器名, 3);
寄存器对应码.put(单字节SP寄存器名, 4);
寄存器对应码.put(单字节BP寄存器名, 5);
寄存器对应码.put(单字节SI寄存器名, 6);
寄存器对应码.put(单字节目标地址寄存器名, 7);
单字寄存器.addAll(Arrays.asList(单字累加寄存器名, 单字计数寄存器名, 单字数据寄存器名, 单字BX寄存器名, 单字SP寄存器名, 单字BP寄存器名,
单字SI寄存器名, 单字目标地址寄存器名));
单字节寄存器.addAll(Arrays.asList(单字节累加寄存器名, 单字节计数寄存器名, 单字节数据寄存器名, 单字节BX寄存器名, 单字节SP寄存器名, 单字节BP寄存器名,
单字节SI寄存器名, 单字节目标地址寄存器名));
}
public static 操作数信息类 取寄存器信息(String 寄存器名) {
寄存器名 = 寄存器名.toUpperCase();
操作数信息类 信息 = new 操作数信息类();
信息.类型 = 操作数类型.寄存器;
信息.值 = 寄存器名;
if (寄存器名.startsWith(四字寄存器前缀) && 单字寄存器.contains(寄存器名.substring(1))) {
信息.位数 = 64;
} else if (寄存器名.startsWith(双字寄存器前缀) && 单字寄存器.contains(寄存器名.substring(1))) {
信息.位数 = 32;
} else if (单字寄存器.contains(寄存器名)) {
信息.位数 = 16;
} else if (单字节寄存器.contains(寄存器名)) {
信息.位数 = 8;
} else {
return null;
}
return 信息;
}
/**
* @param 寄存器名 不区分大小写
*/
public static Integer 取寄存器码(String 寄存器名) {
寄存器名 = 寄存器名.toUpperCase();
if (寄存器名.startsWith(四字寄存器前缀) || 寄存器名.startsWith(双字寄存器前缀)) {
寄存器名 = 寄存器名.substring(1);
}
return 寄存器对应码.get(寄存器名);
}
}