Wpis z mikrobloga

Może ktoś ogarnia assemblera mipsa zasadniczo xd Mam program taki

# kopiowanie tablicy src do dest,
# a nastepnie wykonanie operacji na elemencie w dest
.data
src: .word 1,2,3,4,5,6,7,8,9,10
len: .word 10 # liczba elementow tablicy
dest: .space 40 # rezerwacja miejsca dla 10 elementow
.text
lw $t0, len # inicjalizacja licznika
subi $t0, $t0, 1 # dekrementacja licznika
li $t1, 0 # wskaznik do elementu w src
li $t2, 0 # wskaznik do elementu w dest
loop:
lw $t3, src($t1) # pobranie elementu z src
sw $t3, dest($t2) # zapis elementu do dest
addi $t1, $t1, 4 # inkrementacja wskaznika src
addi $t2, $t2, 4 # inkrementacja wskaznika dest
subi $t0, $t0, 1 # dekrementacja licznika
bge $t0, $zero, loop # koniec, gdy licznik < 0


li $t2, 20 # pobranie elementu dest[5]
lw $s0, dest($t2)
add $s0, $s0, $s0 # podwojenie elementu
sw $s0, dest($t2) # zapamiętanie w dest[5]
i jak są włączone przestoje i obejścia to ten program działa a gdy są wyłączone to wysypuje się na liczniku bo zamiast od 10 dekrementować to on tam wpierdziela 0. W instrukcji mam wpisać NOP w odpowiednie miejsca tak żeby program działał więc wrzuciłem 2x NOP pod lw $t0, len # inicjalizacja licznika i wtedy dekrementacja działa i z 10 się robi 9 a nie 0 ale warunek bge $t0, $zero, loop # koniec, gdy licznik < 0 nie działa tylko program przeskakuje do końca od razu, gdzie jeszcze wstawić NOP żeby to działało? #assembler #mips #programowanie
  • 24
@Wextor: W skrócie: z rejestru możesz czytać dopiero dwie-trzy instrukcje(nie wiem ile w tym konkretnym mipsie) po zapisie. Postaraj się zmienić kolejność instrukcji, nopy dawaj w ostateczności.
@Alkreni: nie no to działa dobrze bo patrząc po rejestrach to się odejmuje o 1 z tych 10 tylko potem ten warunek bge $t0, $zero, loop nie wraca do loopa tylko kończy się program po tym tak jakby to t0 = 0