Assembly (mips64)lw和sw未向寄存器添加值

Assembly (mips64)lw和sw未向寄存器添加值,assembly,mips64,Assembly,Mips64,我是mips新手,对于一个家庭作业项目,我们必须将C代码转换为mips64程序集,并使用winmips64运行它。C代码如下所示: void fir(int X[], int H[], int Y[], int n, int m) { int i, j; int y0; for (j=0; j<m; j++){ y0=0; for (i=0; i<n; i++){ y0+=X[i+j]*H[i];

我是mips新手,对于一个家庭作业项目,我们必须将C代码转换为mips64程序集,并使用winmips64运行它。C代码如下所示:

void fir(int X[], int H[], int Y[], int n, int m)
{
    int i, j;
    int y0;

    for (j=0; j<m; j++){
        y0=0;
        for (i=0; i<n; i++){
            y0+=X[i+j]*H[i];
        }
        Y[j]=y0;
    }
}
更具体地说,这些行是因为没有值添加到寄存器
r10、r6
r12

lw r10, r9(r0)                               #load x[i+j] to r10
lw r12,r11(r1)                               #load h[i] to r12
sw r6, r14(r2)                               #Y[j] = y0
winmips64文档提到我需要使用一个立即数来存储/加载到数组和从数组中加载数据,但是当我不知道立即数,而这些值是基于添加和乘以索引的时候,我该怎么做呢?它们不是必须存储在寄存器中吗

提前谢谢你的帮助

编辑:代码总数

.data                                           #data segment
    X: .word 1,1,1,2,2,3,4,2,1,1,2,3,2,4,8,1    #X[]
    H: .word 1,5,1,4,2,1,1,1                    #H[]
    Y: .space 64                                #n*8 = 8*8 = 64 bytes reserved for the y0 results = R2

    n: .word 8                                  #n = 8
    m: .word 8                                  #m = 8

   

.text
fir:                                            #void fir
    
    ori r15, r0, X                             #address of X[]
    ori r1, r0, H                              #address of H[]
    ori r2, r0, Y                              #address of Y[]

    daddi r3,r3,8                               # n = r3 = 8
    daddi r4,r4,8                               # m = r4 = 8

    dadd r5,r0,r0                              #set j counter to 0
    daddi r18,r0,8                                  

    j for1                                      #go to for1 loop

for1:   
    beq r5,r4,exit                              #when j is equal to m loop stops and goes to the exit function
    dadd r6,r0,r0                               #y0 = r6 = 0
    dadd r7,r0,r0                               #set i counter to 0 for every loop

    bne r5,r4,for2                              #go to the nested loop for2

for2:
    beq r7,r3, afterfor2                        # for(i=0, i<n, i++)

    #making X[i+j]
    dadd r8,r5,r7                               #i+j stored in r8
    dmul r9,r8,r18                              #(i+j)*8 to find address stored in r9
    daddu r9,r9,r15
    ld r10,(r9)                                 #load x[i+j] to r10

    #making H[i]
    dmul r11,r18,r7                             #8*i
    daddu r11,r11,r1                            #adding 8*i to the base address
    ld r12,(r11)                                #load h[i] to r12

    dmul r13,r10,r12                            #x[i+j] * h[i]
    dadd r6,r6,r13                              #y0 = y0 + x[i+j]*h[i]
    daddi r7,r7,1                               # i++
    j for2                                      # repeat loop

afterfor2: 
        
    dmul r14,r5,r18                             #8*j stored to r14
    daddu r14,r14,r2
    sd r6,(r14)                                 #Y[j] = y0
    daddi r5,r5,1                               #j++
    
    j for1                                      #go back to start of loop for1


exit:
    halt                                        #exit program
.data#数据段
单词1,1,1,2,2,3,4,2,1,1,2,3,2,4,8,1#X[]
H:.单词1,5,1,4,2,1,1,1#H[]
Y:.空间64#n*8=8*8=64字节,为y0结果=R2保留
n:.单词8#n=8
m:.单词8#m=8
.文本
fir:#无效fir
ori r15,r0,X#X的地址[]
ori r1,r0,H#H的地址[]
ori r2,r0,Y#Y的地址[]
daddi r3,r3,8#n=r3=8
daddi r4,r4,8#m=r4=8
dadd r5、r0、r0#将j计数器设置为0
daddi r18,r0,8
j for1#转到for1循环
第1组:
beq r5,r4,退出#当j等于m时,循环停止并进入退出功能
数据r6,r0,r0#y0=r6=0
dadd r7、r0、r0#将每个循环的i计数器设置为0
bner5,r4,for 2#转到嵌套循环for 2
第2组:

beq r7,r3,after for 2#for(i=0,i没有
寄存器(register)
这样的寻址模式。您必须先将两个寄存器相加

例如,代替lw r12、r11(r1)
,执行以下操作:

daddu r11,r11,r1
lw r12,(r11)

请注意,在
lw r10,r9(r0)
的情况下,您可以简单地将其替换为
lw r10,(r9)
,因为
r0
的值硬连线为0。

没有
寄存器(寄存器)
这样的寻址模式。您必须首先将两个寄存器相加

例如,代替lw r12、r11(r1),执行以下操作:

daddu r11,r11,r1
lw r12,(r11)

注意,在
lw r10,r9(r0)
的情况下,您可以简单地用
lw r10,(r9)
替换它,因为
r0
的值是硬连线到0的。

我确实像您说的那样,但是运行
lw r12,(r11)
没有加载
r11
h[i]/code>)要注册
r12
,因此
r12
保留值为零,数据无法存储。我也不知道
r0
硬连线到值为零,所以我将其更改为另一个寄存器以修复它,
r0
应该是
x[]
。然后这些寄存器中的一个或多个包含错误的值,或者您的数据组织不正确。由于您只发布了部分代码,其他人无法说出。请使用调试器逐步完成循环,并验证每个寄存器在每条指令中都具有预期的值。
r11
确实具有正确的值当运行循环时,似乎是这样,但执行
lw r12,(r11)
并不会将
r11
s值添加到
r12
。我总共发布了整个程序,但我也在进一步研究。感谢您的帮助
ld r15,X(r0)
加载
X
地址的方法似乎不正确。紧跟其后的两条指令也一样。如果您的汇编程序支持,请使用
la
伪指令。否则,您可能必须找到这些标签的确切地址,并使用
lui
+
ori
加载它们。WINMIPS64不支持ort
la
指令,但您是正确的!
ld
没有加载数组的地址,而是加载它们的第一个值。使用
ori
指令有效!感谢您的支持,t-Ti按照您所说的做了,但运行
lw r12,(r11)
没有加载
r11
h[i]
)要注册
r12
,因此
r12
保留值为零,数据无法存储。我也不知道
r0
硬连线到值为零,所以我将其更改为另一个寄存器以修复它,
r0
应该是
x[]
。然后这些寄存器中的一个或多个包含错误的值,或者您的数据组织不正确。由于您只发布了部分代码,其他人无法说出。请使用调试器逐步完成循环,并验证每个寄存器在每条指令中都具有预期的值。
r11
确实具有正确的值当运行循环时,似乎是这样,但执行
lw r12,(r11)
并不会将
r11
s值添加到
r12
。我总共发布了整个程序,但我也在进一步研究。感谢您的帮助
ld r15,X(r0)
加载
X
地址的方法似乎不正确。紧跟其后的两条指令也一样。如果您的汇编程序支持,请使用
la
伪指令。否则,您可能必须找到这些标签的确切地址,并使用
lui
+
ori
加载它们。WINMIPS64不支持ort
la
指令,但您是正确的!
ld
没有加载数组的地址,而是加载它们的第一个值。使用
ori
指令工作正常!感谢您与我分享t-t