0

以下代码应该采用两个列表并将它们放入一个大列表(C[10])中,作为汇编的初学者,我不确定如何检查我的输出是否正确。我尝试实现打印以检查左半部分是否有效,但它只打印零。(https://www.kvakil.me/venus/使用这个网站作为模拟器)

    .data
A:
    .word 0,2,3,3,4
B:
    .word 24,22,21,25,23
C:
    .word 1,1,1,1,1,1,1,1,1,1,1
min:
    .word 0
.text
.globl _main   
_main:
    add x8,x8,x0 #x8=i=0
    addi x9,x9,5  #x9=5
    #start of the loop
loop:   
        bge x8,x9,exit
        add x18,x0,x8   #x18=i
        slli x18,x18,2  #x18=i*4
        addi x19,x18,20  #x19 =i*4+ 4*5
        la x20,A #x20=&A
        la x21,B #x21=&B
        la x22,C #x22=&C
        add x20,x18,x20 #x20=&A[i]
        lw x20,0(x20) #x23=A[i]                
        add x21,x19,x21 #x21=&B[i]
        lw x21,0(x21) #x24=B[i]
        add x23,x22,x19 #x23=&C[i+5]
        sw x23,0(x21) #C[i+5]=B[i]
        add x22,x18,x22 #x22=&C[i]
        sw x22,0(x20) #C[i]=A[i] 
        
        
        addi a0,x0,1
        add x20,x0,x20
        ecall

        
        addi x8,x8,1 #i=i+1
        beq x0,x0,loop
                   
exit:

我猜代码应该打印 0224 但它只打印 0。

4

1 回答 1

0
loop:   
    bge x8,x9,exit
    add x18,x0,x8   #x18=i
    slli x18,x18,2  #x18=i*4
    addi x19,x18,20  #x19 =i*4+ 4*5
    la x20,A #x20=&A 
    la x21,B #x21=&B
    la x22,C #x22=&C
    add x20,x18,x20 #x20=&A[i]
    lw x20,0(x20) #x23=A[i]         # comment says x23, but code says x20             
    add x21,x19,x21 #x21=&B[i]
    lw x21,0(x21) #x24=B[i]         # comment says x24, but code says x21
    add x23,x22,x19 #x23=&C[i+5]
    sw x23,0(x21) #C[i+5]=B[i]      # (*B[i]) = &C[i+5] ... I don't think you want this
    add x22,x18,x22 #x22=&C[i]
    sw x22,0(x20) #C[i]=A[i]        # (*A[i]) = &C[i] ... or this
            
    addi a0,x0,1
    add x20,x0,x20
    ecall

    
    addi x8,x8,1 #i=i+1
    beq x0,x0,loop

像 Jester 所说的那样,一步一步来确认你认为正在发生的事情确实如此——不要等着看最终输出是对/错,使用单步检查每条指令!每一条指令都是一个错字或设计问题的机会;如果任何一件事是错误的,程序将无法完全运行。

一般来说,你过早地重新利用寄存器来破坏值,因为事实证明你以后仍然想要它们的旧值。

除此之外,当评论和代码不一致时,这是需要调查的。我还建议使用友好的寄存器名称,例如a0, t0s0而不是原始的数字名称——这可能对这个分配无关紧要,但如果你开始进行过程/函数调用,它就会发生。

于 2021-03-03T02:23:09.410 回答