blob: 01c64463fd6ed20f99155e1eee31f6e5b641b833 (
plain) (
blame)
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
|
from arch.arch import Arch
class ProgramState:
"""A snapshot of the program's state."""
def __init__(self, arch: Arch):
self.arch = arch
dict_t = dict[str, int | None]
self.regs: dict_t = { reg: None for reg in arch.regnames }
def read(self, reg: str) -> int:
"""Read a register's value.
:raise KeyError: If `reg` is not a register name.
:raise ValueError: If the register has no value.
"""
regname = self.arch.to_regname(reg)
if regname is None:
raise KeyError(f'Not a register name: {reg}')
assert(regname in self.regs)
regval = self.regs[regname]
if regval is None:
raise ValueError(f'Unable to read value of register {reg} (aka.'
f' {regname}): The register contains no value.')
return regval
def set(self, reg: str, value: int):
"""Assign a value to a register.
:raise KeyError: If `reg` is not a register name.
"""
regname = self.arch.to_regname(reg)
if regname is None:
raise KeyError(f'Not a register name: {regname}')
self.regs[regname] = value
def __repr__(self):
return repr(self.regs)
|