ARM64汇编中如何将内存空间大小设为C文件定义的外部变量值?
结论
直接使用.space伪指令无法实现这个需求。.space是汇编期处理的伪指令,它的长度参数必须是汇编阶段就能确定的常量,而你通过.extern声明的length是定义在C文件中的变量,它的数值要到链接阶段甚至运行阶段才能确定,汇编器处理.space时无法获取这个变量的值,自然不能用来设置内存块长度。
可行替代方案
- 如果你可以接受
length为编译期固定值:
你可以把C文件中length的定义改为编译期宏,比如#define LENGTH 0x2000,编译汇编文件时通过gcc的-DLENGTH=0x2000参数把常量值传递给汇编器,直接把汇编代码改成.space LENGTH即可,这种场景不需要再用.extern声明length。 - 如果你需要
length是运行时可修改的变量:
静态分配固定大小内存的思路本身不适用,建议改为运行时动态分配:可以在C代码中调用malloc(length)分配对应大小的内存,把内存起始地址传递给汇编代码使用;也可以直接在汇编代码中调用malloc,传入length的值申请内存。 - 如果你只需要在链接阶段确定内存大小:
你可以把length改为链接脚本中定义的导出符号,在汇编中预留内存位置,由链接器最终填充长度值,这种场景下length不能作为普通C变量使用。
内容的提问来源于stack exchange,提问作者4396
相关产品推荐
相关产品推荐

