如何在程序集中访问C预处理程序常量?

use*_*481 4 c assembly c-preprocessor

如果我在C .h文件中定义一个常量:

#define constant 1
Run Code Online (Sandbox Code Playgroud)

如何在程序集.s文件中访问它?

Chr*_*ris 7

如果使用GNU工具链,gcc默认会在.S扩展名为大写的文件上运行预处理器(大写'S').因此,您可以使用程序集文件中的所有cpp功能.

有一些警告:

  • 汇编程序和预处理程序标记输入的方式可能有所不同.
  • 如果你是#include头文件,它们应该只包含预处理器指令,而不是像函数原型这样的C函数.
  • 您不应该使用#注释,因为它们将由预处理器解释.

例:

文件定义.h

#define REGPARM 1
Run Code Online (Sandbox Code Playgroud)

档案asm.S

#include "definitions.h"

.text
.globl relocate

    .align 16
    .type relocate,@function
relocate:
#if !REGPARM
    movl  4(%esp),%eax
#endif
    subl  %ecx,%ecx
    ...
Run Code Online (Sandbox Code Playgroud)

即使您不使用gcc,也可以使用相同的方法,只要汇编程序的语法与C预处理程序合理兼容(请参阅上面的警告).大多数C编译器都有一个选项来只预处理输入文件(例如-E在gcc中),或者您可能将预处理器作为单独的可执行文件.您可以在构建工具中在汇编之前包含此预处理.