在Assembler中指定数组

时间:2011-03-14 16:26:17

标签: c assembly sparc

我想在程序集文件中指定一个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 个答案:

答案 0 :(得分:2)

警告:我从未使用sparc程序集,但看到没有人回答,我做了一个快速教程,看看我是否可以提供帮助。

根据this pageld指令中的常量必须是当前值的4KiB内的偏移量。您正在尝试添加地址,而不是偏移量,这就是您收到错误的原因。此外,数据部分可能远离文本部分超过4 KiB。您需要做的是将数组的地址放在%l7中,并将12个字节用作ld的常量。为此,您可以使用set指令(这实际上不是指令,汇编程序将其更改为sethior组合。)。

set  my_array,%l7
ld   [%l7 + 12],%l7

答案 1 :(得分:0)

ld [%l7 + my_array], %l7指令被组装成32位操作码,其中包含(除其他之外)my_array值的13位字段(即数组地址)。错误消息是链接器告诉您它无法将32位地址装入13位字段...

要将32位地址装入寄存器,必须使用两条指令,即sethi(设置高22位)和or(设置低10位)。这看起来像这样:

sethi  %hi(my_array), %l7
or     %l7, %lo(my_array), %l7
ld     [%l7+12], %l7

访问第四个数组元素。前两条指令可以用伪指令set替换:

set    my_array, %l7
ld     [%l7+12], %l7

产生相同的机器代码。无论哪种方式,汇编程序都会生成一个带有22位字段的sethi操作码和一个带有10位数据字段的or操作码,并将这些操作码的位置写入目标文件元数据。获取所有目标文件并决定my_array数组最终将在RAM中的位置的链接器填充这些字段。注意:如果您打算将代码放在共享库(.so文件)中,那么事情会更复杂。