Max*_*nov 1 assembly gcc gnu-assembler c-preprocessor
我有大量的常量,这些常量被越来越多的源文件使用.我需要能够玩它的价值,所以在一个地方定义它很方便.
我的情况的一个例子如下:
我定义变量的头文件rmode_loc.h:
#define __ASSEMBLER__
#define BSEQ_HI 0xF000
#define BSEQ_LO 0x0000
Run Code Online (Sandbox Code Playgroud)
我们(应该)使用的一些代码的摘录,myprog.S:
.code16
/* Include constants */
#include "rmode_loc.h"
_start:
...
push $BSEQ_HI
...
mov $BSEQ_LO, %bx
Run Code Online (Sandbox Code Playgroud)
但是,在尝试编译时,链接器会报告以下错误:
myprog.o: In function `_start':
(.text+0x1b): undefined reference to `BSEQ_HI'
myprog.o: In function `_start':
(.text+0x1f): undefined reference to `BSEQ_LO'
Run Code Online (Sandbox Code Playgroud)
显然正在尝试链接这些"符号" - 因此我得出结论,预处理器没有将符号替换为值所表示的值rmode_loc.h.
我读了另一个SO帖子(找不到链接),其中提到如果源文件的扩展名.s没有预处理会发生,并且__ASSEMBLER__还给出了定义的建议- 但是,这似乎不是在这里发布,因为所有的源都有.S扩展,我#define __ASSEMBLY__在标题中添加了一个.
然而,使用GCC作为前端进行编译时,即gcc myprog.S -o myprog,将BSEQ标签正确更换,一切编译.
我的问题是,在使用as而不是gcc产生这些结果时,预处理有什么区别,在使用gcc编译汇编代码时是否有任何重大的技术差异as?
GNU as本身从不处理#define指令.
所述的一个特殊功能gcc命令是给定的结束在一个文件名时.S,它运行C预处理器cpp在其上(其处理#define和#include等等),然后运行as对所得到的输出.但是当给出一个以文件结尾的文件名时.s,它就会运行as.
如果要使用C预处理程序指令,可以命名文件.S并使用gcc命令,或者根据需要命名它们并手动执行两个传递:
cpp foo.s |as -o foo.o -
Run Code Online (Sandbox Code Playgroud)