Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 能否在汇编中添加预处理器指令?_C_Assembly_C Preprocessor - Fatal编程技术网

C 能否在汇编中添加预处理器指令?

C 能否在汇编中添加预处理器指令?,c,assembly,c-preprocessor,C,Assembly,C Preprocessor,我想根据头文件中的定义执行一些汇编指令 假设在test.h中,我有#define DEBUG 在test.asm中,我想以某种方式进行检查,比如#ifdef DEBUG做点什么 这可能吗?我在类似的问题或在线问题中找不到有用的东西。是的,您可以在asm文件上运行C预处理器。这取决于您的构建环境如何做到这一点gcc会自动运行它。请注意,无论包含什么,都应该与asm兼容。通常的做法是使用#ifndef ASSEMBLY或类似的构造,有条件地包含部分标头,这样就可以在同一标头中包含C和ASM部件。C预

我想根据头文件中的定义执行一些汇编指令

假设在
test.h
中,我有
#define DEBUG

test.asm
中,我想以某种方式进行检查,比如
#ifdef DEBUG
做点什么


这可能吗?我在类似的问题或在线问题中找不到有用的东西。

是的,您可以在asm文件上运行C预处理器。这取决于您的构建环境如何做到这一点<例如,对于扩展名为
.S
(大写)的文件,code>gcc会自动运行它。请注意,无论包含什么,都应该与asm兼容。通常的做法是使用
#ifndef ASSEMBLY
或类似的构造,有条件地包含部分标头,这样就可以在同一标头中包含C和ASM部件。

C预处理器只是一个输入数据(C源文件)、转换数据并再次输出数据(翻译单位)的程序

您可以手动运行它,如下所示:

gcc -E < input > output
gcc-Eoutput
这意味着您可以在.txt文件或latex文件上运行C预处理器,如果您愿意的话

当然,难点在于如何将其集成到构建系统中。这在很大程度上取决于您使用的构建系统。如果涉及makefiles,则为汇编程序文件创建一个目标:

assembler_file: input_1 input_2
        gcc -E < $^ > $@
assembler\u文件:输入\u 1输入\u 2
gcc-E<$^>$@

然后你以你通常编译它的任何方式编译“汇编程序文件”。

当然,但那不再是汇编语言,你需要通过一个C预处理器,它也知道这是一个混合C/asm文件,做C预处理部分,但不尝试编译,然后,它将数据馈送到汇编器,或者内置自己的汇编器


可能,很大程度上取决于您的工具链(支持或不支持),但IMO留下了一个非常糟糕的味道,YMMV。

我想我不明白,在
测试中。asm
我想检查一下,比如
#ifdef DEBUG
做点什么…,预处理器
#ifdef
并不意味着执行给定的代码块,但是要编译一个给定的块,我认为这取决于你使用哪种asm编译器,我知道nasm中有一些预处理器指令,但还没有更多的探讨。您用什么编译程序?对于Microsoft MASM(ML.EXE),有条件指令:。如果你能找到副本,还有一个H2INC.EXE实用程序可以将.h文件转换为MASM.inc文件。你能解释一下“asm兼容”是什么意思吗?我刚刚发现我不必再包含标题,但我不想让问题变得更具体,因为它已经存在。asm兼容意味着它应该只包含在asm源中有效的内容。例如,它不应该有函数原型或类型定义。正如我所说的,如果它们受到适当指令的保护,因此在组装时不可见,那么文件可以包含它们。