在内置汇编程序例程

时间:2018-01-06 16:25:45

标签: c assembly delphi-7 cpu-registers

80386-80686 +:不建议软件程序员使用EBX寄存器,因为它是CPU的特定寄存器,或者因为O.S.而无法使用。 (至于Windows)需要它出于某些原因......?

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

使用这个简单的例程来模拟sprite管理我使用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;

对不起,先生。彼得科德斯,但我只回答一个挫折的原因。我的测试是: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,主要。 O.S. Windows XP。但我只是怀疑它导致一些问题 运行我的软件时出现小错误。这个问题也被提到了 一些Stack Overflow用户(EBX注册)。

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

我声明我使用的是轮询策略,而不是通过对象管理事件 主窗体的异常,它使用一个系统计时器来执行 主程序过程,更多管理事件OnPaint(不同步 光刷,但这不是问题),OnActivate,OnCreate,OnDestroy,FormKeyUp / 向下和鼠标点击。

问题是我的软件在可变频率的距离上略微不稳定 我甚至不明白它的依赖。

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

1 个答案:

答案 0 :(得分:2)

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

来电保存的寄存器(又名"易失性寄存器")用于保存不需要跨呼叫保留的临时数量。 Callee保存的寄存器(又名"非易失性寄存器")用于保存应该在调用之间保留的长期值。

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