Προς το περιεχόμενο

mips-subroutine


nikolasR200

Προτεινόμενες αναρτήσεις

Δημοσ.

Θέλω να φτιάξω ένα πρόγραμμα που να του εισάγω ένα string και να κάνω κάποιες ενέργειες πάνω του.

Έχω ορίσει στο data segment το string ως string: .space 200 (επιτρέπωντας του μέγεθος μέχρι 200 χαρακτήρες-αν δεν κάνω λάθος μέχρι εδώ) στη συνέχεια όμως όταν από μια υπορουτίνα πάω να φορτώσω τη διεύθυνση του για να το επεξεργαστώ δεν το φορτώνει. Μάλιστα για να σιγουρευτώ έκανα και ένα syscall μέσα από την υπορουτίνα και δεν μου το εμφάνισε, ενώ στο κυρίως πρόγραμμα μου το εμφανίζει κανονικά με syscall..Φταίει ενδεχομένως ο τρόπος που το έχω δηλώσει? ή θέλει συγκεκριμένο τρόπο ώστε να περάσει στην υπορουτίνα..?!?

Δημοσ.

αυτό το κομμάτι το έχω χρησιμοποιήσει για την εισαγωγή του string

>	la $a0, S
li $a1,200
li $v0,8
syscall

ακριβώς από κάτω χρησιμοποίησα αυτό το κομμάτι

>la $t2,S
li$v0,4
syscall

και μου εμφάνισε κανονικά το string

αλλά στη συνέχεια καλώ μια υπορουτίνα και μέσα της καλώ το string με την ίδια σύνταξη αλλά δεν εμφανίζεται τίποτα..

>la $t2,S
li$v0,4
syscall

Δημοσ.

Το εντόπισα το λάθος που δεν μεταβιβαζόταν το string στην υπορουτίνα..και τώρα προέκυψε ένα νέο λάθος που πάει να μου σπάσει το κεφάλι!!

Η συγκεκριμένη υπορουτίνα υποτίθεται πως παίρνει τα κεφαλαία γράμματα και τα κάνει μικρά..το περίεργο όμως είναι ότι έτσι όπως την έχω γράψει δεν δουλεύει..αντίθετα, όταν αλλάζω το beq $t0,$0,end1 με beq $t0,$0,menu για ένα περίεργο και ανεξήγητο κατ εμέ λόγο δουλεύει κανονικά. Το περίεργο είναι ότι η ταμπελα menu δείχνει ένα asciiz string στο data segment αλλά αντί να μου εμφανίζει το μήνυμα στην ταμπέλα menu όταν το t0 μηδενίζεται (πράγμα που δεν το θέλω ούτως ή άλλως) αυτή η αλλαγή το κάνει να τρέχει κανονικά και να μου μετατρέπει τα κεφαλαία σε μικρά :cry::cry::cry::cry::cry:

>procedure3:
    li $v0,4
    syscall
    add $t2,$0,$a0
    li $t1,0
repeat1:    lb $t0, ($t2)
    beq $t0,$0,end1
    add $t1,$t1,1
    blt $t0,0x41,lala
    bgt $t0,0x5A,lala
    or $t0,$t0,0x20
lala:	    sb $t0, ($t2)
    add $t2,1
    j repeat1
end1:  	    move $a0,$t2
    li $v0,4
    syscall
    jr $ra

 

συγκεκριμένα η ταμπέλα είναι η ακόλουθη

menu: .asciiz "Please make your choice: \n"

Δημοσ.

>
.data
str1: .asciiz "PLEASE MAKE YOUR CHOICE: \n"

.text

.globl main

main:

procedure3:
    li $v0,4
                    la $a0,str1 
    syscall
    add $t2,$0,$a0
    li $t1,0

repeat1:    lb $t0, ($t2)
    beq $t0,$0,end1
    blt $t0,0x41,lala
    bgt $t0,0x5A,lala
    or $t0,$t0,0x20
lala:	    sb $t0, ($t2)
    add $t2,1
    j repeat1

end1:    la $a0,str1
    li $v0,4
    syscall
    jr $ra

 

με αυτά που μου έδωσες το μόνο που μπορώ να κάνω είναι το παραπάνω

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...