问题标签 [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 回答
634 浏览

delphi - 在 Delphi 的 ASM 函数中存储函数变量

如何正确存储n以下功能?n由于我使用一次后由于某种原因发生变化 的价值。

0 投票
3 回答
2517 浏览

delphi - 将 Assembler x86 CPU ID 代码移植到 AMD64

我有个问题。我有以下用 ASM 编写的 x86 delphi 代码。我需要将它移植到 AMD64 吗?

我从来没有在汇编中编程过,有人知道端口是什么或者我将如何改变它。

0 投票
1 回答
1773 浏览

delphi - Delphi XE3 中的 64 位内联汇编

我在 Delphi XE3 中使用 64 位内联汇编程序遇到了这个问题,我不明白。

我试过这个,它适用于 32 位和 64 位

但是,这仅适用于 32 位而非 64 位,在 64 位中它可以编译,但不会返回两个整数之和的正确结果。

我知道以前的 FPU 代码,如 FLD、STP 可以在 32 位上运行,但在 64 位编译器上会出现编译错误。知道如何处理 64 位浮点数吗?

0 投票
3 回答
2226 浏览

delphi - FLD 指令 x64 位

我对 x64 位的 FLD 指令有一点问题……想将 Double 值加载到 st0 寄存器中的堆栈指针 FPU,但这似乎是不可能的。在 Delphi x32 中,我可以使用以下代码:

不幸的是,在 x64 中,相同的代码不起作用。

0 投票
3 回答
2080 浏览

delphi - 如何在 Delphi XE3 中使用 align-data-move SSE?

我试图运行以下内容,

据我所知,它会在movaps上出现访问冲突,如果内存位置是 16 对齐,则可以信任movaps 。如果movups没有问题(不需要对齐)。

所以我的问题是,在 Delphi XE3 中,{$CODEALIGN} 在这种情况下似乎不起作用。

编辑

很奇怪...我尝试了以下方法。

如果没有添加“使用窗口”,一切都很好。如果“使用窗口”,那么它将在c := add4(a, b)抛出异常,但不会在test()中抛出异常。

谁能解释一下?

编辑 这一切对我来说都是有意义的,现在。Delphi XE3 - 64 位的结论是

  1. X64 的堆栈帧设置为 16 字节(根据需要),{$CODEALIGN 16} 将 proc/fun 的代码对齐为 16 字节。
  2. 动态数组位于堆中,可以使用 SetMinimumBlockAlignment(mba16byte) 将其设置为对齐 16
  3. 但是,堆栈变量并不总是 16 字节对齐,例如,如果您在上例中的 v1、v2 之前声明了一个整数 var,例如 test(),则该示例将不起作用
0 投票
2 回答
1520 浏览

delphi - FreePascal x64 上对系统单元函数的汇编调用

我有一些 Delphi/汇编代码可以为 Win32、Win64 和 OSX 32 编译和工作正常(XE2)。但是,由于我需要它在 Linux 上工作,我一直在研究编译它的 FPC 版本(到目前为止,Win32 /64,Linux32/64)。

总的来说,它运行良好,但我无法开始工作的一件事是调用/跳转到 DelphiSystem单元函数,如下所示:

这似乎对 FPC Win32/Linux32 产生了预期的效果,但在 FPC Win64/Linux64 上失败并出现异常。(我对平台之间的调用约定差异非常熟悉,所以不要认为这是原因。)

在 x64 平台的 FPC 上执行此操作的正确方法是什么?

[Edit1] ---回应大卫的评论,这是一个说明问题的简化程序(至少我希望它准确无误):

使用 FPC 编译: [ Win32 :] fpc.exe fpcx64example.dpr、 [ Win64 :] ppcrossx64.exe fpcx64example.dpr、 [ Linux32 :] fpc.exe -Tlinux -XPi386-linux- -FD[path]\FPC\bin\i386-linux fpcx64example.dpr、 [ Linux64 :] ppcrossx64.exe -Tlinux -XPx86_64-linux- -FD[FPCpath]\bin\x86_64-linux fpcx64example.dpr

与 Delphi (Win32/64) 一起工作正常。对于 FPC,删除jmp System.@FillChar上面的内容可以消除 x64 上的异常。

解决方案(感谢 FPK):

Delphi 和 FPC 在完全相同的条件下不会为函数生成堆栈帧,因此RSP在两者编译的版本中,寄存器可能会有不同的对齐方式。解决方案是避免这种差异。对于上面的 FillMemCall 示例,这样做的一种方法如下所示:

这不是很漂亮,但它现在适用于 Delphi 和 FPC 的 Win/Linux 32/64。

0 投票
1 回答
654 浏览

delphi - 将此汇编代码移植到 x64 时,为什么会出现访问冲突?

我正在使用这个组件http://sourceforge.net/projects/tponguard/ 现在我需要在 64 位中编译。我被困在这个大会上。

是这样的:

我改为:

但是现在我在 xor [rsi], rax 中遇到了访问冲突

0 投票
1 回答
718 浏览

delphi - 如何获取内部 System.pas 函数的地址?

我正在开发一个 JIT 编译器,并试图弄清楚如何为托管类型(如字符串)输出正确的清理块。

对于具有一个局部变量类型的函数,清理块的反汇编string如下所示:

不幸的是,我没有任何好的方法来获取地址,@UStrClr所以@HandleFinally我的 JITter 可以插入它们。它们在 System.Pas 中声明为_UStrClrand _HandleFinally,在interface部分,但显然有一些“魔法”正在发生,因为尝试使用这些标识符会导致编译器错误。

所以我尝试了一个 ASM 例程,我在其中声明了一个全局指针并说mov func_ustr_clear, @UStrClear. 这次我没有收到未声明的标识符错误;我得到了更奇怪的东西:

那么有人知道如何正确地做到这一点吗?

0 投票
2 回答
842 浏览

delphi - ASM/Delphi - 划分

我正在尝试将两个数字 50 和 5 相除。这是我的代码:

它给了我一个DivisionByZeroException德尔福的例外。有人可以告诉我我做错了什么吗?

0 投票
2 回答
564 浏览

delphi - 如果 eax 包含 self,为什么它会给出零?

根据“在 Delphi 中使用汇编程序”eax将包含Self. 但是,eax如图所示,的内容为0。我想知道怎么了?