微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

表达式堆栈在汇编语言中意味着什么?

如何解决表达式堆栈在汇编语言中意味着什么?

我一直在使用教科书来学习汇编语言。我不在上课,我只想学习汇编语言。在本章的最后,术语之一是“表达式堆栈”。这本书往往很难清晰地定义关键术语,而我只是无法弄清楚该术语的确切含义。有人可以给我一个简洁,直接的解释吗?谢谢。

为澄清起见,这里有更多信息:该章称为“浮点处理和指令编码”,该节位于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*bc*d的计算顺序,那么如果不做特别的事情而到达除法时,它将计算(c*d)/(a*b),这是不希望的。如果硬件说明提供了反向除法,我们将改用反向除法。否则,我们必须交换堆栈上的前两个元素,才能使用常规的除法指令。

英特尔x87浮点单元是一个堆栈计算机,它提供了8个浮点值的堆栈。这些值可以像常规CPU寄存器一样快速访问,尽管与常规CPU指令不同,这些在本单元中执行浮点计算的指令未指定操作数-它们假定堆栈的顶部在其中工作(堆栈具有源操作数,目标​​操作数将返回堆栈。

由于这种小型硬件堆栈通常用于计算涉及中间结果的复杂表达式,因此有时将其称为表达式堆栈。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。