Assembler språk programmering

stemmer
0

Jeg prøver å skrive et program som skriver inn et positivt tall mindre enn 10 og gir ut summen av de første tallene. For eksempel 5 kan være 4 + 5 + 3 + 2 + 1. Kommandoene er stopp, Load, Store, Legg til, Sum, Multiplisere, Dividere, Input, output, Branch, Branch hvis 0, og gren hvis ikke 0. Kan noen hjelpe meg her. Jeg slags fast. vel det jeg har skrevet er:

      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  

Vel slik jeg ser det fungerer er du legger noen tall n og legge til en sum av 0, og deretter lagre denne summen som n + sum. Deretter laster du n igjen og trekke fra en og lagre det som ny sum. Men jeg trenger det for å gjenta dette til n ned til 0. Så hvordan gjør jeg dette?

Ok så hva jeg trenger å gjøre er å bruke den grenen dersom 0 og gren hvis ikke 0. Jeg tror jeg har det? så:

     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 = Dedikert konstant, men hva jeg må gjenta er subtraheringskret ved ett og tilsetning av summen til n ned til 0. Branch hvis ikke er null er BRGT og gren hvis null er BZ og gren er BR, er LD belastning. Jeg vet hva jeg trenger å gjenta, men jeg vet ikke hvordan du gjør dette i assembly.

Publisert på 08/01/2010 klokken 03:46
kilden bruker
På andre språk...                            


3 svar

stemmer
5

Siden dette høres ut som lekser, vil jeg starte med noen stykker.

  1. Har du jobbet ut logikken på dette problemet ennå? "Kind of stuck" kan bety at du har ingen anelse om hvordan dette må gjøres, eller at du ikke er sikker på hvordan å gjennomføre det med de tilgjengelige instruksjonene. Hvis du ikke har fungert logikken, tenk på dette - hvordan kommer du opp med begrepene, hvordan legger du dem sammen, og hva gjør du med resultatene?

  2. Hvis du har jobbet ut logikken, så hvilke kommandoer skal utføre hver del?

Hvis du har mer spesifikke spørsmål du gjerne oppdatere og jeg skal svare, men generelt politikken på SO er å tilby veiledning i stedet for bare å skrive kode for (mulig?) Lekser spørsmål.

Edit : ok flott, har du fått noen kode, og det ser ut som du er på rett spor, men ikke der ennå. Det første jeg vil spørre deg er om du har prøvd å kjøre koden på papir. Plukk en vilkårlig inngang (si 5, som i ditt eksempel) og gå gjennom koden en instruksjon om gangen for å se om logikken at programmet utfører følger logikken som du kom opp med i trinn 1. Akkurat nå tror jeg programmet virker ikke som skrevet; se om du kan finne ut hvorfor, og hvis ikke jeg skal gi deg et hint.

Edit 2 : awesome, du er så nær at du allerede har svaret og trenger bare å kode den. Du sa du ønsker å gjenta til n ned til 0. Så, hvilken kommando vil la deg ta en av to grener avhengig av om n er 0 eller ikke?

Rediger 3 : Du har rett i å anta at du trenger å bruke gren hvis 0 / grenen ikke 0, men jeg kan ikke se noen av de i den siste kode. Gikk jeg glipp av noe? Også, hva er DC for i dette tilfellet? Det kan være nyttig hvis du legger en nøkkel så jeg vet nøyaktig hvilke instruksjoner du bruker. Som jeg sa tidligere, prøve å gjennomføre programmet for hånd - som vil vise deg hvor feilene er. Mitt tips for deg akkurat nå er å identifisere den delen av koden som må utføres flere ganger og finne ut om det faktisk ikke bli utført gjentatte ganger.

Svarte 08/01/2010 kl. 03:50
kilden bruker

stemmer
2

Prøv å skrive ut problemet i et høyt nivå pseudo-kode først.

Så oversette det til assembly.

Du kan finne hjelp i programmering i assembly her

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

Dette lukter som en skoleoppgave, så jeg tror det skal være nok til å få deg i gang.

Svarte 08/01/2010 kl. 03:51
kilden bruker

stemmer
0

tenker på det i C (forutsatt at du vet det)

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

oppmerksom på mangelen på pause uttalelser (unntatt på 0'th tilfelle).

Hjelper dette?

Svarte 10/01/2010 kl. 20:51
kilden bruker

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