【问题标题】:Python - encoding info in a tablePython - 在表中编码信息
【发布时间】:2013-05-12 16:24:42
【问题描述】:

我正在使用 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

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

【问题讨论】:

    标签: python assembly document encode


    【解决方案1】:

    首先,使用collections.namedtuple class factory 创建一个类似元组的对象来替换您的列表;将您的操作员代码存储在该对象的元组中:

    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)

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

    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
    

    【讨论】:

    • 是的,谢谢 - 好一点,我想如果我一开始就拿出操作码,即 opcode=tokens[0] 它会更干净。
    • 再次感谢。当然有帮助,尽管它仍然感觉像是只写代码。它甚至发现了一些我在表格中输入错误代码的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多