Я впервые использую сборку и пытаюсь реализовать связанный список. Каждый узел — это 2 слова — первое — это значение узла, а второе — адрес следующего узла в списке. Для последнего узла следующий равен нулю. Основой списка является слово, содержащее адрес первого узла, или 0, если список пуст.
Я пытаюсь реализовать функцию добавления элемента, где первый параметр ($a0) — это адрес базы списка, а $a1 — это адрес, в котором хранится значение, которое я хочу добавить в свой список. Для этого я пытаюсь выполнить итерацию по списку и найти последний элемент, поэтому я устанавливаю его следующим значением новый созданный узел.
Я чувствую, что это очень уродливо (я использую как цикл, так и увеличение), и я упускаю более простой способ перебора списка, но я немного смущен, как это сделать правильно, используя один цикл, так как я хотите остановиться за 1 шаг до конца списка Как лучше всего это сделать?
Спасибо!!
AddItem:
# first I make the new node:
addi $sp,$sp,-8 # we make room in stack for the new item
lw $t0,0($a1) # load new item's value from its address
sw $t0,0($sp) # set new node's value
sw $zero,4($sp) # set new node's next to 0 because it's now the last item
# now I want to find where to put it:
lw $t2,0($a0) # $t2 contains the address of the first node in the list
beq $t2,$zero,AddFirstItem # in case the list is empty and we add the first item
# if the list is not empty we need to find the last item:
add $t0,$zero,$t2 # initialize $t0 to point to first node
loop:
lw $t1,4($t0) # $t1 is the address of next item
bne $t1,$zero,increase
j addItem # when we reach here, $t0 is the last item of the list
increase: # we iterate on the items in the list using both "loop" and "increase"
add $t0,$t1,$zero # $t0 which is the current item is now updates to current item's next
j loop
addItem:
sw $sp,4($t0) # set current item ($t0) next to be the node we created
j EndAddItem
AddFirstItem:
sw $sp,0($a0) # setting the base of the list to the node we created
EndAddItem:
jr $ra