問題タブ [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 - アセンブラー x86 CPU ID コードを AMD64 に移植
私は問題があります。ASM で記述された次の x86 Delphi コードがあります。これを AMD64 に移植する必要がありますか?
私はアセンブリでプログラムしたことがありません.ポートがどうなるか、またはどのように変更するかを知っている人はいますか.
delphi - DelphiXE3での64ビットインラインアセンブリ
Delphi XE3で64ビットインラインアセンブラを使用してこの問題が発生しましたが、理解できません。
これを試してみましたが、32ビットと64ビットの両方で動作します
ただし、これは32ビットでのみ機能し、64ビットでは機能しません。64ビットではコンパイルされますが、2つの整数の合計の正しい結果は返されませんでした。
FLDなどの以前のFPUコードは知っていますが、STPは32ビットで動作しますが、64ビットコンパイラではコンパイルエラーが発生します。64ビットで浮動小数点数を処理する方法はありますか?
delphi - FLD 命令 x64 ビット
x64ビットのFLD命令で少し問題があります... st0レジスタのスタックポインタFPUにDouble値をロードしたいのですが、無理そうです。Delphi x32 では、次のコードを使用できます。
残念ながら、x64 では同じコードは機能しません。
delphi - Delphi XE3 で align-data-move SSE を使用するには?
私は以下を実行しようとしていました、
movapsでAccess Violation が発生します。私の知る限り、メモリ位置が 16-align の場合、movapsは信頼できます。ムーブアップの場合は問題ありません (整列は必要ありません)。
私の質問は、Delphi XE3 では、この場合 {$CODEALIGN} が機能していないようです。
編集
非常に奇妙です...次のことを試しました。
「ウィンドウを使用」が追加されていない場合は、すべて問題ありません。「ウィンドウを使用」の場合、c := add4(a, b)で例外がスローされますが、 test()ではスローされません。
誰がこれを説明できますか?
編集 して、今ではすべてが理にかなっています。Delphi XE3 - 64 ビットの結論は次のとおりです。
- X64 のスタック フレームは (必要に応じて) 16 バイトに設定され、{$CODEALIGN 16} は proc/fun のコードを 16 バイトに揃えます。
- 動的配列はヒープに存在し、SetMinimumBlockAlignment(mba16byte) を使用して 16 に整列するように設定できます
- ただし、スタック var は常に 16 バイト アラインされているとは限りません。
delphi - FreePascal x64 でのシステム ユニット関数のアセンブリ呼び出し
Win32、Win64、および OSX 32 用にコンパイルして正常に動作する (XE2) Delphi/アセンブリ コードがいくつかあります。ただし、Linux で動作させる必要があるため、FPC バージョンのコンパイルを検討しています (これまでのところ、Win32 /64、Linux32/64)。
概して、それはうまく機能しますが、私がうまくいかなかったのはSystem
、次のような Delphi ユニット関数への呼び出し/ジャンプです。
これは FPC Win32/Linux32 では望ましい効果があるように見えますが、FPC Win64/Linux64 では例外で失敗します。(私はプラットフォーム間の呼び出し規約の違いに精通しているので、それが理由だとは思いません。)
x64 プラットフォームの FPC でこれを行う正しい方法は何ですか?
[Edit1] --- David のコメントに応えて、問題を説明する単純化されたプログラムを次に示します (少なくとも、正確にそうなることを願っています)。
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
この 2 つによってコンパイルされたバージョンでレジスタの配置が異なる場合があります。解決策は、この違いを回避することです。これを行う 1 つの方法は、上記の FillMemCall の例では、次のようになります。
これはまったく美しいとは言えませんが、Delphi と FPC の両方で Win/Linux 32/64 で機能するようになりました。
delphi - 内部 System.pas 関数のアドレスを取得するにはどうすればよいですか?
私は JIT コンパイラに取り組んでおり、文字列などのマネージド型の適切なクリーンアップ ブロックを出力する方法を見つけようとしています。
タイプのローカル変数を 1 つ持つ関数のクリーンアップ ブロックの逆アセンブリは、string
次のようになります。
@UStrClr
残念ながら、私は のアドレスを取得する良い方法を持っていない@HandleFinally
ので、私の JITter はそれらを挿入することができます。それらは System.Pas as _UStrClr
and _HandleFinally
,インターフェイスセクションで宣言されていますが、これらの識別子を使用しようとするとコンパイラ エラーが発生するため、何らかの「魔法」が行われているようです。
そこで、グローバル ポインタを宣言してmov func_ustr_clear, @UStrClear
. 今回は、宣言されていない識別子エラーは発生しません。さらに奇妙なことがわかります:
それで、これを正しく行う方法を知っている人はいますか?
delphi - ASM/Delphi - 分割
50 と 5 の 2 つの数値を除算しようとしています。これが私のコードです。
DivisionByZeroException
Delphiでは例外です。誰かが私が間違っていることを教えてもらえますか?
delphi - 自己が含まれている場合、eaxがゼロを返すのはなぜですか?
「Using Assembler in Delphi」によると、eax
が含まれますSelf
。ただし、 の内容はeax
、示されているように 0 です。何が悪いのだろうか?