在处理常量时,我在混合使用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
这question使我偏离了正确的轨道。