- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
GCC 给我做了一些汇编代码,里面有这个语句: lea eax, [ebx+eax] (英特尔语法) 只是好奇,这有什么区别,和: add eax, ebx 是? eax 和 ebx 包含函数的返回值
我正在学习逆向工程的基础。在逆向破解版时,我碰巧在几乎每个函数的开头都看到了这种模式: pushl %ebp movl %esp, %ebp
我正在尝试学习一些汇编,但我很难理解一些基本的东西是做什么的。 eax ebx ecx 只是变量还是除了存储值之外它们都有独特的特定用途? 最佳答案 eax, ebx, ecx 等等其实都是寄存器 ,
我正在研究计算机系统,程序员的观点(第 3 版),练习题 3.3 包含以下行: movb $0xF, (%ebx) 我应该找出这行 x86-64 汇编代码有什么问题,答案是:“不能使用 %ebx 作为
我这个汇编代码: INT %ebx GCC 在尝试组装它时给我一个错误: INT ERROR:mismatch operand type for 'int'. 这是否意味着指令 INT 的操作数必须是
80386-80686+:不建议软件程序员使用EBX寄存器,因为它是CPU的特定寄存器,或者因为O.S.而不能使用它。 (至于Windows)由于某些原因需要它......? 但是如果我在使用它之前将
我已经用汇编编写了一个程序,输入后: as -32 maximum.s -o maximum.o ld -m elf_i386 maximum.o -o maximum ./maximum 它显示段错
我用 C++ 编写了一个“危险的”程序,它在一个堆栈帧和另一个堆栈帧之间来回跳转。目标是从调用堆栈的最低层跳转到调用者,做一些事情,然后再次向下跳,每次都跳过中间的所有调用。 我通过手动更改堆栈基地址
我试图理解一些汇编代码: movl $244, %eax movl %1, %%ebx 第一个表示将数字244放入寄存器eax,但是第二个是什么意思?在此先感谢您的帮助 P.S see the dif
我正在研究 x86 汇编代码高尔夫拼图。我正在使用 NASM 组装源文件: nasm -f elf32 -O0 main.s ld -m elf_i386 -s -O0 -o main main.o
我有以下用 MASM 为 i386 处理器编写的简单程序: TITLE BLA .MODEL SMALL .386 .STACK
在Linux环境下,如果我写一些NASM代码如下: mov eax, 1 ; system call 1 - sys_exit mov ebx, 0 int 0x80 ... ebx 中的值是多少?
在汇编中创建函数时,我在使用如此少量的寄存器进行操作时遇到问题 - 这些寄存器中的什么内容阻止了我使用它们?我可以在编码时将其内容复制到参数中,并在退出函数之前重置它,以免破坏其目的吗? 最佳答案 W
这个问题已经有答案了: What is the meaning of MOV (%r11,%r12,1), %edx? (2 个回答) 已关闭 5 年前。 一直在从事 assembly 作业,并且在很
我知道还有其他一些类似的问题,但我仍然无法理解它的 () 部分。有人可以为我拼出这个语法吗?谢谢。 最佳答案 cmp %eax,0x80498d4(,%ebx,4) cmp 是比较汇编指令。它通过从左
我正在尝试创建 read() 包装器但收到此错误: error: unknown register name ‘%%ebx’ in ‘asm’ in line 23 //(the bold line)
我正在尝试实现“Win32 EXE 的动态 fork ”的已知方法,它被称为 RunPE。我的问题是我无法获得在 http://www.security.org.sg/code/loadexe.htm
谷歌不显示结果, 有谁知道? 最佳答案 X 表示 对 ,并且至少可以追溯到 8080。它有 8 位寄存器 B、C、D、E、H、L(等等),它们也可以成对使用(BC、DE 和 HL)。 BC 和 DE
我正在尝试使用 AT&T/GAS 语法将此 for 循环从 C 语言转换为汇编语言: for(int j = i; i*j < N; j++) { A[i*j] = 0; } 我将i存储在%e
section .text global _start ;must be declared for linker (ld)
我是一名优秀的程序员,十分优秀!