2013-10-14 2 views
0

Ci-dessous j'aiMIPS: chaîne d'impression sans instructions pseduo

.globl main 
.data 
prompt: 
     .asciiz "Hello world!" 
.text 
main: 
    addi $v0, $v0, 4 
    lui $a0, 0x1000 
    syscall 
rtn: 
    jr $ra 

Maintenant, je ne sais pas pourquoi la chaîne n'est pas l'impression, il fonctionne sans erreurs de syntaxe. En outre, je ne suis pas autorisé à utiliser des pseudo-instructions, c'est pourquoi je fais cela un peu plus longtemps. C'est là que l'erreur arrive, je ne sais pas où la chaîne d'invite est stockée? Toute aide est appréciée!

Merci!

+0

Qu'est-ce qui vous fait penser que 'prompt' se trouve à l'adresse' 0x1000'? –

+0

Dans les exemples que nous avons reçus en classe, il créait un tableau qu'il ne définissait pas pour démarrer à une adresse donnée. Puis il a créé une chaîne et l'a appelée invite. Quand il a voulu utiliser prompt, il a ajouté 10 à 0x1000 pour arriver au premier index hors du tableau (le tableau avait 10 octets de long). La prochaine chose était prompt, qui était a0 + 10. – user2864709

+0

OK - même si c'est la bonne adresse, vous devriez probablement prendre l'habitude d'utiliser l'adresse symbolique plutôt que de le coder en dur. –

Répondre

1

Dans SPIM, la section .data commence à l'adresse 0x10010000 par défaut. Donc, pour imprimer la chaîne Hello World sans utiliser de pseudo-instructions, vous pouvez utiliser ceci:

.globl main 
.data 
prompt: 
    .asciiz "Hello world!" 
.text 
main: 
    addi $v0, $zero, 4 
    lui $a0, 0x1001  # $a0 = 0x10010000 
    syscall 
rtn: 
    jr $ra 
+0

Merci, cela a éclairci les choses! – user2864709

1

Notez que si l'adresse est 0x1000, cela signifie que les 16 bits supérieurs sont tous zéro, et les 16 bits inférieurs sont 0x1000. Vous chargez les 16 bits supérieurs. Ainsi, au lieu de lui $a0, 0x1000 essayer addiu $a0, $0, 0x1000

Cependant, votre expressions de manipulation des symboles de l'assembleur ne doivent pas compter comme pseudo-instructions, donc quelque chose comme ce code GAS (ou l'équivalent dans votre assembleur) devraient également être autorisés:

lui $a0, %hi(prompt) 
ori $a0, $a0, %lo(prompt)