Programare Assembler Limba

voturi
0

Am încercat să scrie un program care intrările un număr pozitiv mai mic de 10 și ieșirile suma primelor numere. De exemplu, 5 ar fi 5 + 4 + 3 + 2 + 1. Comenzile sunt Stop, Load, Store, Add, Sum, Înmulțire, Împărțire, intrare, ieșire, Branch, Sucursala dacă este 0, iar ramura dacă nu 0. Poate cineva să mă ajute aici. Sunt un fel de blocat. bine ceea ce am scris este:

      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  

Ei bine, modul în care am vedea de lucru este să încărcați unele numărul n și se adaugă o sumă de 0 și apoi stoca această sumă ca n + suma. Apoi, încărcați din nou și n scade 1 și stoca ca noua sumă. Dar am nevoie de ea pentru a repeta acest lucru până când n-ajunge la 0. Deci, cum fac asta?

Ok deci ce trebuie să faceți este să utilizați ramura dacă 0 și ramura dacă nu 0. Cred că am avea? asa de:

     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 = Desemnat Constant, dar ceea ce am nevoie să repet este scăderea de către unul și adăugarea sumei până când n-ajunge la 0. Sucursala dacă nu zero, este BRGT și ramură în cazul în care este zero, BZ și ramură este BR, LD este de încărcare. Știu ce am nevoie să repet, dar nu știu cum să faceți acest lucru într-un limbaj de asamblare.

Întrebat 08/01/2010 la 04:46
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
5

Din moment ce acest lucru sună ca temele, voi începe cu niște bucăți.

  1. Ați lucrat logica la această problemă încă? „Un fel de blocat“ ar putea însemna ai nici o idee despre modul în care acest lucru trebuie să fie făcut, sau că nu sunteți sigur cum să-l pună în aplicare cu instrucțiunile disponibile. Dacă nu ați lucrat logica, ia în considerare acest lucru - cum ai venit cu termenii, cum le adăugați împreună, și ce faci cu rezultatele?

  2. Dacă ați lucrat logica, atunci comenzile care va efectua fiecare parte?

Dacă aveți mai multe întrebări specifice nu ezitați să actualizeze și voi răspunde, dar, în general, politica privind SO este de a oferi îndrumare, mai degrabă decât doar scrie codul pentru (posibil?) Întrebări teme.

Editare : OK mare, ai un cod, si se pare ca esti pe drumul cel bun , dar nu există încă. Primul lucru pe care l-ar întreba este dacă ați încercat să execute codul de pe hârtie. Alegeți o intrare arbitrar ( să zicem 5, la fel ca în exemplul dumneavoastră) și pas prin codul o singură instrucțiune la un moment dat pentru a vedea dacă logica că programul efectuează urmează logica pe care ați venit cu în pasul 1. Chiar acum cred că programul nu funcționează așa cum este scrisă; vezi dacă poți afla de ce și , dacă nu vă voi da un indiciu.

Edit 2 : minunat, ești atât de aproape că aveți deja răspunsul și trebuie doar să - l cod. Ai spus că doriți să repetați până când n - ajunge la 0. Deci, care comandă va permite să ia una dintre cele două ramuri , în funcție de faptul dacă n este 0 sau nu?

Edit 3 : vă sunt corecte în presupunând că aveți nevoie să utilizați sucursală dacă 0 / sucursală nu 0, dar eu nu văd nici dintre cele mai recente cod. Am pierdut ceva? De asemenea, ceea ce este DC în acest caz? S - ar putea fi de ajutor dacă postați o cheie , așa că știu exact ce instrucțiuni pe care îl utilizați. Așa cum am spus mai înainte, încercați să executa programul de mână - pe care le va arăta în cazul în care bug - uri sunt. Indiciu meu pentru tine chiar acum este de a identifica porțiunea de cod care trebuie să fie executate în mod repetat , și de a afla dacă este de fapt executatã în mod repetat.

Publicat 08/01/2010 la 04:50
sursa de către utilizator

voturi
2

Încercați să scrieți pe problema într-un pseudo-cod de nivel înalt în primul rând.

Apoi traduce în limba dvs. de asamblare.

Puteți găsi ajutor pentru programare în limbaj de asamblare aici

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

Acest miros ca o misiune de școală, deci cred că ar trebui să fie suficient pentru a te duci.

Publicat 08/01/2010 la 04:51
sursa de către utilizator

voturi
0

gândesc la asta în C (presupunând că îl cunoașteți)

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

nota lipsa declarațiilor de pauză (cu excepția cazului 0'th).

Are acest ajutor?

Publicat 10/01/2010 la 21:51
sursa de către utilizator

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