2012-10-02 4 views
1

En passant par le code MIPS, j'ai eu une certaine confusion. Le code est représenté comme suitConfusion dans le code MIPS

.data 
key: .ascii "key: "    # "key: \n" 
char: .asciiz " \n"    
.text 
.globl main 
main: 
jal getchar  

la $a0, char     # $a0 contains address of char variable (" \n") 
    sb $v0, ($a0)     # replace " " in char with v0, which is read_character (X) 
la $a0, key      # now a0 will contain, address of "key: " "X\n" 

Ce que je ne comprends pas, c'est comment fonctionne l'instruction d'adresse de chargement. Premier a0 contient l'adresse de la variable char. Dans la ligne suivante, nous stockons la valeur de v0 dans cet emplacement. il n'y a pas de décalage avec ($a0), est-ce supposé être 0 comme dans 0 ($a0)? Pourquoi seulement "" l'espace vide est remplacé par v0, et pourquoi le "\ n" est-il remplacé? ou Il se peut aussi que l'espace vide et le caractère \ n aient été remplacés par v0.

Deuxièmement, lorsque nous chargeons l'adresse de la clé dans a0, l'adresse précédente doit être écrasée. a0 aurait dû contenir uniquement l'adresse de la clé, mais à partir du commentaire, il semble que les deux chaînes soient concaténées. Comment cela arrive-t-il?

Répondre

1

sb stocke un octet en mémoire.

Pour répondre à vos questions en détail:

there is no offset with ($a0), is that assumed to be 0 like in 0($a0)? 

oui.

Why only the " " empty space is replaced with v0, and why not the "\n" get replaced? 

sb ne stocke un octet, dans ce cas, l'octet de l'adresse char, qui est un espace. La nouvelle ligne est l'octet suivant.

or It may also have been the case that both the empty space and \n character get replced by v0. 

Non, seulement un octet.

a0 should have contained the address of key only, but from comment it seems that the two strings are concatenated. How does that happen. 

Oui, a0 $ contient l'adresse key, mais une chaîne est fermée par un caractère nul. Lorsque vous faites

key: .ascii "key: " 

les octets représentés par "key: " sont placés en mémoire, sans caractère nul à la fin (car .ascii est utilisé). Ensuite, l'instruction char: .asciiz " \n" place les octets de " \n" en mémoire, après les octets du plus ancien. Dans ce cas, ils sont terminés par un caractère nul, car .asciiz est utilisé (au lieu de .ascii). Ainsi, l'adresse key pointe vers une chaîne qui est terminée par un caractère nul après le saut de ligne. Ou, key est l'adresse du premier caractère de la chaîne.

Pour le rendre plus clair

.asciiz "abc" 

et

.ascii "a" 
.ascii "b" 
.asciiz "c" 

sont les mêmes.