百科问答小站 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 网友的相关建议: 
      

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

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

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

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

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

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




  

相关话题

  为什么好多人说大牛都玩Unix/Linux? 
  姚安娜毕业于哈佛大学计算机科学和统计学专业,为什么还要进娱乐圈?高学历人才进娱乐圈是趋势吗? 
  芯片(IC)在8年后还会像现在这样火吗? 
  怎样让自己的 PC 拥有强大的功能和极高的效率? 
  教授说没有写过一千行以上代码的程序就别想上大公司,这种说法对吗? 
  C# 这么优秀的语言,现在到底出了什么问题? 
  锐龙 6000 系列和 Intel 12 代的 CPU 性能有多大差异,哪个更强? 
  俄罗斯人编程为什么那么厉害? 
  知乎上三位大牛“温赵轮”有什么离奇的身世? 
  用母语写代码是什么体验? 

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





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利