Programmation Assembleur Langue

voix
0

Je suis en train d'écrire un programme qui introduit un nombre positif inférieur à 10 et sort la somme des nombres premiers. Par exemple 5 serait 5 + 4 + 3 + 2 + 1. Les commandes sont Stop, Charger, Magasin, Ajouter, Somme, Multiplier, Diviser, entrée, sortie, Branche, Direction si 0, et la branche sinon 0. Quelqu'un peut-il me aider. Je suis un peu coincé. bien ce que j'ai écrit est:

      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  

Eh bien la façon dont je le vois travailler est de charger un nombre n et d'ajouter une somme de 0 et de stocker cette somme en tant que n + somme. Ensuite, vous chargez à nouveau et n soustrayez 1 et stocker que la nouvelle somme. Mais je besoin de répéter jusqu'à ce que n atteint 0. Alors, comment dois-je faire cela?

Ok, donc ce que je dois faire est d'utiliser la branche si 0 et la branche sinon 0. Je pense que je l'ai? alors:

     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 = Désignée constante, mais ce que je dois répéter est la soustraction par un et en ajoutant la somme jusqu'à ce que n atteint 0. Branch sinon zéro est BRGT et si la branche est zéro BZ et la branche est BR, LD est la charge. Je sais ce que je dois répéter, mais je ne sais pas comment vous faites cela en langage assembleur.

Créé 08/01/2010 à 04:46
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
5

Étant donné que cela sonne comme devoirs, je vais commencer par quelques morceaux.

  1. Avez-vous travaillé la logique à ce problème encore? « Un peu coincé » pourrait signifier que vous ne savez pas comment cela doit être fait, ou que vous n'êtes pas sûr de savoir comment mettre en œuvre les instructions disponibles. Si vous ne l'avez pas travaillé la logique, considérez ceci - comment venez-vous avec les termes, comment voulez-vous les ajoutez ensemble, et que faites-vous des résultats?

  2. Si vous avez travaillé la logique, alors que les commandes se produiront chaque partie?

Si vous avez des questions plus spécifiques ne hésitez pas à mettre à jour et je vais répondre, mais en général la politique sur le SO est d'offrir des conseils plutôt que de simplement écrire du code pour (possible?) Des questions de devoirs.

Modifier : ok grand, vous avez un code, et il semble que vous êtes sur la bonne voie , mais pas encore là. La première chose que je voudrais vous demander si vous avez essayé d'exécuter le code sur le papier. Choisissez une entrée arbitraire ( par exemple 5, comme dans votre exemple) et l' étape dans le code une instruction à la fois pour voir si la logique que le programme effectue suit la logique que vous êtes arrivé à l' étape 1. En ce moment , je crois que le programme ne fonctionne pas comme il est écrit; voir si vous pouvez savoir pourquoi et sinon je vais vous donner un indice.

Edit 2 : impressionnant, vous êtes si près que vous avez déjà la réponse et juste besoin de coder. Vous avez dit que vous voulez répéter jusqu'à ce que n atteigne 0. Alors, quelle commande vous permettra de prendre l' une des deux branches selon que n est 0 ou non?

Edit 3 : vous avez raison en supposant que vous devez utiliser la branche si 0 / branche 0, mais je ne vois pas de ceux de votre dernier code. Ai-je manqué quelque chose? En outre, ce qui est DC dans ce cas? Il pourrait être utile si vous postez une clé , donc je sais exactement quelles instructions que vous utilisez. Comme je l' ai déjà dit, essayez l' exécution de votre programme à la main - qui vous montrera où les insectes sont. Mon conseil pour vous est en ce moment d'identifier la partie de votre code qui doit être exécuté de façon répétée et savoir si elle ne fait obtenir exécuté de manière répétée.

Créé 08/01/2010 à 04:50
source utilisateur

voix
2

Essayez d'écrire le problème dans un pseudo-code de haut niveau en premier.

Ensuite, le traduire dans votre langage assembleur.

Vous pouvez trouver de l'aide sur la programmation en langage assembleur ici

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

Cette odeur comme une mission de l'école, je crois que cela devrait être suffisant pour vous aller.

Créé 08/01/2010 à 04:51
source utilisateur

voix
0

penser en C (en supposant que vous le connaissez)

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;
}

noter l'absence de déclarations de rupture (sauf le cas 0'th).

est-ce que cela aide?

Créé 10/01/2010 à 21:51
source utilisateur

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