RISC-V加载地址未与字边界对齐

时间:2020-11-09 09:21:22

标签: assembly riscv risc

我的编译器是RARS。

这是问题所在。 有人告诉我,我需要定义一个内存基地址,并且不允许使用伪指令。因此,我不能使用la, li, and j

当我尝试执行此操作时,出现此错误:

Error in /Users/SumOfArray.asm line 22: Runtime exception at 0x00400018: Load address not aligned to word boundary 0x00000001

Go: execution terminated with errors

我认为有错误的22行是这个: lw t4,0(t3) 创建lui指令之后。我将需要遍历它,以将值保存到数组中。

我想我想问的是如何在下面修复我的代码,以得到lui指令并无错误地遍历数组。

  .data
array:      .word 1,2,3,4,5,6,7,8,9,10,11,12,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-5, 0 
positiveSum:    .word 0
negativeSum:    .word 0

   .text

main:
    lui s0, 0x10010
        lw t0,0(s0)      #load array to register t0 
        lw s1,0(s0)      #load the positive sum to s1, and negative sum to s2           
        lw s2,0(s0)

loop:                   #store values in an array using loop
    slli t3,t1,2
    add t3,t3,t0        #add the base address and the above result
    lw t4,0(t3)         #load the word from above address into t4
    beqz t4,exit        #exit loop when reaching 0

2 个答案:

答案 0 :(得分:1)

您遇到的问题是您尝试使用地址(t1 << 2)+ t0的lw。首次使用时,T0等于1(除非同时对其进行了修改),这将给出未对齐的字地址。不支持(或至少默认情况下不支持),这会显示您看到的错误。

可能未对齐的访问默认情况下被禁用。规范说明了什么:

为获得最佳性能,所有加载和存储的有效地址应自然对齐每种数据类型(即,对于32位访问,在四字节边界上,对于16位访问,在二字节边界上)。基本ISA支持未对齐的访问,但是根据实现的不同,这些访问可能运行得非常慢。此外,自然对齐的加载和存储可保证自动执行,而未对齐的加载和存储则可能不会执行,因此需要额外的同步以确保原子性。

为避免您遇到的错误,有两种可能性:
您确实需要进行未对齐的访问,并且必须启用此功能。
您想要的是阅读第一个单词,第二个单词...然后您需要做的就是将从数组中获得的元素(向左移2)。

lw s1,0(s0)      #load the positive sum to s1, and negative sum to s2           
lw s2,0(s0)

可能需要替换为:

lw t4,0(t3)     
sw s1, 0(s0)    
sw s2, 4(s0)    

还:

lui s0, 0x10010
    lw t0,0(s0)   #load array to register t0 
    lw s1,0(s0)   #load the positive sum to s1, and negative sum to s2           
    lw s2,0(s0)

需要替换为:

main:
    la t0, array
    la s0, positiveSum

答案 1 :(得分:0)

std::string

当然,只要您确实做到了,就可以对这些偏移量进行硬编码。您没有显示链接脚本或对.text和.data的地址空间需求,以查看它们如何适合您的代码。如果这是一种计算多少个正数和多少个负数的程序,则需要1)遍历数组并2)寻址保存计数的位置。

如果您不正确地进行硬编码,则该代码可能无法正确运行,因为您似乎没有提供与该特定问题相关的任何信息。您有一些片段,但没有与此问题相关的关键信息。

在编写更多代码之前,您应该重新开始,仅循环遍历数组并查看其是否有效,然后开始处理每个元素,然后保持得分。