一条式子生成几条汇编

👁️ 2 人浏览 💬 0 人评论 ❤️ 添加收藏

(每道题开头都有同一段:MNEMONIC 把运算符映射到助记符(+→ADD、-→SUB、*→MUL);select(t) 把一条 IR 选成几条汇编(二元运算 4 条、const/copy 各 2 条);gen(prog) 生成全部汇编行;count_instrs 数指令数、count_mne(prog, m) 数某助记符出现几次。)

把一条 t = a + b 选成汇编,数一数几条:

MNEMONIC = {"+": "ADD", "-": "SUB", "*": "MUL"}


def select(t):
    """把一条三地址码 (op, dst, a, b) 选成几条汇编:二元运算 4 条、const/copy 各 2 条。"""
    op = t[0]
    if op == "const":
        return ["LOADI R0, " + str(t[2]), "STORE " + t[1] + ", R0"]
    if op == "copy":
        return ["LOAD R0, " + str(t[2]), "STORE " + t[1] + ", R0"]
    m = MNEMONIC[op]
    return ["LOAD R0, " + str(t[2]), "LOAD R1, " + str(t[3]), m + " R0, R1", "STORE " + t[1] + ", R0"]


def gen(prog):
    """把整个三地址码程序生成汇编,交回汇编行的列表。"""
    out = []
    for t in prog:
        out += select(t)
    return out


def count_instrs(prog):
    """一共生成了几条汇编指令。"""
    return len(gen(prog))


def count_mne(prog, m):
    """生成的汇编里,助记符 m(如 "ADD")出现几次。"""
    return sum(1 for line in gen(prog) if line.split()[0] == m)

print(len(select(("+", "t", "a", "b"))))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论