Python - 对表中的信息进行编码

标签 python assembly document encode

我正在使用 python 处理汇编语言源代码。我的主表由操作码驱动,包含有关每个操作码的信息,包括寄存器操作数的数量/使用情况、操作的大小等。它当前存储为字典,以操作码为键,以指标列表为值。它可以工作,但很容易搞砸,当我必须修复它时,我不会记得它是如何工作的。有没有更好的方法将数据与处理分离?

opdefs={ #operator defs
    #[number of register operands,
    # <for each operand code 1=dest,2=src,3=both,4=overhead>,
    #storage use code:0 for none, 1 for dest, 2 for source
    #operation size(-means call opsizer routine)]
    'cpy2': [2,1,2,0,4], 'cpy1': [2,1,2,0,2], 'cpy4': [2,11,12,0,8],

其中,cpy2 有两个寄存器操作数,第一个是目标,第二个是源,它没有存储引用,长度为 4 个字节。

对文件的每一行进行标记后的主循环如下所示

numoperands=opdefs[tokens[0]][0] #numer of operands
for operandnum in range(1,numoperands+1):
    if opdefs[tokens[0]][operandnum]==1: #dest register
        destreg(tokens[operandnum]) #count times register is loaded

如果我只运行一次,我不介意,但我认为必须有更好的方法来组织或编码它。有什么建议么?

最佳答案

首先,使用collections.namedtuple class factory创建一个类似元组的对象来替换您的列表;将运算符(operator)代码存储在该对象内的元组中:

from collections import namedtuple
opdef = namedtuple(opdef, 'opcount opcodes storage size')

opdefs = {
    'cpy2': opdef(2, (1, 2), 0, 4),
    'cpy1': opdef(2, (1, 2), 0, 2),
    'cpy4': opdef(2, (11, 12), 0, 8),
}

现在您可以使用 opdefs[token[0]].opcountopdefs[token[0]].size 等来解决这些问题。这已经很远了更具可读性。如果您发现更容易阅读,您可以使用名称来定义条目:

opdefs = {
    'cpy2': opdef(opcount=2, opcodes=(1, 2), storage=0, size=4),
    # ...
}

可以忽略opcount参数,而只使用len(opdefs[token[0]].opcodes)

接下来,您可以使用常量来表示您拥有的各种选项。对于存储,您可以使用:

S_NONE, S_DEST, S_SOURCE = range(3)

例如,然后在整个过程中使用这些名称:

opdefs = {
    'cpy2': opdef(opcount=2, opcodes=(1, 2), storage=S_NONE, size=4),
    # ...
}

因为我们对操作码使用单独的元组,所以您只需循环这些:

operands=opdefs[tokens[0]].opcodes
for operandnum, opcode in enumerate(operands, 1):
    if opcode == 1: #dest register
        destreg(tokens[operandnum]) #count times register is loaded

关于Python - 对表中的信息进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16610093/

相关文章:

python - 索引错误: list index out of range While Trying to Scrape Specific Columns on a Table?

python - 是否有一些内置标记序列的最后一个?

assembly - 使用 clang 的指令 movq 的操作数无效

c# - 从 C# Windows 窗体在 MS Word 中打开 MS Word 文档

javascript - 使用 javascript 更改 Spotfire 文档属性值

Python无法安装模块spaCy

python - 将微秒格式化为小数点后两位(实际上是将微秒转换为几十微秒)

assembly - 有没有办法在 32 位寄存器指令中保留字大小的立即数

assembly x86 四元数到欧拉角输出顺序错误

c - 从 C 程序写入 odf 文件的库