问题标签 [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.

0 投票
1 回答
1006 浏览

delphi - Delphi 内联汇编器和类属性

我正在尝试在汇编程序(XE3)中重写 TList.IndexOf 方法。这是我的代码

自然,我想直接使用 Count 或 List 之类的属性。我理解为什么编译器拒绝授予对私有字段 FCount 和 FList 的访问权限,但是我该如何访问相应的属性呢?Count、Self.Count 和 [eax].Count 都给出内联汇编错误。

JIC:我不会故意处理此处未找到的情况

0 投票
2 回答
465 浏览

delphi - 为什么这个 LEA 指令不能编译?

我将 32 位 Delphi BASM 代码移植到 64 位 FPC(Win64 目标操作系统),想知道为什么下一条指令不能在 64 位 FPC 中编译:

可能的解决方法是:

我只是不明白LEAWin64 目标中的 32 位指令有什么问题(它在 32 位 Delphi 中编译正常,因此它是正确的 CPU 指令)。


优化备注:

64位FPC 2.6.2编译的下一段代码

生成下一个汇编器输出:

获胜者是(7 个字节长):

所有 3 个替代方案(包括LEA ECX,[ECX + ESI + $265E5A51]不通过 64 位 FPC 编译的)都是 8 个字节长。

不确定获胜者的速度最好。

0 投票
1 回答
934 浏览

delphi - Delphi 和 FPC 中的裸 64 位 asm 函数

FPCnostackframe和 Delphi 的.NOFRAME指令在 64 位 asm 函数中是否完全等效?

换句话说,下一个代码模板

在 Delphi 和 FPC 中生成相同的裸 64 位 asm 函数?

0 投票
2 回答
1265 浏览

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:

0 投票
3 回答
957 浏览

delphi - 向 Delphi ASM 中的所有 16 个 XMM 插槽广播一个字节值

这在 AVX 中使用 VBROADCASTS 命令很容易,或者在 SSE 中如果值是双精度值或浮点数。

如何将单个 8 位值广播到 Delphi ASM 中 XMM 寄存器中的每个插槽?

0 投票
2 回答
167 浏览

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(当前稳定版本)

任何解决方法或解决该问题的方法?

0 投票
0 回答
143 浏览

delphi - FPC BASM32 POP 错误?

Delphi 和 FPC BASM 之间的另一个差异:

此 32 位代码在 Delphi XE 中按预期工作,并在 FPC (2.6.4) 中产生访问冲突

调试显示POP指令(在 FPC 编译器中)弹出一个字而不是预期的双字,从而破坏堆栈和过程的返回地址。解决方案是

这实际上是更好的代码,因为它消除了参数大小的歧义。

错误与否?

0 投票
3 回答
445 浏览

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 位,所以我不必检查所有值?

我当前的代码:

0 投票
0 回答
90 浏览

delphi - 在内联汇编器中调用 Exception.CreateRes

如何使用内联汇编器调用带有资源字符串消息的异常?

我尝试了各种方法,但似乎没有任何效果。我得到诸如内联汇编器语法错误或操作数大小不匹配之类的东西。