RISC-V 汇编语言。只打印零

时间:2021-03-02 21:56:22

标签: assembly riscv riscv32

以下代码应该将两个列表放入一个大列表 (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。

1 个答案:

答案 0 :(得分: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 所说的那样,并单步确认您认为正在发生的事情是真的——不要等待看到最终输出是对还是错,使用单步检查每一条指令!每一条指令都是错别字或设计问题的机会;如果任何一件事出了问题,程序将无法完全运行。

一般来说,您过早地重新利用寄存器会破坏值,因为事实证明您以后仍然需要旧值。

除此之外,当注释和代码不一致时,需要研究一下。我还建议使用友好的寄存器名称,例如 a0t0s0 而不是原始数字 - 可能与此分配无关,但如果您开始执行过程/函数调用。