2015-09-28 4 views
1

Mon programme est supposé effectuer les opérations suivantes: -Getting continuellement un entier de l'utilisateur (x), -impression du caractère à la position x dans la chaîne. -Les sorties du programme lorsque les entrées utilisateur 0.Impression du caractère x dans une chaîne (MIPS)

.text   
.globl __start 
__start: 
    li $s3,20 #string length 

start:  li $v0,5 
    syscall 
    move $s0,$a0 #integer now in $a0 
    beq $s0,$zero,exit 

    li $s1,0 #counter is 0 
    la $s2,str #address of string now is $s2 

loop:lbu $t1,0($s2) #choosing char of string 
    addi $s1,1 #increment counter by 1 
    addi $s2,1 #next char 
    beq $s1,$s0,print #is the char at the position we entered? 
    j loop 

print:  lbu $a0,0($t1) #<------------# 
    li $v0,11 
    syscall 
    j start 

exit:  li $v0,10 
    syscall  



.data 
str: .asciiz "abcdefghijklmnopqrst" 

Je continue à obtenir: « Une exception est survenue au PC = 0x00400034 » et « Mauvaise adresse dans les données pile suivante: 0x ... » exactement quand je tente d'exécuter la ligne que j'ai marquée.

Répondre

3

$t1 ne contient pas d'adresse valide au point où vous faites lbu $a0,0($t1). Ce que vous avez dans $t1 il ya le dernier caractère lu de la chaîne avant que vous ayez quitté votre boucle loop. Je ne vois vraiment pas quel est le point de la boucle. Vous dites que vous avez une chaîne et un entier X, et que vous voulez imprimer le caractère à l'offset X dans la chaîne. Donc, il suffit de lire ce caractère et vous avez terminé:

la $a1,string 
addu $a1,$a1,$s0 # $a1 = &str[x]. assumes x is in $s0 
lbu $a0,($a1)  # read the character 
li $v0,11 
syscall   # and print it 
+0

Bien que cela semble correct, il imprime toujours le caractère « b », peu importe ce que je type.In ma méthode (je sais que pas le plus efficace) je veux pour déplacer ce personnage à $ a0, de sorte que je ne peux pas être imprimé.J'ai essayé d'utiliser à la fois sb et lbu, aucun d'entre eux semble fonctionner. – Trojax

+1

Eh bien, vous déplacez la mauvaise valeur à '$ s0'. syscall 5 renvoie l'entier lu dans '$ v0', pas' $ a0'. – Michael

+0

Merci beaucoup, ça explique tout. – Trojax