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

Προβλημα σε ασκηση Assembly MIPS


lytos

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

Δημοσ.

Καλησπέρα,

ειμαι φοιτητης σε τμημα ΜΗΥ και αντιμετωπίζω μεγάλο πρόβλημα εδώ και μερες με μία ασκηση που μας βάλαν να γραψουμε σε Assembly MIPS γλώσσα.

Το πρόβλημα είναι το παρακάτω:

 

Η συνάρτηση char *strstr(const char *str1, const char *str2) επιστρέφει έναν δείκτη

(pointer) στην πρώτη εμφάνιση του string str2 στο string str1. Για παράδειγμα,η

κλήση της strstr(“afg672-f”, “2-f”), επιστρέφει έναν pointer στo char ‘2’ του str1. Η

άσκηση αυτή σας ζητάει να γράψετε ένα πρόγραμμα σε MIPS assembly που να

υλοποιεί την συνάρτηση strstr χωρίς να χρησιμοποιεί επιπλέον θέσεις μνήμης.

Επίσης, θα πρέπει ο κώδικας σας να καλύπτει και τις παρακάτω ακραίες περιπτώσεις:

Να επιστρέφει NULL εάν το str2 δεν είναι substring του str1.

Να επιστρέφει NULL εάν το str1 είναι NULL

Να επιστρέφει έναν pointer στο πρώτο στοιχείο του str1 εάν ο str2 είναι NULL

 

Οποιος γνωρίζει παρακαλώ ας απαντήσει με κανένα mail,

Θα βοήθήσει πολύ κόσμο στο τμήμα μας.....

Εαν κάποιος γνωριζει την υλοποίησει σε C

ή κάποια παρόμια γλώσσα να τη στείλει,

θα μας βοηθήσει πολύ.

 

Ευχαριστώ πολύ

Δημοσ.

assembly για ποιόν επεξεργαστή ; Για 4040, 8080, 68Κ ;

 

---------- Το μήνυμα προστέθηκε στις 20:48 ----------

 

Δείτε και αυτό σε C που είναι η strstr λίγο επεκταμένη για case sensitive.

>/*
** Designation:  StriStr
**
** Call syntax:  char *stristr(char *String, char *Pattern)
**
** Description:  This function is an ANSI version of strstr() with
**               case insensitivity.
**
** Return item:  char *pointer if Pattern is found in String, else
**               pointer to 0
**
** Rev History:  16/07/97  Greg Thayer  Optimized
**               07/04/95  Bob Stout    ANSI-fy
**               02/03/94  Fred Cole    Original
**               09/01/03  Bob Stout    Bug fix (lines 40-41) per Fred Bulback
**
** Hereby donated to public domain.
*/

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "snip_str.h"

typedef unsigned int uint;

#if defined(__cplusplus) && __cplusplus
extern "C" {
#endif

char *stristr(const char *String, const char *Pattern)
{
     char *pptr, *sptr, *start;

     for (start = (char *)String; *start != NUL; start++)
     {
           /* find start of pattern in string */
           for ( ; ((*start!=NUL) && (toupper(*start) != toupper(*Pattern))); start++)
                 ;
           if (NUL == *start)
                 return NULL;

           pptr = (char *)Pattern;
           sptr = (char *)start;

           while (toupper(*sptr) == toupper(*pptr))
           {
                 sptr++;
                 pptr++;

                 /* if end of pattern then pattern was found */

                 if (NUL == *pptr)
                       return (start);
           }
     }
     return NULL;
}

#if defined(__cplusplus) && __cplusplus
}
#endif

#ifdef TEST

int main(void)
{
     int i;
     char *buffer[2] = {"heLLo, HELLO, hello, hELLo, HellO", "Hell"};
     char *sptr;

     for (i = 0; i < 2; ++i)
     {
           printf("\nTest string=\"%s\"\n", sptr = buffer[i]);
           while (0 != (sptr = stristr(sptr, "hello")))
           {
                 printf("Testing %s:\n", sptr);
                 printf("Found %5.5s!\n", sptr++);
           }
     }

     return(0);
}

#endif /* TEST */

Δημοσ.

για τον MIPS , τώρα τι να σου πω δεν ξέρω εαν υπάρχουν μόντελα του ίδιου επεξεργαστή... Πάντως τα προγράμματα τα τρέχουμε στο PCSPIM

Δημοσ.

Απο ότι βλέπω ο PCSPIM είναι για MIPS32 assembly, δεν την γνωρίζω. Αν δεις το πρόγραμμα της C θα βγάλεις άκρη.

Δημοσ.

Ευχαριστώ πολύ the_eye για τον κώδικα που παρέθεσες.

Θα φανεί πολύ χρήσιμος.

Μπορεις να μου πεις επίσης τι να γράψω σε linux γραμμή εντολών για να κάνω compile τον κώδικα;Γιατι μου γκρινιάζει ο compiler στο #include "snip_str.h" και στο NUL

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

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

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