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

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

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

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

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

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

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




  

相关话题

  怎么看c#排行飙这么高? 
  学习python与c语言哪个好? 
  你见过的最想笑的,最奇葩的,最逗逼的代码是什么? 
  编程时怎么把函数当做变量使用? 
  现在越来越多大学生转cs,那计算机专业会不会供大于求? 
  西方学习编程的学生训练打代码时每年要敲坏多少个键盘? 
  最大似然估计和最小二乘法怎么理解? 
  有线鼠标会被无线鼠标取代吗? 
  CPU 中的时钟是个什么概念? 
  为什么程序语言要设计成使用这么多shift? 

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





© 2024-05-18 - tinynew.org. All Rights Reserved.
© 2024-05-18 - tinynew.org. 保留所有权利