lytos Δημοσ. 6 Μαΐου 2009 Δημοσ. 6 Μαΐου 2009 Καλησπέρα, ειμαι φοιτητης σε τμημα ΜΗΥ και αντιμετωπίζω μεγάλο πρόβλημα εδώ και μερες με μία ασκηση που μας βάλαν να γραψουμε σε 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 ή κάποια παρόμια γλώσσα να τη στείλει, θα μας βοηθήσει πολύ. Ευχαριστώ πολύ
the_eye Δημοσ. 6 Μαΐου 2009 Δημοσ. 6 Μαΐου 2009 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 */
lytos Δημοσ. 6 Μαΐου 2009 Μέλος Δημοσ. 6 Μαΐου 2009 για τον MIPS , τώρα τι να σου πω δεν ξέρω εαν υπάρχουν μόντελα του ίδιου επεξεργαστή... Πάντως τα προγράμματα τα τρέχουμε στο PCSPIM
ippo00 Δημοσ. 7 Μαΐου 2009 Δημοσ. 7 Μαΐου 2009 Χρηιμοποίησε ένα MIPS cross compiler άμα δεν μπορείς...
the_eye Δημοσ. 7 Μαΐου 2009 Δημοσ. 7 Μαΐου 2009 Απο ότι βλέπω ο PCSPIM είναι για MIPS32 assembly, δεν την γνωρίζω. Αν δεις το πρόγραμμα της C θα βγάλεις άκρη.
lytos Δημοσ. 7 Μαΐου 2009 Μέλος Δημοσ. 7 Μαΐου 2009 Ευχαριστώ πολύ the_eye για τον κώδικα που παρέθεσες. Θα φανεί πολύ χρήσιμος. Μπορεις να μου πεις επίσης τι να γράψω σε linux γραμμή εντολών για να κάνω compile τον κώδικα;Γιατι μου γκρινιάζει ο compiler στο #include "snip_str.h" και στο NUL
the_eye Δημοσ. 7 Μαΐου 2009 Δημοσ. 7 Μαΐου 2009 Δεν είναι δικός μου ο κώδικας απ ότι βλέπω θέλει το header Snip_Str.H googleit θα το βρεις.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.