2017-01-08 6 views
-1

J'étudie l'ordinateur depuis et ma tâche est actuellement d'apprendre à programmer dans l'assembleur MIPS en utilisant qtSPIM. La tâche, avec laquelle je travaille en ce moment, consiste à écrire un programme en routine pour charger une image (PGM 5, binaire) de mon disque dur dans un tableau. Au début de la piture, il y a aussi un en-tête qui contient la largeur, la longueur, la profondeur de couleur et la quantité de colleurs. Pour autant que j'ai découvert, je dois utiliser syscall 14 pour ce faire. Les arguments de cette fonction sont "$ a0 = descripteur de fichier, $ a1 = tampon, $ a2 = longueur". Mais je n'ai malheureusement trouvé aucune information sur la bonne syntaxe d'un programme utilisant cette fonction pour lire une image avec une certaine taille (64x64 pixels).Utiliser syscall 13 dans MIPS-Assembler

Je serais très heureux d'être reconnaissant, si quelqu'un pouvait m'aider à résoudre cette tâche.

Merci à l'avance,

Mic

+0

Quelle est la question? Qu'avez-vous essayé et quel est votre code jusqu'ici? – tambre

+0

mon code, sofar, ressemble à ceci: # # load_img # .data tampon : \t \t .space 4096 .text principale: \t \t la \t \t a0 $, tampon \t # charger l'espace de la morsure dans le tampon \t \t \t \t li \t \t $ a1, 4096 \t # allouer le morsure espace pour la chaîne \t \t \t mouvement \t $ à, a0 $ \t # sauvegarde Chaîne à t0 \t \t \t li \t v0 $ $, 13 \t \t \t syscall jr $ ra – Mahakala108

+0

Ce que je ne comprends pas est , comment indiquer au programme l'adresse du fichier qu'il doit lire. Comme je l'ai déjà dit, ce fichier est sur mon disque dur ... – Mahakala108

Répondre

1

syscall 14 besoins: "a0 $ = descripteur de fichier, $ a1 = tampon, $ a2 = longueur"

Pour obtenir descripteur de fichier de votre fichier, vous devra l'ouvrir pour la lecture, en utilisant syscall 13 "a0 $ = adresse de chaîne terminée par nULL contenant le nom de fichier $ a1 = a2 = $ drapeaux mode"

service 13 - MARS mettre en œuvre s trois valeurs d'indicateur: 0 pour lecture seule, 1 pour écriture seule avec create et 9 pour write-only avec create et append. Il ignore le mode. Le descripteur de fichier renvoyé sera négatif si l'opération a échoué. L'implémentation d'E/S de fichier sous-jacente utilise java.io.FileInputStream.read() pour lire et java.io.FileOutputStream.write() pour écrire. MARS conserve les descripteurs de fichiers en interne et les attribue en commençant par 3. Les descripteurs de fichiers 0, 1 et 2 sont toujours ouverts pour: lire depuis l'entrée standard, écrire vers la sortie standard et écrire avec l'erreur standard (nouveau dans la version 4.3).

Il y a aussi un exemple dans cette documentation.

Il n'y a pas de service pour obtenir des informations sur les fichiers (comme la longueur), donc vous devrez lire le fichier en flux et le traiter entre temps, ou allouer suffisamment de tampon pour lire tous vos fichiers pgm en une fois. 64x64 est 4096 octets (si une échelle de gris de 8 bits est utilisée), de sorte que le tampon de la vôtre ne sera pas suffisant, le fichier pgm a également en-tête. Syscall 16 est un fichier fermé (n'oubliez pas de l'appeler après avoir lu).

Mais je n'ai malheureusement trouvé aucune information sur la bonne syntaxe d'un programme utilisant cette fonction pour lire une image avec une certaine taille (64x64 pixels).

Euh ... vous suffit de lire comme premiers 2000 octets dans le tampon (qui devrait couvrir l'en-tête), vous analysez ces données, extraire des valeurs pour la largeur/heigh/Maxcolor, et la détection de début de données de pixels.

Puis vous continuez le reste des 2000 octets comme données de pixel (vous pouvez utiliser syscall 9 pour allouer dynamiquement la mémoire requise pour les données de pixel, ou créer simplement un autre tampon pixels: .space 4096 si vous savez que l'entrée est 64x64 8bit niveaux de gris) les dans le tampon de pixels final, puis vous relisez autant d'octets que vous avez dans le tampon de lecture et copiez d'autres pixels ... jusqu'à ce que les pixels de largeur x hauteur soient lus.

Puis fermez le fichier.

Semble très simple pour moi, ne peut pas voir où est votre problème. Peut-être montrer quelques exemples, qu'est-ce que vous venez, pour montrer ce qui est problématique pour vous, mais l'ensemble est comme déplacer des nombres ici et là, pas grand chose à faire, aussi longtemps que vous pouvez formuler toutes vos tâches comme algorithme de déplacement chiffres ici et là, vous allez bien.