在m68k架构下定义局部字符串时GCC生成未对齐地址错误代码
在M68K架构下解决字符串初始化的地址错误问题
你在函数中声明了包含空终止符共5字节的字符串:
int main(){ char fstring[] = "AAAA"; ... }
生成的汇编代码中出现了访问奇数地址的指令:
main: link.w %fp,#-16 move.l #1094795585,-13(%fp) ; -13为奇数地址,M68K架构下move.l访问会触发地址错误 clr.b -9(%fp) ...
由于M68K架构规定move.l或move.w访问奇数地址会触发Address Error异常,可通过以下方法强制编译器生成正确代码:
调整编译器对齐选项
针对M68K的主流编译器(如GCC)支持通过编译选项强制数组按长字边界对齐。添加-falign-arrays=4或-malign-data=4选项,让编译器为字符串数组分配4字节对齐的地址,确保move.l指令访问的是合法地址。手动指定变量对齐属性
在变量声明时显式添加对齐属性,以GCC为例:int main(){ char fstring[] __attribute__((aligned(4))) = "AAAA"; ... }该属性会强制编译器将
fstring的起始地址对齐到4字节边界,避免后续指令访问奇数地址。字节级手动初始化(不推荐)
若编译器不支持对齐选项或属性,可拆分字符串为单个字符赋值,迫使编译器生成字节级初始化指令,但这种方式会降低代码执行效率,仅作备选方案:int main(){ char fstring[5]; fstring[0] = 'A'; fstring[1] = 'A'; fstring[2] = 'A'; fstring[3] = 'A'; fstring[4] = '\0'; ... }
内容的提问来源于stack exchange,提问作者user1812
相关产品推荐
相关产品推荐

