【问题标题】:Using EBX register inside a build-in assembler routine在内置汇编程序例程中使用 EBX 寄存器
【发布时间】:2018-01-06 16:25:45
【问题描述】:

80386-80686+:不建议软件程序员使用EBX寄存器,因为是CPU的特殊寄存器,或者因为操作系统不能使用。 (至于Windows)出于某些原因需要它...?

但是如果我在使用它之前将它保存到堆栈中(并在退出时恢复它)可能存在什么问题?会有什么后果?

通过这个简单的例程来模拟精灵管理,我使用了 EBX 寄存器,但似乎只有在 Windows 7.0 和 ACER 机器下,我创建的视频游戏才会变慢。只是一个疑问......

我的回答:因为每个程序都需要数据区或(16 位)数据段,而 Delphi 中的 EBX 寄存器用于保存这个数据指针,每次写入 EBX 都会减慢我的程序。

Procedure Sub_MoveSprite; Assembler;

/* Sub-ROUTINE per MoveSprite (FlipX-FlipY).

 INPUT:

    EAX= Attributi immagine.
    EBX= Scarto X per origine.
    ECX= Quantità X di Pixel per LINEA.
    EDX= Quantità Y di linee da trasf.
    EBP= Scarto X per destinazione.
    ESI= OFFSET per origine.
    EDI= OFFSET per destinaz */

Asm

     Push  EBP
     Push  EBX
     Push  ECX

     BT    EAX,Def_Target_DirX_D
     SbB   EBP,EBP
     LEA   EBP,[2*EBP+1]

     BT    EAX,Def_Source_DirX_D
     SbB   EBX,EBX
     LEA   EBX,[2*EBX+1]

@@01:Mov   AL,[ESI]
     Cmp   AL,AH
     JE    @@00
     Mov   [EDI],AL
@@00:Add   ESI,EBX
     Add   EDI,EBP
     Loop  @@01

     Mov   ECX,[ESP]

     Add   ESI,[ESP+4]
     Add   EDI,[ESP+8]

     Dec   EDX
     JNE   @@01

     Add   ESP,12

End;

对不起,先生。 Peter Cordes,但我只回答了一个挫折的原因。我的测试是:INTEL COMPAQ NX7400 便携式 2 GHz,2 GB RAM,AMD ASUS X53U 便携式 1 GHz,2 GB RAM 和 SVGA RADEON,AMD SEMPRON (tm) 2400+,1.68 GHz,1 GB RAM,SVGA NVIDIA GeForce 6600,主要。操作系统视窗XP。但我只是怀疑它会导致一些问题 运行我的软件时会出现短暂的眨眼间断。也提到了这个问题 一些 Stack Overflow 用户(EBX 注册)。

代码似乎都是在 Borland Delphi 7.0 上使用 ASM 并在之后访问 EBX 寄存器 之前在入口代码上将其压入堆栈,然后在退出时将其从堆栈中弹出。

我声明我使用轮询策略而不是按对象管理事件, 主窗体的例外,它使用系统计时器来执行 main-program-procedure,更多管理事件 OnPaint(不同步 光学刷,但这不是问题), OnActivate, OnCreate, OnDestroy, FormKeyUp/ 向下和鼠标单击。

问题是我的软件在不同频率的距离处有点不稳定 我什至不明白它取决于什么。

我在这里嵌套了代码。为什么需要其他代码来解释所有内容?现在,为什么,除了 cpu: INTEL/AMD 80386+, PENTIUM (double core) 和其他类似的我用过的 也许我已经解释了所有测试。

【问题讨论】:

  • 如果有的话,那是由于 delphi。在普通代码中,您可以很好地使用 EBX 它只是另一个被调用者保存的寄存器)
  • '在使用前将其保存到堆栈中(并在退出时恢复)可能存在哪些问题?' - 我希望没有:)
  • 与什么相比慢下来?您还没有显示比这更慢的代码。您也没有说明您正在测试什么 CPU,或者回答性能问题所需的任何内容(例如,使用性能计数器进行分析以查看运行速度较慢的内容)。
  • 亲爱的小丑,也许我没有解释清楚:很明显我也可以在delphi中使用EBX寄存器。我为自己想了一个问题,唯一明显的答案不是你给出的答案:我说的是性能,而不是其他任何东西。我添加了我的答案:因为每个程序都需要数据区或(16 位)数据段,并且 Delphi 中的 EBX 寄存器用于保存此数据指针,每次写入 EBX 都会减慢我的程序...
  • 对不起,先生。 Peter Cordes,但我只回答了一个挫折的原因。我的测试是:INTEL COMPAQ NX7400 便携式 2 GHz,2 GB RAM,AMD ASUS X53U 便携式 1 GHz,2 GB RAM 和 SVGA RADEON,AMD SEMPRON (tm) 2400+,1.68 GHz,1 GB RAM,SVGA NVIDIA GeForce 6600,主要。操作系统视窗XP。但我只是怀疑它的问题会导致我的软件运行时出现一些短暂的眨眼中断。一些 Stack Overflow 用户(EBX 寄存器)也提到了这个问题。待续……

标签: c assembly delphi-7 cpu-registers


【解决方案1】:

这完全取决于平台 (OS) 和“调用约定”。请参阅此处的“注册保存”:https://en.wikipedia.org/wiki/X86_calling_conventions

调用者保存的寄存器(又名“易失性寄存器”)用于保存不需要在调用之间保留的临时数量。被调用者保存的寄存器(又名“非易失性寄存器”)用于保存应该在调用之间保留的长期值。

如果您的软件例程不遵循特定系统的 EBX 规则,那么您可能会创建未定义的行为。调用者可能希望 EBX 不会被触及,或者,您可能会发现 EBX 在您的代码调用子例程后被修改。

【讨论】:

  • 我使用使用 EAX、EDX、ECX 寄存器参数的调用约定,按此顺序,没有堆栈帧,如下所述。我不要求解决明显的问题。
  • 好的,谢谢。你解决了我的第一个疑问。你觉得我的图形精灵模拟程序怎么样?
猜你喜欢
  • 2021-07-21
  • 1970-01-01
  • 2012-01-02
  • 2013-06-17
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多