/
analysis.go
59 lines (50 loc) · 1.35 KB
/
analysis.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
//<developer>
// <name>linapex 曹一峰</name>
// <email>linapex@163.com</email>
// <wx>superexc</wx>
// <qqgroup>128148617</qqgroup>
// <url>https://jsq.ink</url>
// <role>pku engineer</role>
// <date>2019-03-16 19:16:35</date>
//</624450081814220800>
package vm
//bitvec是一个位向量,它映射程序中的字节。
//未设置位表示字节为操作码,设置位表示
//这是数据(即pushxx的参数)。
type bitvec []byte
func (bits *bitvec) set(pos uint64) {
(*bits)[pos/8] |= 0x80 >> (pos % 8)
}
func (bits *bitvec) set8(pos uint64) {
(*bits)[pos/8] |= 0xFF >> (pos % 8)
(*bits)[pos/8+1] |= ^(0xFF >> (pos % 8))
}
//代码段检查位置是否在代码段中。
func (bits *bitvec) codeSegment(pos uint64) bool {
return ((*bits)[pos/8] & (0x80 >> (pos % 8))) == 0
}
//codeBitmap以代码的形式收集数据位置。
func codeBitmap(code []byte) bitvec {
//如果代码
//以push32结束,算法将把0推到
//位向量超出了实际代码的边界。
bits := make(bitvec, len(code)/8+1+4)
for pc := uint64(0); pc < uint64(len(code)); {
op := OpCode(code[pc])
if op >= PUSH1 && op <= PUSH32 {
numbits := op - PUSH1 + 1
pc++
for ; numbits >= 8; numbits -= 8 {
bits.set8(pc) //八
pc += 8
}
for ; numbits > 0; numbits-- {
bits.set(pc)
pc++
}
} else {
pc++
}
}
return bits
}