AT&T 構文を使用して Linux でアセンブラを少しテストしました。私が驚いたことの 1 つは、私が読んでいた本が 32 ビットの観点から書かれていることでした。したがって、すべてのサイズを正しい 64 ビット バージョンに変更する必要があります。または、リンク時にasの--32フラグとldの-melf_i386フラグを使用してコードをアセンブルすることもできました (実際に実行しました) 。また、いくつかのコードを適応させ、Cygwin の下の Windows で実行できるようにしました。
しかし、それは私に考えさせました。WindowsとLinuxで32ビットと64ビットを処理する場合に、アセンブラーでチェックのようなifdefを実行する方法はありますか? たとえば、Linux では.globl _startを使用し、Windows では.globl _mainを使用します。
それとも、アセンブル前にチェックを行い、チェック結果に応じて別のソースファイルをアセンブルするという対応ですか?
つまり、 foo_linux.sとfoo_windows.s
もしそうなら、どの.sファイルを使用するか分からず、プログラムを作成する際に含める必要があるという事実をどのように克服しますか?
たとえば、socket_linux.sとsocket_windows.sがあるとします。どちらも同じインターフェースを提供しますが、ソケットに関連する OS 固有の作業を行います。しかし、自分のプログラムでソケットを使用する場合、Windows 版と Linux 版のどちらを含める必要があるかわかりません。だから私はちょっとめちゃくちゃになるでしょう:)
では、これはアセンブラでどのように処理されるのでしょうか? たとえば C++ では、自分のsocket.hとsocket.cppをインクルードし、 #ifdefステートメントですべての Linux および Windows 固有のコードをラップできます。