【发布时间】:2011-09-15 14:26:42
【问题描述】:
我在 Linux 上使用 AT&T 语法测试了一些汇编程序。让我印象深刻的一件事是,我正在阅读的这本书是从 32 位的角度编写的。因此,对于我来说,所有大小都必须更改为正确的 64 位版本。或者我可以(我这样做了)使用 as 的 --32 标志和 ld 的 -melf_i386 标志来组装代码 链接时。我还修改了一些代码,并在 Cygwin 下运行在 Windows 上。
但这让我开始思考。如果我在 Windows 和 Linux 下的另一件事,并且还处理 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 语句中。
【问题讨论】:
标签: cross-platform assembly platform-independent