6

我已经使用 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.sfoo_windows.s

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

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

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

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

在 MASM (.asm) 中,您可以使用ifdef,ifndef等,如:

ifdef X64
endif
于 2013-05-10T02:01:10.553 回答
1

在为不同平台编写时,您可以定义一些宏来加载目标特定文件:

文件target.h

#if defined(__arm__)
    #define target "arm"
#elif defined(__x86_64__)
    #if defined(_WIN64)
        #define target "win64"
    #else
        #define target "linux64"  // all non-Win share the same calling convention
    #endif
#else
    // 32bit defs
#endif

然后您可以在宏中包含目标特定文件,两个字符串文字依次得到一个文字:

#include "target.h"

#include "target_specific_code_" target ".h"

它包括以下文件之一:

target_specific_code_arm.h
target_specific_code_win64.h
target_specific_code_linux64.h
...

编辑:

像这样,您还可以定义目标特定的汇编程序指令,以供以后在内联汇编中使用:

#ifdef ...
    #define ASM_PP_LOAD_WORD "movi "
#else
    #define ASM_PP_LOAD_WORD "mov "
#endif

或作为宏

#ifdef ...
    // when using intel assembler there is a different
    // order of parameters
    #define ASM_PP_LOAD_WORD(a, b) "movi " #b ", " #a
#else
    #define ASM_PP_LOAD_WORD(a, b) "mov " #a ", " #b
#endif
于 2017-07-15T16:34:43.220 回答