如果这是一个本地数组,则在堆栈上为它分配空间,然后从代码初始化它 . C代码的可能asm转换可能如下所示:
addi $sp, $sp, -12 # allocate space for 3 words, $sp is now the address of the array
addi $t0, $zero, 2
sw $t0, ($sp) # ary[0]=2
addi $t0, $zero, 3
sw $t0, 4($sp) # ary[1]=3
addi $t0, $zero, 4
sw $t0, 8($sp) # ary[2]=4
addi $t0, $zero, 0 # initialize i=0
Start:
sll $t1, $t0, 2 # i*4 for element size
add $t1, $t1, $sp # add base address of array, $t1 is now &ary[i]
lw $t2, ($t1) # load ary[i]
sll $t2, $t2, 1 # mutiply by 2
sw $t2, ($t1) # store back to ary[i]
addi $t0, $t0, 1 # i++
addi $t1, $t0, -3 # check if i<3 by doing (i-3)<0
bltz $t1, Start
addi $sp, $sp, 12 # free the array
您的asm代码采用了稍微不同的方法,C版本看起来像:
int* end = &ary[3];
for(int* ptr = ary; ptr != end; ptr++)
{
*ptr = *ptr * 2;
}
固定的asm版本是:
addi $t1, $sp, 12 # end=&ary[3]
addi $t0, $sp, 0 # ptr=ary
Start:
lw $t2, ($t0) # load ary[i]
sll $t2, $t2, 1 # mutiply by 2
sw $t2, ($t0) # store back to ary[i]
addi $t0, $t0, 4 # ptr++ (note it is incremented by 4 due to element size)
bne $t0, $t1, Start # ptr!=end