是否可以在汇编程序中使用#ifdef之类的检查?

inq*_*uam 4 assembly cross-platform platform-independent

我在Linux上使用AT&T语法测试了一些汇编程序.让我印象深刻的是,我读的这本书是从32位的角度写的.因此,我必须将所有大小更改为正确的64位版本.或者我可以(我做过)使用--32标志为as组合代码,并在链接时使用-melf_i386标志为ld.我还调整了一些代码并在Cygwin下运行在Windows上.

但这让我思考.有没有办法做ifdef像汇编程序中的检查做一件事,如果我在Windows上,另一个在Linux下,并以这种方式处理3264位?例如,在Linux下有一个.globl _start,在Windows 下有一个.globl _main.

或者这是通过在组装之前检查并根据检查结果组装不同的源文件来处理的?

foo_linux.sfoo_windows.s

如果是这样,你如何克服这样一个事实,即你不知道在创建程序时你将使用哪些.s文件,因此必须包括?

例如,假设我们有一个socket_linux.s和一个socket_windows.s.它们都呈现相同的接口,但执行与套接字相关的操作系统特定工作.但是当我在我的程序中使用套接字时,我不知道是否需要包含Windows或Linux版本.所以我会有点搞砸:)

那么在Assembler中如何处理?例如,在C++中,我可以包含我的socket.hsocket.cpp,并将所有Linux和Windows特定代码包装在#ifdef语句中.

Igo*_*sky 7

如果使用GCC编译文件并将它们命名.S(使用大写S),或者.sx在调用汇编程序之前将它们传递给预处理程序.

来自文档:

file.s
   Assembler code. 
file.S
file.sx
   Assembler code which must be preprocessed.
Run Code Online (Sandbox Code Playgroud)

您可以添加-v到命令行以查看如何调用各个子进程.