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(双核)和其他我用过的类似的 测试我已经解释了所有,或许。
答案 0 :(得分:2)
完全取决于平台(OS)和"调用约定"。请参阅"注册保存"在这里:https://en.wikipedia.org/wiki/X86_calling_conventions
来电保存的寄存器(又名"易失性寄存器")用于保存不需要跨呼叫保留的临时数量。 Callee保存的寄存器(又名"非易失性寄存器")用于保存应该在调用之间保留的长期值。
如果您的软件例程没有遵循特定系统的EBX规则,那么您可能会创建未定义的行为。调用者可能希望不触及EBX,或者,在代码调用子例程后,您可能会发现EBX被修改。