我已经使用 AT&T 语法在 Linux 上测试了一些汇编程序。令我印象深刻的一件事是,我正在阅读的这本书是从 32 位的角度编写的。因此,对于我来说,所有大小都必须更改为正确的 64 位版本。或者我可以(我这样做了)在链接时使用as的--32标志和ld的-melf_i386标志来组装代码。我还修改了一些代码并在 Cygwin 下的 Windows 上运行。
但这让我开始思考。如果我在Windows上和在Linux下的另一件事,是否有办法执行ifdef之类的检查汇编程序来做一件事,并以这种方式处理32位和64位?例如,在 Linux 下有一个.globl _start ,在 Windows 下有一个.globl _main。
或者这是通过在组装之前检查并根据检查结果组装不同的源文件来处理的?
即foo_linux.s和foo_windows.s
如果是这样,您如何克服在创建程序时不知道将使用哪些.s文件并因此必须包括在内的事实?
例如,假设我们有一个socket_linux.s和一个socket_windows.s。它们都提供相同的接口,但执行与套接字相关的操作系统特定工作。但是当我在我的程序中使用套接字时,我不知道我是否需要包含 Windows 或 Linux 版本。所以我会有点搞砸:)
那么在 Assembler 中是如何处理的呢?例如,在 C++ 中,我可以包含我的socket.h和socket.cpp,并将所有 Linux 和 Windows 特定代码包装在#ifdef语句中。