鉴于:
.data
arr: .word 2,5,1,3,4
len: .word 5
sum: .word 0
我将如何访问每个字中的“改编”,比如2,3和4?
最后,我想做的是找到所有值的总和“ARR”,但我有困难,通过“改编”迭代。
感谢您的时间!
附加信息:
- 我使用eduMIPS64
鉴于:
.data
arr: .word 2,5,1,3,4
len: .word 5
sum: .word 0
我将如何访问每个字中的“改编”,比如2,3和4?
最后,我想做的是找到所有值的总和“ARR”,但我有困难,通过“改编”迭代。
感谢您的时间!
附加信息:
第一阵列的地址加载到寄存器中,那么就可以用一个恒定的偏移访问的项目。 (你的汇编可以支持结构,如lw $t0, arr+12
为方便简写本。请参阅手册。)对于迭代,要么递增地址寄存器,或添加包含偏移另一个寄存器。 一定要考虑项目的大小。 Folling例子是用于32个MIPS,根据需要调整为64位:
.data
arr: .word 2,5,1,3,4
len: .word 5
sum: .word 0
.text
.globl main
main:
la $t0, arr
lw $t1, 12($t0) # load arr[3] using byte offset
li $t1, 3 # index
sll $t1, $t1, 2 # multiply by item size
addu $t1, $t1, $t0 # add base address
lw $t1, ($t1) # load arr[3]
# iteration type 1
# for(i=len, ptr=arr; i != 0; i -= 1, ptr += 1)
# ... use *ptr ...
la $t0, arr
lw $t1, len # load length
loop1:
lw $t2, ($t0) # load item
# process item here
addi $t0, $t0, 4 # add item size to pointer
addi $t1, $t1, -1 # decrement counter
bne $t1, $0, loop1 # if counter != 0, repeat
# iteration type 2
# for(i=0, i != len; i += 1)
# ... use arr[i] ...
la $t0, arr
lw $t1, len # load length
li $t2, 0 # index
loop2:
sll $t3, $t2, 2 # multiply by item size
addu $t3, $t3, $t0 # add base address
lw $t3, ($t3) # load item
# process item here
addi $t2, $t2, 1 # increment index
bne $t2, $t1, loop2 # if index != len, repeat
(注意,这些样品环路不处理零长度数组,如果必要的话添加检查)