アセンブリ言語/ really /はどの程度移植性がありませんか?
-
22-07-2019 - |
質問
アセンブリで何かを書いたり、プログラムにアセンブリを追加すると、移植性が損なわれることを理解しています。しかし、どれほど悪いですか?つまり、最近は基本的にすべてのPCがx86またはx64であるということですね。したがって、アセンブリをCプログラムに埋め込む場合、どこに行ってもコンパイルできないのですか?
この非移植性の概念は、特定のプロセッサの特定の癖を掘り下げて、コードからパフォーマンスの低下をすべて絞り出すときに参照するだけですか?
PCゲーム「Roller Coaster Tycoon」正しく覚えていれば、ほぼ完全にアセンブリ言語で書かれていました。だから...それは本当にどれほど移植性に欠けるか?
解決
もちろん、プロセッサ自体の他に、常に他の考慮事項があります。ターゲットプラットフォームでの呼び出し規則は何ですか? struct
値は他の(たとえば:API)関数にどのように渡されますか?呼び出し先によってどのレジスタが上書きされる可能性がありますか?発信者のために保持されることが保証されているのはどれですか?システムコールの実行方法プロセスの開始時にOSによって準備されるメモリレイアウトは何ですか?
他のヒント
アセンブリの移植には、OSごとに異なるABIの問題もあります。 CプログラムをUnixからWindows(またはLinuxからOpenBSD)に移植するのは簡単な再コンパイルかもしれませんが、アセンブリプログラムの場合、呼び出し先保存レジスタが呼び出し元保存になるか、浮動小数点パラメーターが別の方法で渡されます。
そしてこれは単に理論的なものではありません。 LinuxおよびMac OS XのPowerPCバージョンのr2を登録します。実際には、問題はそれほど深刻ではないかもしれません。 64ビット命令セットと同時にABI。
「PC == Windows」と思われる場合、アセンブラをCプログラムに追加してもそれほど問題はありません。 Unixの世界に足を踏み入れると、PS3またはXBoxのPPC、古いMac、多くの強力なサーバーなど、さまざまなCPUを使用できます。多くの小型デバイスには、ARMがあります。組み込みデバイス(現在インストールされているCPUの大半を占める)は、通常、特別な命令セットで独自のカスタムCPUを使用します。
したがって、今日の多くのPCはIntelコードを実行できますが、それはそこにあるすべてのCPUのごく一部しか占めていません。
とはいえ、x86コードも常に同じとは限りません。アセンブリコードには2つの主な理由があります。特別な機能(割り込みレジスタなど)にアクセスする必要があるか、コードを最適化するかです。前者の場合、コードはかなり移植性があります。後者の場合、各CPUは少し異なります。それらの一部には SSE があります。しかし、SSEはすぐにSSE2に置き換えられ、SSE2はSSE3およびSSE4に置き換えられました。 AMDには独自のブランドがあります。すぐに、AVXがあります。オペコードレベルでは、各バージョンのCPUのタイミングはそれぞれわずかに異なります。
事態を悪化させるため、一部のオペコードにはCPUの特定のステップで修正されるバグがあります。その上、一部のオペコードは、特定のバージョンのCPUでは他のバージョンよりもはるかに高速です。
次に、このアセンブリコードをCパーツとインターフェイスさせる必要があります。これは通常、 ABI の問題に対処する必要があることを意味します。
だから、これはarbitrarily意的に複雑になることがわかります。
アセンブリは、特定のプロセッサ向けに直接命令を記述します。つまり、x86が永久に存続する場合、コードは何らかの形で移植可能です。
しかし、今でもアームプロセッサが復活しています(つまり、次世代のネットブック)。来年もプロセッサは変わらないでしょう。
アセンブリ言語は設計上、移植性がないと思います。