问题描述
以下代码应该将两个列表放入一个大列表 (C[10]) 中,作为汇编初学者,我不确定如何检查我的输出是否正确。 我尝试执行打印来检查左半部分是否有效,但它只打印零。 (https://www.kvakil.me/venus/ 将此网站用作模拟器)
.data
A:
.word 0,2,3,4
B:
.word 24,22,21,25,23
C:
.word 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,exit
add x18,x0,x8 #x18=i
slli x18,x18,2 #x18=i*4
addi x19,20 #x19 =i*4+ 4*5
la x20,A #x20=&A
la x21,B #x21=&B
la x22,C #x22=&C
add x20,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,x22 #x22=&C[i]
sw x22,0(x20) #C[i]=A[i]
addi a0,1
add x20,x20
ecall
addi x8,1 #i=i+1
beq x0,loop
exit:
我猜代码应该打印 0224 但它只打印 0。
解决方法
loop:
bge x8,x9,exit
add x18,x0,x8 #x18=i
slli x18,x18,2 #x18=i*4
addi x19,20 #x19 =i*4+ 4*5
la x20,A #x20=&A
la x21,B #x21=&B
la x22,C #x22=&C
add x20,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,x22 #x22=&C[i]
sw x22,0(x20) #C[i]=A[i] # (*A[i]) = &C[i] ... or this
addi a0,1
add x20,x20
ecall
addi x8,x8,1 #i=i+1
beq x0,loop
像 Jester 所说的那样,并单步确认您认为正在发生的事情是真的——不要等待看到最终输出是对还是错,使用单步检查每一条指令!每一条指令都是错别字或设计问题的机会;如果任何一件事出了问题,程序将无法完全运行。
一般来说,您过早地重新利用寄存器会破坏值,因为事实证明您以后仍然需要旧值。
除此之外,当注释和代码不一致时,需要研究一下。我还建议使用友好的寄存器名称,例如 a0
、t0
、s0
而不是原始数字 - 可能与此分配无关,但如果您开始执行过程/函数调用。