在数组MIPS的开头插入一个整数

时间:2017-06-24 04:41:56

标签: arrays assembly mips mips32

在数组的开头插入一个整数的方法是什么?

示例:

注册$ s0 = 4(数组中的元素数)

注册$ s1 = 0x10040000(数组开头的地址)

0x10040000 10
0x10040004 20
0x10040008 30
0x1000400C 40

我想在0x10040000处插入一个int,比如5,并将所有内容都移开:

0x10040000 5
0x10040004 10
0x10040008 20
0x1000400C 30
0x10004010 40

我能够做到的一种方法是在数组之前的地址处插入5,但我希望能够做的是在数组的开头插入5并将其他所有内容向下移动

2 个答案:

答案 0 :(得分:0)

你需要一个循环和一个临时寄存器($s0)来移动值:

.data
N: .word 3
VET: .word 2, 3, 4, 5

.text
li $t1, 0 
lw $t0, N
sll $t0, $t0, 2
la $t2, $t0(VET)
srl $t0, $t0, 2
loop:
blt $t0, $t1 end_loop
lw $s0, ($t2) #load the number from i pos
sw $s0, 4($t2) #store the number in i+1 pos
addi $t2, $t2, -4 #i--
addi $t0, $t0, -1
j loop
end_loop:
li $s0, 1 #load value you want to store
sw $s0, VET #store value
lw $t0, N
add $t0, $t0, 1 
sw $t0, N #update value of N

现在值1位于向量的开头。 它没有经过优化,只是让你了解程序背后的逻辑。希望这会有所帮助。

答案 1 :(得分:-1)

您将需要一个内循环和一个外循环。

.data
Array: .word 3 5 1 90 21 11 2
.text 
la $a0,Array
addi $a1,$zero,7 
jal InsertSort

li $v0,10
syscall

InserSort:
addi $t0,$zero,1
outerloop:
beq $t0,$a1,finish

sll $t4,$t0,2
add $t4,$t4,$a0
lw $t4,0($t4)

addi $t1,$t0,-1
innerloop:
slt $t2,$t1,$zero
bne $t2,$zero,GoOuter

sll $t3,$t1,2
add $t3,$t3,$a0
lw t3,0($t3)
slt $t5,$t3,$t4
bne $t5,$zero,GoOuter

addi $t6,$t1,1
sll $t6,$t6,2
add $t6,$t6,$a0
sw $t3,0($t6)
addi $t1,$t1,-1
j innerloop

GoOuter:

addi $t8,$t1,1
sll $t8,$t8,2
add $t8,$t8,$a0
sw $t4,0($t8)
addi $t0,$t0,1
j outerloop

finish:
jr $ra