2016-03-25 17 views
0

benim üniversitede ben Mips Meclisi'nde belirli bir Needleman Algoritması programlamak zorunda:Mips Needleman Özyineleme

Here is a detail of the Task.

ben neredeyse bitmiş değilim ancak, hala büyük bir sorun var umut: ben çalıştırdığınızda Bu, son birkaç Harf üzerinde durmaz ve "döner".

Dallarımın doğru olduğunu ve yığın tahsisi ile ilgili bir sorun olduğunu düşünüyorum, ancak bunu nasıl çözeceğimi bilmiyorum ve neredeyse bir hafta kadar çalıştım ve sadece bir hafta kaldı.

Bu yüzden sorunumu düzeltmeme yardımcı olabileceğinizi umuyorum.

.data 

word1: .asciiz "teflon" 
word2: .asciiz "telefon" 
newLine: .asciiz "\n" 

.text 
.globl main 

# $a0 : word 1 
# $a1 : word 2 
# returns via $v0 : best alignment score 
#s0- current word1-char , s1- current word2-char , s2-word1-length, s3-word2-length,s5-recursion-counter,t2-temporary-result, 
#t3-temporary-result, t4-temporary-result 


needleman_wunsch: 

    # Fuegen Sie Ihren Code zum Beispiel hier ein. 
    # Auch der restliche Inhalt dieser Datei darf 
    # von Ihnen nach Belieben angepasst werden. 
    add $v0,$0,$0   #result=0 
    add $s5,$0,$0   #counter=0 
    add $t2,$0,$0   #result1=0 
    add $t3,$0,$0   #result2=0 
    add $t4,$0,$0   #result3=0 

rekursionsadresse: 

    addi $s5,$s5,1   #counter++ 
    #addi $a0,$a0,1   #$s0=&word1[i] 
    #addi $a1,$a1,1   #$s1=&word2[j] 
    lb $s0,0($a0)   #$s0=word1[i] 
    lb $s1,0($a1)   #$s1=word1[j] 
    add $t0,$a0,$0   #save $a0 in $t0 
    add $t1,$v0,$0   #save $v0 in $t1 

# move $a0,$s0   #load string adress in to $a0 
# li $v0,11    #load syscall for string printing 
# syscall     #print string 
# move $a0,$s1   #load string adress in to $a0 
# syscall     #print string 
# move $a0,$t1   #load current result into $a0 
# li $v0,1    #load syscall to integer printing 
# syscall     #print current result 
    move $a0,$s5 
    li $v0,1 
    syscall     #print counter 
# la  $a0, newLine 
# addi $v0, $0, 4 
# syscall 

    move $a0,$t0   #restore $a0 
    move $v0,$t1   #restore $v0 
    move $t1,$a1   #store $a1 

    move $a0,$t0   #restore $a0 
    move $a1,$t1   #restore $a1 

    beqz $s0,if10   #if |word1| == 0 goto if10 
    beqz $s1,if01   #if |word2| == 0 goto if01 ; case |word1| >=1 and |word2|>=1 



#calculate result1 (score(word1[i+1],word2[j+1])+eq(word1[0],word2[0])) 

    addi $sp,$sp,-12  #stackreservation for 3 values 
    sw $ra,8($sp)   #save $ra on stack 
    sw $a1,4($sp)   #save $a1 on stack 
    sw $a0,0($sp)   #save $a0 on stack 

    addi $a0,$a0,1   #get next character 
    addi $a1,$a1,1   #get next character 
    jal rekursionsadresse #$v0=score(word1[i+1],word2[j+1]) 

    lw $a0,0($sp)   #load $a0 from stack 
    lw $a1,4($sp)   #load $a1 from stack 
    lw $ra,8($sp)   #load $ra from stack 
    addi $sp,$sp,12   #restore stackpointer 
eq: 
    lb $s0,0($a0)   #load current character from word1 
    lb $s1,0($a1)   #load current character from word2 
    bne $s0,$s1,neq  #if chars are not equal goto not equal (neq) 
    addi $v0,$v0,4   #increase result by 4 
    j marker    #jump to marker 
neq: 
    addi, $v0,$v0,-2  #decrease result by 2 

marker: 

    move $t2,$v0   #store return result1 


#calculate result2 (score(word1[i],word2[j+1])-3) 


    addi $sp,$sp,-12  #stackreservation for 3 values 
    sw $ra,8($sp)   #save $ra on stack 
    sw $a1,4($sp)   #save $a1 on stack 
    sw $a0,0($sp)   #save $a0 on stack 

    addi $a1,$a1,1   #get next character 
    jal rekursionsadresse #$v0=score(word1[i],word2[j+1]) 
    addi $v0,$v0,-3   #$v0=score(word1[i],word2[j+1])-3 

    lw $a0,0($sp)   #load $a0 from stack 
    lw $a1,4($sp)   #load $a1 from stack 
    lw $ra,8($sp)   #load $ra from stack 
    addi $sp,$sp,12   #restore stackpointer 
    move $t3,$v0   #save result3 

#calculate result3 (score(word1[i+1],word2[j])-3) 


    addi $sp,$sp,-12  #stackreservation for 3 values 
    sw $ra,8($sp)   #save $ra on stack 
    sw $a1,4($sp)   #save $a1 on stack 
    sw $a0,0($sp)   #save $a0 on stack 

    addi $a0,$a0,1   #word1-index i +=1 
    jal rekursionsadresse #$v0=score(word1[i+1],word2[j]) 
    addi $v0,$v0,-3   #$v0=score(word1[i+1],word2[j])-3 

    lw $a0,0($sp)   #load $a0 from stack 
    lw $a1,4($sp)   #load $a1 from stack 
    lw $ra,8($sp)   #load $ra from stack 
    addi $sp,$sp,12   #restore stackpointer 
    move $t4,$v0   #save result3 


#compare the 3 results 
    bgt $t2,$t3,ifmax  #if result1 > result2 goto max3 
    bgt $t4,$t3,max3  #if result3 > result2 goto max3 
    move $v0,$t3   #store biggest result in $v0 
    jr $ra    #return to needleman_wunsch 
ifmax: 
    bgt $t4,$t2,max3  #if result3 > result1 goto max3 
    move $v0,$t2   #store biggest result in $v0 
    jr $ra    #return to needleman_wunsch 
max3: 
    move $v0,$t4   #store biggest result in $v0 
    jr $ra    #return to needleman_wunsch 


if01:      #case |word1| >=1 and |word2|==0  
    addi $sp,$sp,-12  #stackreservation for 3 values 
    sw $ra,8($sp)   #save $ra on stack 
    sw $a1,4($sp)   #save $a1 on stack 
    sw $a0,0($sp)   #save $a0 on stack 

    addi $a0,$a0,1   #get next character 
    jal rekursionsadresse #$v0=score(word1[i+1],word2[j]) 
    addi $v0,$v0,-3   #$v0=score(word1[i+1],word2[j])-3 

    lw $a0,0($sp)   #load $a0 from stack 
    lw $a1,4($sp)   #load $a1 from stack 
    lw $ra,8($sp)   #load $ra from stack 
    addi $sp,$sp,12   #restore stackpointer 
    jr $ra    #jump back to last method 

if10:      #case |word1| == 0 
    beqz $s1,if11   #if |word2|==0 goto if1.1 ;case |word1| ==0 and |word2|>=1 

    addi $sp,$sp,-12  #stackreservation for 3 values 
    sw $ra,8($sp)   #save $ra on stack 
    sw $a1,4($sp)   #save $a1 on stack 
    sw $a0,0($sp)   #save $a0 on stack 

    addi $a1,$a1,1   #get next character 
    jal rekursionsadresse #$v0=score(word1[i],word2[j+1]) 
    addi $v0,$v0,-3   #$v0=score(word1[i],word2[j+1])-3 

    lw $a0,0($sp)   #load $a0 from stack 
    lw $a1,4($sp)   #load $a1 from stack 
    lw $ra,8($sp)   #load $ra from stack 
    addi $sp,$sp,12   #restore stackpointer 
    jr $ra    #jump back to last method 

if11:      #case |word1| ==0 and |word2|==0 
    add $v0,$0,$0   #return 0 
    jr $ra    #jump back to last method 




main: 
    addi $sp, $sp, -4 
    sw $ra, 0($sp) 

    la $a0, word1 
    la $a1, word2 
    jal needleman_wunsch 

    # Geben Sie auf jeden Fall den Score auf der 
    # Konsole aus. 
    addi $a0, $v0, 0 
    li $v0, 1 
    syscall 

    lw $ra, 0($sp) 
    addi $sp, $sp, 4 
    jr $ra 
+0

Şimdi çözdüm! – noleu

+0

Paylaşmak için bakım ister misiniz? Kendi cevaplarınızı sorularınıza yazabilirsiniz. – Flexo

cevap

0

Çok hızlı cevap vermediğim için özür dilerim. Bulduğum çözüm (arkadaşların yardımıyla), iade sonucunu $ t2 gibi ekstra bir kayıtta saklamaktır.

0

Çözüm buldunuz mu? Belki bu gerekli değildir:

move $a0,$t0   #restore $a0 
move $v0,$t1   #restore $v0 
->move $t1,$a1   #store $a1 

move $a0,$t0   #restore $a0 
->move $a1,$t1   #restore $a1 

Neden $ t1 içinde $ a1 depolayan ve iki satır daha sonra geri?

+0

henüz değil ama bugüne kadar çalıştığım bir fikrim var, "kontrol" baskının geri kalanı (mevcut karakterleri bu noktaya yazdım) – noleu