Programmazione Assembler linguaggio

voti
0

Sto cercando di scrivere un programma che immette un numero positivo minore di 10 ed emette la somma dei numeri primi. Ad esempio 5 sarebbe 5 + 4 + 3 + 2 + 1. I comandi sono Stop, caricare, memorizzare, Aggiungi, Somma, Moltiplica, Dividi, Input, Output, Ramo, Ramo se 0, e il ramo se non 0. Qualcuno mi può dare una mano qui. Sto tipo di bloccato. bene ciò che ho scritto è:

      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  

Bene il mio modo di vedere di lavoro è di caricare un numero n e aggiunge una somma di 0 e quindi memorizzare questa somma come n + sum. Poi si carica n nuovo e sottrarre 1 e memorizzare che come il nuovo sum. Ma ho bisogno di ripetere questo fino a quando n raggiunge 0. Quindi come faccio a fare questo?

Ok, quindi che cosa devo fare è utilizzare il ramo se 0 e ramo se non 0. penso di avere esso? così:

     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 = area costante, ma ciò devo ripetere la sottrazione di uno e aggiungendo la somma fino n raggiunge lo 0. Branch se non zero è BRGT e ramo se zero è BZ e ramo è Br, LD è carico. So quello che ho bisogno di ripetere, ma non so come si esegue questa operazione in linguaggio assembly.

È pubblicato 08/01/2010 alle 04:46
fonte dall'utente
In altre lingue...                            


3 risposte

voti
5

Dal momento che questo suona come compiti a casa, inizierò con alcuni pezzi.

  1. Hai lavorato fuori la logica a questo problema ancora? "Kind of bloccati" potrebbe significare non avete idea di come questo deve essere fatto, o che non siete sicuri di come implementare con le istruzioni disponibili. Se non avete elaborato la logica, considerare questo - come si fa a trovare con i termini, come si fa ad aggiungere insieme, e che cosa fare con i risultati?

  2. Se avete lavorato fuori la logica, quindi, che i comandi si esibiranno ogni parte?

Se avete domande più specifiche sentitevi liberi di aggiornare e io rispondere, ma in generale la politica su SO è quello di offrire una guida piuttosto che scrivere codice per (possibile?) Domande dei compiti a casa.

Edit : ok grande, hai un po 'di codice, e sembra che siete sulla strada giusta, ma non c'è ancora. La prima cosa che vi chiedo è se si è tentato di eseguire il codice su carta. Scegliere un ingresso arbitrario (ad esempio 5, come nel tuo esempio) e passaggio attraverso il codice un'istruzione alla volta per vedere se la logica che il programma esegue segue la logica che si avvicinò con al passaggio 1. In questo momento credo che il programma di non funziona come scritto; vedere se è possibile scoprire perché e se non ti do un suggerimento.

Edit 2 : impressionante, sei così vicino che avete già la risposta e solo bisogno di codificarlo. Lei ha detto che si desidera ripetere fino a quando n raggiunge 0. Quindi, quale comando vi permetterà di prendere uno dei due rami a seconda che n è 0 o no?

EDIT 3 : lei ha ragione nel ritenere che è necessario utilizzare ramo se 0 / tralcio non 0, ma non vedo nessuno di quelli nel suo ultimo codice. Ho dimenticato qualcosa? Inoltre, qual è DC per in questo caso? Potrebbe essere utile se si posta una chiave quindi so esattamente quali istruzioni si sta utilizzando. Come ho detto prima, provare a eseguire il programma a mano - che vi mostrerà dove gli insetti sono. Il mio suggerimento per voi in questo momento è quello di individuare la parte del codice che deve essere eseguito più volte e scoprire se effettivamente venga eseguita ripetutamente.

Risposto il 08/01/2010 a 04:50
fonte dall'utente

voti
2

Provare a scrivere il problema in una pseudo-codice di alto livello prima.

Poi tradurlo al linguaggio assembly.

È possibile trovare aiuto sulla programmazione in linguaggio assembly qui

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

Questo odore come un compito scolastico, quindi penso che dovrebbe essere abbastanza per farti andare.

Risposto il 08/01/2010 a 04:51
fonte dall'utente

voti
0

pensare in C (supponendo che tu lo sai)

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

notare la mancanza di istruzioni break (eccetto il caso di indice 0).

questo aiuta?

Risposto il 10/01/2010 a 21:51
fonte dall'utente

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