问题标签 [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 的 ASM 函数中存储函数变量
如何正确存储n
以下功能?n
由于我使用一次后由于某种原因发生变化 的价值。
delphi - 将 Assembler x86 CPU ID 代码移植到 AMD64
我有个问题。我有以下用 ASM 编写的 x86 delphi 代码。我需要将它移植到 AMD64 吗?
我从来没有在汇编中编程过,有人知道端口是什么或者我将如何改变它。
delphi - Delphi XE3 中的 64 位内联汇编
我在 Delphi XE3 中使用 64 位内联汇编程序遇到了这个问题,我不明白。
我试过这个,它适用于 32 位和 64 位
但是,这仅适用于 32 位而非 64 位,在 64 位中它可以编译,但不会返回两个整数之和的正确结果。
我知道以前的 FPU 代码,如 FLD、STP 可以在 32 位上运行,但在 64 位编译器上会出现编译错误。知道如何处理 64 位浮点数吗?
delphi - FLD 指令 x64 位
我对 x64 位的 FLD 指令有一点问题……想将 Double 值加载到 st0 寄存器中的堆栈指针 FPU,但这似乎是不可能的。在 Delphi x32 中,我可以使用以下代码:
不幸的是,在 x64 中,相同的代码不起作用。
delphi - 如何在 Delphi XE3 中使用 align-data-move SSE?
我试图运行以下内容,
据我所知,它会在movaps上出现访问冲突,如果内存位置是 16 对齐,则可以信任movaps 。如果movups没有问题(不需要对齐)。
所以我的问题是,在 Delphi XE3 中,{$CODEALIGN} 在这种情况下似乎不起作用。
编辑
很奇怪...我尝试了以下方法。
如果没有添加“使用窗口”,一切都很好。如果“使用窗口”,那么它将在c := add4(a, b)抛出异常,但不会在test()中抛出异常。
谁能解释一下?
编辑 这一切对我来说都是有意义的,现在。Delphi XE3 - 64 位的结论是
- X64 的堆栈帧设置为 16 字节(根据需要),{$CODEALIGN 16} 将 proc/fun 的代码对齐为 16 字节。
- 动态数组位于堆中,可以使用 SetMinimumBlockAlignment(mba16byte) 将其设置为对齐 16
- 但是,堆栈变量并不总是 16 字节对齐,例如,如果您在上例中的 v1、v2 之前声明了一个整数 var,例如 test(),则该示例将不起作用。
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。
delphi - 将此汇编代码移植到 x64 时,为什么会出现访问冲突?
我正在使用这个组件http://sourceforge.net/projects/tponguard/ 现在我需要在 64 位中编译。我被困在这个大会上。
是这样的:
我改为:
但是现在我在 xor [rsi], rax 中遇到了访问冲突
delphi - 如何获取内部 System.pas 函数的地址?
我正在开发一个 JIT 编译器,并试图弄清楚如何为托管类型(如字符串)输出正确的清理块。
对于具有一个局部变量类型的函数,清理块的反汇编string
如下所示:
不幸的是,我没有任何好的方法来获取地址,@UStrClr
所以@HandleFinally
我的 JITter 可以插入它们。它们在 System.Pas 中声明为_UStrClr
and _HandleFinally
,在interface部分,但显然有一些“魔法”正在发生,因为尝试使用这些标识符会导致编译器错误。
所以我尝试了一个 ASM 例程,我在其中声明了一个全局指针并说mov func_ustr_clear, @UStrClear
. 这次我没有收到未声明的标识符错误;我得到了更奇怪的东西:
那么有人知道如何正确地做到这一点吗?
delphi - ASM/Delphi - 划分
我正在尝试将两个数字 50 和 5 相除。这是我的代码:
它给了我一个DivisionByZeroException
德尔福的例外。有人可以告诉我我做错了什么吗?
delphi - 如果 eax 包含 self,为什么它会给出零?
根据“在 Delphi 中使用汇编程序”,eax
将包含Self
. 但是,eax
如图所示,的内容为0。我想知道怎么了?