Προγραμματισμός Assembler Γλώσσα

ψήφοι
0

Προσπαθώ να γράψω ένα πρόγραμμα που εισάγει ένα θετικό αριθμό μικρότερο από 10 και εξάγει το άθροισμα των πρώτων αριθμών. Για παράδειγμα 5 θα ήταν 5 + 4 + 3 + 2 + 1. Οι εντολές είναι στάση, φορτίου, Κατάστημα, Προσθήκη, Sum, Πολλαπλασιασμός, Διαίρεση, εισόδου, εξόδου, υποκατάστημα, Υποκατάστημα αν 0, και κλάδο αν δεν 0. Μπορεί κάποιος να με βοηθήσει εδώ. Είμαι το είδος του κολλήσει. καλά τι έχω γράψει είναι:

      IN    n
      LD    n
      ADD   sum
      STO   sum
      LD    n
      SUB   one
      ADD   sum
      STO   sum
      BRGT  haw
      LD    n
      BR    done
haw:  OUT   sum
done: STOP
      DC    n   4
      DC    sum 0
      DC    one 1  

Λοιπόν ο τρόπος που βλέπω αυτό που εργάζονται είναι να φορτώσετε κάποιο αριθμό n και να προσθέσετε ένα ποσό των 0 και στη συνέχεια να αποθηκεύσετε αυτό το ποσό ως n + ποσού. Στη συνέχεια θα φορτώσετε n πάλι και αφαιρούμε 1 και αποθηκεύστε ότι το νέο ποσό. Αλλά εγώ θα πρέπει να επαναλάβετε αυτό έως ότου η φτάσει το 0. Έτσι, πώς μπορώ να το κάνω αυτό;

Εντάξει έτσι αυτό που χρειάζεται να κάνετε είναι να χρησιμοποιήσετε τον κλάδο, αν 0 και κλάδο, αν δεν 0. νομίζω ότι το έχουν; Έτσι:

     IN    n
     LD    n
     ADD   sum
     STO   sum  
     BR    CAW
CAW: LD    n  
     SUB   ONE  
     STO   n
     BRGT  HAW
     BZ    TAW
HAW: ADD   SUM  
     STO   SUM  
     BR    CAW  
TAW: OUT   SUM
     DC    SUM 0
     DC    ONE 1

DC = Ειδικός Constant, αλλά αυτό που πρέπει να επαναλάβετε είναι η αφαιρέσεων από ένα και προσθέτοντας το άθροισμα μέχρι n φτάσει το 0. Branch αν δεν είναι μηδέν BRGT και υποκατάστημα εάν μηδέν είναι ΒΖ και υποκατάστημα είναι BR, LD είναι φορτίο. Ξέρω τι χρειάζεται να επαναλάβω, αλλά δεν ξέρω πώς να το κάνετε αυτό σε συμβολική γλώσσα.

Δημοσιεύθηκε 08/01/2010 στις 04:46
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
5

Δεδομένου ότι αυτό ακούγεται σαν την εργασία, θα ξεκινήσω με κάποια κομμάτια.

  1. Έχετε εργαστεί έξω τη λογική σε αυτό το πρόβλημα ακόμα; «Είδος κολλήσει» θα μπορούσε να σημαίνει ότι δεν έχουν ιδέα πώς αυτό πρέπει να γίνει, ή ότι δεν είστε βέβαιοι πώς να την εφαρμόσουν με τις διαθέσιμες οδηγίες. Αν δεν έχετε επεξεργαστεί τη λογική, ότι αυτό - πώς θα καταλήξει με τους όρους, πώς μπορείτε να τα προσθέσετε μαζί, και τι κάνετε με τα αποτελέσματα;

  2. Αν έχετε επεξεργαστεί τη λογική, στη συνέχεια, η οποία δίνει εντολή θα εκτελέσει κάθε τμήμα;

Εάν έχετε περισσότερες συγκεκριμένες ερωτήσεις μη διστάσετε να ενημερώσετε και θα ανταποκριθεί, αλλά σε γενικές γραμμές η πολιτική για SO είναι να προσφέρει καθοδήγηση και όχι μόνο γράφουν κώδικα για (πιθανές;) ερωτήσεις εργασία.

Επεξεργασία : ok μεγάλη, έχετε κάποιο κώδικα, και φαίνεται σαν να είστε στο σωστό δρόμο, αλλά δεν υπάρχει ακόμα. Το πρώτο πράγμα που θα ήθελα να σας ρωτήσω είναι αν έχετε προσπαθήσει να εκτελέσει τον κώδικα σε χαρτί. Διαλέξτε μια αυθαίρετη είσοδο (για παράδειγμα 5, όπως στο παράδειγμα σας) και το βήμα μέσω του κώδικα ενός εντολή σε έναν χρόνο για να δούμε αν η λογική που εκτελεί το πρόγραμμα ακολουθεί τη λογική που ήρθε με το βήμα 1. Αυτή τη στιγμή πιστεύω ότι το πρόγραμμα δεν λειτουργεί όπως γράφεται? δείτε αν μπορείτε να μάθετε το γιατί και αν δεν θα σας δώσω μια υπόδειξη.

Επεξεργασία 2 : φοβερό, είσαι τόσο κοντά που έχετε ήδη την απάντηση και απλά πρέπει να το κωδικοποιήσει. Είπατε ότι θέλετε να επαναλάβετε μέχρι n φτάσει το 0. Έτσι, το οποίο η εντολή θα σας αφήσει να πάρετε ένα από τα δύο κλάδους, ανάλογα με το αν η είναι 0 ή όχι;

Επεξεργασία 3 : έχετε δίκιο στην παραδοχή ότι θα πρέπει να χρησιμοποιήσετε κλάδο, αν 0 / κατάστημα δεν είναι 0, αλλά δεν βλέπω κάποια από αυτά στην τελευταία κωδικό σας. Εχασα κάτι? Επίσης, ό, τι είναι DC στην περίπτωση αυτή; Θα μπορούσε να είναι χρήσιμο αν δημοσιεύσετε ένα κλειδί έτσι ξέρω ακριβώς ποια οδηγίες που χρησιμοποιείτε. Όπως είπα και πριν, δοκιμάστε την εκτέλεση του προγράμματος σας με το χέρι - που θα σας δείξει όπου τα σφάλματα είναι. Υπόδειξη μου για σας αυτή τη στιγμή είναι να προσδιορίσει το τμήμα του κώδικα που πρέπει να εκτελεστεί κατ 'επανάληψη και να μάθετε αν όντως έχει πάρει εκτελούνται κατ' επανάληψη.

Απαντήθηκε 08/01/2010 στις 04:50
πηγή χρήστη

ψήφοι
2

Δοκιμάστε γράφοντας το πρόβλημα σε μια υψηλού επιπέδου ψευδο-κώδικα πρώτη.

Στη συνέχεια μεταφράζεται σε συμβολική γλώσσα σας.

Μπορείτε να βρείτε βοήθεια για προγραμματισμό σε συμβολική γλώσσα εδώ

http://www.laynetworks.com/assembly%20tutorials.htm

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

Απαντήθηκε 08/01/2010 στις 04:51
πηγή χρήστη

ψήφοι
0

σκέφτομαι σε C (με την προϋπόθεση να το ξέρετε)

int sumnumbers(int input)
{
    int output = 0;

    input = max(input, 10);

    switch (input)
    {
        case 5:
            output += 5;
        case 4:
            output += 4;
        case 3:
            output += 3;
        case 2:
            output += 2;
        case 1:
            output += 1;
        case 0:
            output += 0;
            break;
    }

    return input;
}

Διαπιστώνουν τις ελλείψεις των δηλώσεων διάλειμμα (εκτός από την 0'th περίπτωση).

Μήπως αυτό να βοηθήσει;

Απαντήθηκε 10/01/2010 στις 21:51
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more