百科问答小站 logo
百科问答小站 font logo



为什么不把push ebp和mov ebp, esp的操作通过硬件方式做进call指令中? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

想法很好,意义不大。

首先,CPU硬件的视角上,根本没有汇编指令,都是一个一个微指令,对于像call/push这类指令,在CPU内部都是被打散的状态,call是push+jmp,然后再继续拆散成内存访问和寄存器修改。所以你把多个指令打包,最后到CPU里面还是要拆散的,从效率上说,没什么影响。

那么打包的意义在哪?节约汇编指令编码?现在x86的指令编码可用的空间已经很有限了,再发明一个指令,想找一个地方塞进去很困难,况且有没有用到的编码,去做点别的比如科学计算的指令不是更好吗?

ARM上能打包,是因为ARM汇编设计的时候就预留了编码空间,x86设计的时候没有预留,现在要加指令就很困难。

push ebp/push ebp,esp一共只有三个字节,而新增一条指令,多一级编码,就可能还需要额外一个字节,那么你的CALLX执行也就在每个函数调用的地方节约两个字节的长度,并且实际执行效率上没有提升,微指令没编码。所以这样做的意义不大。

况且,另外有一个问题是,ABI上要求用ebp/esp做栈帧,但这种要求不是强制的,对于那些不想用ebp/esp做栈帧的代码,你的这条指令就没什么用处了,除非你要设计一套:对任意两个寄存器做栈帧的CALLX指令,考虑到寄存器组合的话,这条指令的编码已经很大的了,要知道一条pop也就一个字节,你的新的指令要组合任意两个寄存器的话,至少需要16*16的编码空间,这就已经一个字节了,况且你不考虑点预留空间去扩展吗?

所以算下来,这样做的意义不大,x86体系已经很少去在编码上优化传统指令了,这样的优化得不偿失。


user avatar   ling-jian-94 网友的相关建议: 
      

命题可能不成立。所以也就无法回答它等于多少。

为什么命题可能不成立呢?因为一个数它之所以存在,是要参与运算。

一除以零之所以没意义,是因为这个结果无法参与任何代数运算。不满足常规数学运算的规则。

假如你把一除以零命名为无穷,然而这个所谓的无穷,并不能像常规的数一样参与数学运算,它参与数学运算会导致非常多的数学公式不成立,无法纳入到现有的数字体系中。

所以,要想使它有意义,除非你能定义一个数学体系,让这个数能够在这个体系内正常参与运算,

我从小学开始就思考这个问题,到了中学,大学继续思考,工作之后也仍然思考过。然而最终发现,没有办法把这个数定义成有意义的值,因为这个值它不是自然数,不是有理数,不是实数,也不是复数,不属于已知数字范围内的任何数,这个数无法以兼容现有数学运算规则的方式参与任何运算




  

相关话题

  为什么手机核心数目提升的比计算机快? 
  为什么安卓的图形界面很好用,linux的图形界面那么拉跨? 
  能求教STM32动态内存分配如何解决内存碎片问题吗? 
  大括号不换行的坏处有什么?为什么有人不换行? 
  法律是否可能被代码化? 
  为何 CPU 只用硅,而不用能耗更低的锗制作? 
  Windows 在提示 USB 设备被占用而无法弹出时为何不指明进程名? 
  Visual Studio 是不是坑了一代人?为什么? 
  12600KF 和 5800X 选哪个? 
  为什么手机的soc不使用超线程技术? 

前一个讨论
为什么系统调用时要把一些寄存器保存到内核栈又从内核栈恢复?
下一个讨论
为什么修改esp寄存器会触发异常?





© 2024-12-22 - tinynew.org. All Rights Reserved.
© 2024-12-22 - tinynew.org. 保留所有权利