表达式栈在汇编语言中是什么意思?
What does expression stack mean in assembly language?
我一直在用教材学习汇编语言。我不在class,我只是想学习汇编语言。在本章的最后,其中一个术语是“表达式堆栈”。这本书在明确定义关键术语方面往往很差,我只是想不通这个术语的确切含义。有人能给我一个相当简洁、直接的解释吗?谢谢。
为澄清起见,这里有更多信息:本章名为“浮点处理和指令编码”,该节介绍 FPU 寄存器堆栈。它提到了这一点:“堆栈在后缀表达式的评估期间保存中间值。”我想知道这是否意味着“表达式堆栈在后缀表达式求值期间保存中间值”
在一般情况下,对于一个复杂的表达式,有必要对表达式的各个部分求值,然后切换到其他部分,然后在表达式的其他部分中使用这些部分结果。这些零件有时称为中间件或临时件。
例如,下面的表达式涉及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, c, 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)
,这是不希望的。如果硬件指令提供反向除法,我们将使用它;否则我们必须交换栈顶的两个元素才能使用常规的除法指令。
intel x87 浮点单元是一个堆栈机器,它提供类似 8 个浮点值堆栈的东西。这些值可以像常规 CPU 寄存器一样快速访问,尽管与常规 CPU 指令不同,这些在本单元中进行浮点计算的指令不指定操作数——它们假定堆栈顶部是它们所在的位置正在工作(堆栈有源操作数,目标操作数将 return 入栈)。
由于这个小型硬件堆栈通常用于计算涉及中间结果的复杂表达式,因此有时也称为表达式堆栈。
我一直在用教材学习汇编语言。我不在class,我只是想学习汇编语言。在本章的最后,其中一个术语是“表达式堆栈”。这本书在明确定义关键术语方面往往很差,我只是想不通这个术语的确切含义。有人能给我一个相当简洁、直接的解释吗?谢谢。
为澄清起见,这里有更多信息:本章名为“浮点处理和指令编码”,该节介绍 FPU 寄存器堆栈。它提到了这一点:“堆栈在后缀表达式的评估期间保存中间值。”我想知道这是否意味着“表达式堆栈在后缀表达式求值期间保存中间值”
在一般情况下,对于一个复杂的表达式,有必要对表达式的各个部分求值,然后切换到其他部分,然后在表达式的其他部分中使用这些部分结果。这些零件有时称为中间件或临时件。
例如,下面的表达式涉及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, c, 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)
,这是不希望的。如果硬件指令提供反向除法,我们将使用它;否则我们必须交换栈顶的两个元素才能使用常规的除法指令。
intel x87 浮点单元是一个堆栈机器,它提供类似 8 个浮点值堆栈的东西。这些值可以像常规 CPU 寄存器一样快速访问,尽管与常规 CPU 指令不同,这些在本单元中进行浮点计算的指令不指定操作数——它们假定堆栈顶部是它们所在的位置正在工作(堆栈有源操作数,目标操作数将 return 入栈)。
由于这个小型硬件堆栈通常用于计算涉及中间结果的复杂表达式,因此有时也称为表达式堆栈。