gpt4 book ai didi

c - 在内置汇编程序例程中使用 EBX 寄存器

转载 作者:行者123 更新时间:2023-11-30 21:19:29 25 4
gpt4 key购买 nike

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 GeForce6600,主力。操作系统Windows XP。但我只是怀疑它的问题导致了一些我的软件运行时会出现短暂的闪烁中断。这个问题也被提到过一些 Stack Overflow 用户(EBX 注册)。

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

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

问题是我的软件在可变频率的距离上会稍微不稳定我什至不明白它取决于什么。

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

最佳答案

这完全取决于平台(操作系统)和“调用约定”。请参阅此处的“寄存器保存”:https://en.wikipedia.org/wiki/X86_calling_conventions

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

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

关于c - 在内置汇编程序例程中使用 EBX 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48129350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com