问题描述
我一直在使用教科书来学习汇编语言。我不在上课,我只想学习汇编语言。在本章的最后,术语之一是“表达式堆栈”。这本书往往很难清晰地定义关键术语,而我只是无法弄清楚该术语的确切含义。有人可以给我一个简洁,直接的解释吗?谢谢。
为澄清起见,这里有更多信息:该章称为“浮点处理和指令编码”,该节位于FPU寄存器堆栈上。它提到了这一点:“堆栈在后缀表达式的求值期间保存中间值。”我想知道这是否意味着“ EXPRESSION堆栈在后缀表达式的求值过程中拥有中间值”
解决方法
在一般情况下,对于复杂的表达式,有必要先评估表达式的各个部分,然后切换到其他内容,然后再在表达式的其他部分中使用这些局部结果。这些零件有时称为中间件或临时件。
例如,以下表达式包含2个乘法和1个除法:(a*b)/(c*d)
Three address code是了解将表达式分解为这些片段的过程的良好的开始。在三个地址代码中,我们创建一个新变量来保存每个(行)计算的结果。在具有寄存器的机器上,三个地址代码的工作方式类似于汇编语言,因为某些操作的顺序是灵活的。
t1 = a*b
t2 = c*d
t3 = t1/t2
使用三个地址代码,我们可以更改顺序:
t2 = c*d
t1 = a*b
t3 = t1/t2
,由于行t3=
已为除法的操作数明确命名了变量,因此代码仍可以计算出正确的答案。
如果以系统的方式(例如从左到右(或可重复的内容))评估表达式,则可以观察到部分表达式评估的中间结果可以存储在堆栈中,而不是随机存储中(其中三个地址代码通过引入新变量并在使用时明确命名来使用随机存储。
上述表达式的stack machine评估为:
before after
push a stack empty stack has "a"
push b stack has "a" stack has on top "b" then "a" behind
multiply stack has "b","a" stack has one item: the value of a*b
push c stack has a*b stack has c,then value of a*b
push d stack has c,a*b stack has d,c,a*b
multiply stack has d,a*b stack has value of c*d,then value of a*b
divide stack has c*d,a*b stack has value of (a*b)/(c*d)
根据堆栈计算机中可用的操作,使用堆栈会受到更多限制。如果我们颠倒a*b
和c*d
的计算顺序,那么如果不做特别的事情而到达除法时,它将计算(c*d)/(a*b)
,这是不希望的。如果硬件说明提供了反向除法,我们将改用反向除法。否则,我们必须交换堆栈上的前两个元素,才能使用常规的除法指令。
英特尔x87浮点单元是一个堆栈计算机,它提供了8个浮点值的堆栈。这些值可以像常规CPU寄存器一样快速访问,尽管与常规CPU指令不同,这些在本单元中执行浮点计算的指令未指定操作数-它们假定堆栈的顶部在其中工作(堆栈具有源操作数,目标操作数将返回堆栈。
由于这种小型硬件堆栈通常用于计算涉及中间结果的复杂表达式,因此有时将其称为表达式堆栈。