【问题标题】:convert expression into general register operation Models将表达式转换为通用寄存器操作模型
【发布时间】:2016-07-08 09:33:11
【问题描述】:

我想得到一些帮助,将这个表达式转换成 4 种方法的命令:

z=3*(x+2)-2*y

这是我尝试的方法:

按堆栈:

push 2
push -1
mult
push y
mult
push x
push 2
add
push 3
mult
add
pop z

按累加器:

load y
mult -2
store temp
load x
add 2
mult 3
add temp
store z

注册内存:

add R1, x, 2
mult R1, R1, 3
mult R2, y, -2
add z, R1, R2

注册-注册:

load R1, x
add R1, R1, 2
mult R1, R1, 3
load R2, y
mult R2, R2, -2
add R1, R1, R2
store z, R1

还好吗?我可以使用负数(-2...)吗?

谢谢!

【问题讨论】:

    标签: cpu-registers x86-16 cpu-architecture processor


    【解决方案1】:
    addz, R1, R2
    

    你不是要写:add z, R1, R2 吗?

    除此之外,这 4 种方法看起来都不错。


    我可以使用负数 (-2...) 吗?

    这在很大程度上取决于negsub 等命令的可用性。
    如果sub 是可能的,请观察差异:

    push 2 \
    push y | = 2*y
    mult   /
    push x \
    push 2 |
    add    | = 3*(x+2)
    push 3 |
    mult   /
    sub     <-- Does depend on the order of the previous pushes!
    pop z
    

    按累加器 版本使用sub 和仅正数如下所示:

    load y
    mult 2
    store temp
    load x
    add 2
    mult 3
    sub temp
    store z
    

    【讨论】:

    • 谢谢,你说得对,我的意思是写:“add z, R1, R2”。另一个问题:你知道“sub”命令的顺序是什么吗?例如: push x push y sub 会是什么操作? x-y?还是y-x?我的问题中的 4 种方法之间的这种解释有区别吗?再次感谢!
    • 我不可能知道这种sub 操作的顺序是什么,因为与您相反,我没有一本说明所有这些操作的手册。在 by accumulator 版本中,当前顺序是正确的,因为它会将结果留在累加器中! (我已将此添加到答案中)
    猜你喜欢
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2021-12-02
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    相关资源
    最近更新 更多