2016-03-21 33 views
2

我想获得一些帮助这个表达式转换成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 ...)吗?

谢谢!

回答

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 
+0

谢谢你,你是对的,我的意思写:“添加z,R1,R2”。另一个问题:你知道“sub”命令的顺序是什么吗?例如:push x push y sub会是什么操作? X-Y?或者y-x?在我的问题中,这四种方法之间的解释存在差异吗?再次感谢! – user9

+0

我不可能知道这样一个“子”操作的顺序是什么,因为我与你相反,没有一个手册来说明所有这些操作是做什么的。在_by accumulator_版本中,当前的订单将是正确的,因为它将其结果留在订单中! (我已经添加了这个答案) – Fifoernik