在处理常量时,我在混合C和Assembly时遇到了一些问题。我使用的是XCode 6.1。
例如,我有一个汇编文件:
.section __DATA,__data,regular
.globl _memLoc
.globl _myData
_myData = 0x01234567 // <--- my constant
.align 2
_memLoc:
.long _myData
在这里,我生成一个4字节的值,该值存储在标记为_memLoc的内存位置中。我可以从C引用这个内存位置,很好:
extern uint32_t memLoc;
uint32_t *ptr = &memLoc;
检查*ptr会产生预期结果。现在我也想引用C中的_myData,但我得到了EXC_BAD_ACCESS。我尝试过,但没有运气:
extern uint32_t myData;
uint32_t value = myData;
_memLoc和_myData之间的实际区别是什么?这两个符号都是在汇编时创建并全局化的,但对_myData的引用会导致程序失败。
实际上,我在这里要做的是只定义一次常量,并使它可以从C和Assembly中访问。这可能吗?
结果发现答案比我想象的要简单。汇编程序可以识别预处理器指令,所以我所要做的就是把常量放在一个常规的.h文件中,然后导入到.s文件中:
#include "Myconstants.h"
...
_memLoc:
.long MYCONSTANT
这个问题使我走上了正轨。