在Assembler中指定数组
我想在我的程序集文件中指定一个512 x 32位数组,如下所示:
#define FUNCTION_01 test
#define LABEL_01(name) .L ## test ## _ ## name
.section ".data"
my_array:
.word 0x10101010
.word 0x20101010
.word 0x30101010
.word 0x40101010
...
.section ".text"
.align 4
.global FUNCTION_01
.type FUNCTION_01,#function
FUNCTION_01:
add %g0, 12, %l7
ld [%l7 + my_array], %l7
...
ret
restore
LABEL_01(end):
.size FUNCTION_01,LABEL_01(end)-FUNCTION
所以我在function_01中尝试做的是访问我的数组中的第4个元素。但是,当我尝试为SPARC体系结构编译上面的程序集时,我收到以下错误:
(.text+0x75c): relocation truncated to fit: R_SPARC_13 against `.data'
collect2: ld returned 1 exit status
不确定从这个错误中得到什么。这是否意味着数组是大的还是代码中的其他错误?
没有找到相关结果
已邀请:
2 个回复
膏焦凑
指令中的常量必须是当前值的4KiB内的偏移量。您正在尝试添加地址,而不是偏移量,这就是您收到错误的原因。此外,数据部分可能远离文本部分超过4 KiB。你需要做的是将数组的地址放在%l7中,并使用12个字节作为常量
。为此,您可以使用
指令(这实际上不是指令,汇编程序将其更改为
和
组合。)。
遣莫捅炭
指令被组合成一个32位操作码,其中包含(除其他之外)
值的13位字段(即数组地址)。错误消息是链接器告诉您它将32位地址装入13位字段时遇到问题... 要将32位地址装入寄存器,必须使用两条指令,即
(设置高22位)和
(设置低10位)。这看起来像这样:
它访问第四个数组元素。前两条指令可以用伪指令
代替:
它产生相同的机器代码。无论哪种方式,汇编程序产生一个带有22位字段的
操作码和一个带有10位数据字段的
操作码,并将这些操作码的位置写入目标文件元数据。获取所有目标文件并决定
数组最终将进入RAM的链接器填充这些字段。注意:如果您打算将代码放在共享库(
文件)中,那么事情会更复杂。