问题标签 [basm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - Delphi 内联汇编器和类属性
我正在尝试在汇编程序(XE3)中重写 TList.IndexOf 方法。这是我的代码
自然,我想直接使用 Count 或 List 之类的属性。我理解为什么编译器拒绝授予对私有字段 FCount 和 FList 的访问权限,但是我该如何访问相应的属性呢?Count、Self.Count 和 [eax].Count 都给出内联汇编错误。
JIC:我不会故意处理此处未找到的情况
delphi - 为什么这个 LEA 指令不能编译?
我将 32 位 Delphi BASM 代码移植到 64 位 FPC(Win64 目标操作系统),想知道为什么下一条指令不能在 64 位 FPC 中编译:
可能的解决方法是:
我只是不明白LEA
Win64 目标中的 32 位指令有什么问题(它在 32 位 Delphi 中编译正常,因此它是正确的 CPU 指令)。
优化备注:
64位FPC 2.6.2编译的下一段代码
生成下一个汇编器输出:
获胜者是(7 个字节长):
所有 3 个替代方案(包括LEA ECX,[ECX + ESI + $265E5A51]
不通过 64 位 FPC 编译的)都是 8 个字节长。
不确定获胜者的速度最好。
delphi - Delphi 和 FPC 中的裸 64 位 asm 函数
FPCnostackframe
和 Delphi 的.NOFRAME
指令在 64 位 asm 函数中是否完全等效?
换句话说,下一个代码模板
在 Delphi 和 FPC 中生成相同的裸 64 位 asm 函数?
delphi - Delphi assembler: understanding the Result register
I'm messing around with ASM in Delphi. From my understanding, EAX holds Result. In the following, I have to put RET at the end, otherwise Result is not correct (it is correct if the input is 0). What am I doing wrong, or should I say, what don't I understand about this?
If I say the following:
Then I get the following compilation:
However, my code above has the following postscript:
delphi - 向 Delphi ASM 中的所有 16 个 XMM 插槽广播一个字节值
这在 AVX 中使用 VBROADCASTS 命令很容易,或者在 SSE 中如果值是双精度值或浮点数。
如何将单个 8 位值广播到 Delphi ASM 中 XMM 寄存器中的每个插槽?
delphi - FPC BASM32 MUL 错误?
我在将 Delphi BASM32 代码移植到 FPC 时遇到了一个问题:
上面的代码在 Delphi XE 中编译并按预期工作;FPC 在线输出编译时错误MUL EAX,EDX
:
错误:Asm: [mul reg32,reg32] 操作码和操作数的无效组合
我正在使用 Lazarus 1.4.4/FPC2.6.4 for Win32(当前稳定版本)
任何解决方法或解决该问题的方法?
delphi - FPC BASM32 POP 错误?
Delphi 和 FPC BASM 之间的另一个差异:
此 32 位代码在 Delphi XE 中按预期工作,并在 FPC (2.6.4) 中产生访问冲突
调试显示POP
指令(在 FPC 编译器中)弹出一个字而不是预期的双字,从而破坏堆栈和过程的返回地址。解决方案是
这实际上是更好的代码,因为它消除了参数大小的歧义。
错误与否?
delphi - 检查 64 位中乘以常数的参数
对于我的 BigInteger 代码,对于非常大的 BigInteger,输出结果很慢。所以现在我使用递归分治算法,它仍然需要 2'30" 才能将当前最大的已知素数转换为超过 2200 万位的十进制字符串(但只需 135 毫秒即可将其转换为十六进制字符串) .
我仍然想减少时间,所以我需要一个可以非常快地将 NativeUInt(即 32 位平台上的 UInt32,64 位平台上的 UInt64)除以 100 的例程。所以我用常数乘法。这在 32 位代码中可以正常工作,但我不能 100% 确定 64 位。
所以我的问题是:有没有办法检查无符号 64 位值乘以常数的结果的可靠性?我通过简单地尝试 UInt32 (0..$FFFFFFFF) 的所有值来检查 32 位值。这花了大约。3分钟。检查所有 UInt64 所花费的时间比我有生之年要长得多。有没有办法检查所使用的参数(常量、后移)是否可靠?
我注意到,如果选择的参数错误(但接近) ,DivMod100()
总是会失败。$4000004B
是否有特殊值或范围来检查 64 位,所以我不必检查所有值?
我当前的代码:
delphi - 在内联汇编器中调用 Exception.CreateRes
如何使用内联汇编器调用带有资源字符串消息的异常?
我尝试了各种方法,但似乎没有任何效果。我得到诸如内联汇编器语法错误或操作数大小不匹配之类的东西。