6

AT&T 構文を使用して Linux でアセンブラを少しテストしました。私が驚いたことの 1 つは、私が読んでいた本が 32 ビットの観点から書かれていることでした。したがって、すべてのサイズを正しい 64 ビット バージョンに変更する必要があります。または、リンク時にas--32フラグとldの-melf_i386フラグを使用してコードをアセンブルすることもできました (実際に実行しました) 。また、いくつかのコードを適応させ、Cygwin の下の Windows で実行できるようにしました。

しかし、それは私に考えさせました。WindowsLinuxで32ビットと64ビットを処理する場合に、アセンブラーでチェックのようなifdefを実行する方法はありますか? たとえば、Linux では.globl _startを使用し、Windows では.globl _mainを使用します。

それとも、アセンブル前にチェックを行い、チェック結果に応じて別のソースファイルをアセンブルするという対応ですか?

つまり、 foo_linux.sとfoo_windows.s

もしそうなら、どの.sファイルを使用するか分からず、プログラムを作成する際に含める必要があるという事実をどのように克服しますか?

たとえば、socket_linux.ssocket_windows.sがあるとします。どちらも同じインターフェースを提供しますが、ソケットに関連する OS 固有の作業を行います。しかし、自分のプログラムでソケットを使用する場合、Windows 版と Linux 版のどちらを含める必要があるかわかりません。だから私はちょっとめちゃくちゃになるでしょう:)

では、これはアセンブラでどのように処理されるのでしょうか? たとえば C++ では、自分のsocket.hsocket.cppをインクルードし、 #ifdefステートメントですべての Linux および Windows 固有のコードをラップできます。

4

3 に答える 3

10

GCC を使用してファイルをコンパイルし、.S(大文字の S を使用して) またはという名前を付けると.sx、アセンブラーを呼び出す前にそれらがプリプロセッサーに渡されます。

ドキュメントから:

file.s
   Assembler code. 
file.S
file.sx
   Assembler code which must be preprocessed.

コマンドラインに追加-vして、さまざまなサブプロセスがどのように呼び出されるかを確認できます。

于 2011-06-15T14:49:23.043 に答える
3

ifdefMASM (.asm) では、などを次のように使用できますifndef

ifdef X64
endif
于 2013-05-10T02:01:10.553 に答える