我的编译器是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
答案 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)寻址保存计数的位置。
如果您不正确地进行硬编码,则该代码可能无法正确运行,因为您似乎没有提供与该特定问题相关的任何信息。您有一些片段,但没有与此问题相关的关键信息。
在编写更多代码之前,您应该重新开始,仅循环遍历数组并查看其是否有效,然后开始处理每个元素,然后保持得分。