Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 什么';fpu以基于堆栈的方式实现寄存器的动机是什么?_Assembly_Stack_Fpu - Fatal编程技术网

Assembly 什么';fpu以基于堆栈的方式实现寄存器的动机是什么?

Assembly 什么';fpu以基于堆栈的方式实现寄存器的动机是什么?,assembly,stack,fpu,Assembly,Stack,Fpu,fpu以基于堆栈的方式实现寄存器的动机是什么?据我所知,其他指令集(如x86/sse)使用命名寄存器。我可以想象基于堆栈的属性与我们对函数的总体想法一致,从而为汇编程序员提供了更直观的设计 然而,我很好奇是否有一些更具体的动机,即技术优势 如今,这些架构在该领域不再常见。然而,在过去,寄存器的硅空间和程序代码空间都是稀有资源(现在嵌入式环境中仍然如此)。这大致概括了这种架构背后的两个动机: 伊萨瘦多了 需要更少的寄存器编码空间 对堆栈处理之类的操作的说明更少(显然) 更简单的硬件设计 少

fpu以基于堆栈的方式实现寄存器的动机是什么?据我所知,其他指令集(如x86/sse)使用命名寄存器。我可以想象基于堆栈的属性与我们对函数的总体想法一致,从而为汇编程序员提供了更直观的设计


然而,我很好奇是否有一些更具体的动机,即技术优势

如今,这些架构在该领域不再常见。然而,在过去,寄存器的硅空间和程序代码空间都是稀有资源(现在嵌入式环境中仍然如此)。这大致概括了这种架构背后的两个动机:

  • 伊萨瘦多了
    • 需要更少的寄存器编码空间
    • 对堆栈处理之类的操作的说明更少(显然)
  • 更简单的硬件设计
    • 少寄存器译码逻辑
    • 非常确定且数学上很好理解的行为(Java虚拟机等虚拟架构仍然使用它的原因)

    • 这主要只适用于x86,因为ARM、PowerPC、MIPS和Sparc都没有将FPU实现为基于堆栈的机器

      现在我们已经将其缩小到x86,原因很明显。与计算中的许多其他事情一样,它归结为历史原因(有人称之为歇斯底里的理由,因为真正的原因没有真正意义)

      历史原因是x86体系结构没有FPU。现在,我知道你会说“但是看看奔腾!”。是的,他们有FPU,但IBM选择制造PC的原始8086没有FPU——它是一个严格的整数机器,就像现在许多低端微控制器一样

      这并不是什么大问题,因为它主要用于低端终端和文本处理器。但它的廉价和普及突然见证了它在科学和工程应用中的应用。所以人们想出了带有FPU芯片的附加扩展卡来加快速度。这些卡中最流行的是使用同样由Intel制造的基于堆栈的芯片。正是这个小小的事实让英特尔更容易将芯片集成到未来几代CPU中

      在这一点上,英特尔仍然可以设计一个不基于附加芯片的指令集。但发生了两件事。许多应用程序,主要是游戏和电子表格,开始使用附加的FPU,这些应用程序变得非常非常流行。另外,其他芯片厂商也看到了PC市场上正在发生的事情,并希望参与其中。因此,迫于向后兼容性和需要快速添加此功能的压力,英特尔做了最明智的事情(在业务管理方面,不一定是在工程方面):他们只是将协处理器芯片加入到下一版本的x86中,以便营销部可以说他们有一个FPU


      长话短说:歇斯底里的葡萄干

      这个问题只能由原版8087的设计师W.卡汉自己来回答,他在一篇名为《新世界》的短文中写道

      从那里:

      • 8087堆栈并不是真正的“经典堆栈”,您可以访问任何寄存器,而不仅仅是最上面的两个/三个寄存器
      • 带有两个操作数/指令的平面寄存器集是不切实际的:协处理器指令的编码空间不足,这使得一个操作数指令成为首选指令(堆栈在这一点上更为出色),并且它可能拥有的寄存器数量(显然不可能有8个,似乎只有足够的空间容纳4个寄存器)被认为不足以有效计算某些常见的浮点运算
      • 堆栈溢出/下溢被认为是不经常发生的,并在软件中处理,给人一种更大堆栈的错觉

      我的猜测是,它使得在硬件中实现更容易。如果所有指令都在顶部寄存器中工作,则不需要寄存器文件。除了成本/复杂性之外,算术表达式还可以表示为树并使用堆栈进行计算。标准x86 FPU使用堆栈(通过
      ST(x)
      引用),它是唯一的SSE/AVX/FMA/MMX/3DNow!实际原因是,反向波兰符号可以写成x87 FPU汇编代码。30年前,x87 FPU的堆栈设计简化了其汇编编程。目前,直接将RPN转换为FPU指令并不理想,因为FPU的延迟比反向吞吐量要长得多。看看Peter Kankowski的这篇文章: