Język programowania Assembler

głosy
0

Próbuję napisać program, który Wejścia dodatnią liczbę mniej niż 10 i wysyła sumę liczb pierwszych. Na przykład 5 będzie 5 + 4 + 3 + 2 + 1. Polecenia są Stop obciążenia, Sklep, dodawać, Sum, mnożenie, dzielenie, wejście, wyjście, Oddział Oddział jeśli 0, a jeśli nie oddział 0. Czy ktoś może mi pomóc tutaj. Ja niby zatrzymany. dobrze, co napisałem jest:

      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  

Dobrze sposób widzę, że działa to załadować pewnej liczby N i dodać kwotę z 0, a następnie zapisać tę sumę jako n + sumy. Następnie załadować n ponownie i odjąć 1 i przechowywać które jako nową sumę. Ale muszę to powtarzać to aż n osiągnie 0. Więc jak mam to zrobić?

Ok, więc to, co trzeba zrobić, to skorzystać z oddziału, jeżeli 0 i oddziału, jeżeli nie 0. Myślę, że mam to? więc:

     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 = przeznaczona Constant, ale co muszę powtórzyć to odejmowanie i dodawanie przez jedną sumę aż osiągnie 0. n Oddział jeśli nie zero BRGT i oddziału, jeżeli jest zerowy i oddział jest BZ BR LD jest obciążenie. Wiem, co muszę powtórzyć, ale nie wiem jak to zrobić w asemblerze.

Utwórz 08/01/2010 o 04:46
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
5

Ponieważ brzmi to jak praca domowa, zacznę z niektórych kawałków.

  1. Czy wypracowane logikę tego problemu jeszcze? „Kind of Stuck” może oznaczać nie masz pojęcia, jak to należy zrobić, albo że nie jesteś pewien, jak wdrożyć je z dostępnymi instrukcjami. Jeśli nie wypracowaliśmy logikę, rozważ to - jak można wymyślić z warunkami, w jaki sposób dodać je razem, a co zrobić z wynikami?

  2. Jeśli pracowałeś na logikę, to polecenia, które będą wykonywać każdą część?

Jeśli masz bardziej szczegółowe pytania nie krępuj się aktualizować i będę odpowiadać, ale generalnie polityka na SO jest oferowanie wskazówek zamiast po prostu napisać kod (możliwe?) Pytania domowych.

Edit : ok super, masz jakiś kod, a wygląda na to, że jesteś na dobrej drodze, ale jeszcze nie ma. Pierwszą rzeczą, którą chciałbym cię zapytać, czy masz próbował wykonać kod na papierze. Odebrać dowolną wejście (powiedzmy 5, jak w przykładzie) i krok poprzez kod jednej instrukcji na raz, aby sprawdzić, czy logika, że program wykonuje następujące logikę, że wymyślił w kroku 1. Teraz wierzę program nie działa jak napisane; sprawdzić, czy można dowiedzieć się, dlaczego, a jeśli nie dam wam podpowiedź.

Edit 2 : niesamowite, że jesteś tak blisko, że masz już odpowiedź i po prostu trzeba go zakodować. Mówiłeś, że chcesz powtarzać aż n osiągnie 0. Więc, co komenda pozwala przyjąć jedną z dwóch oddziałów w zależności od tego, czy n jest 0, czy nie?

Edycja 3 : masz rację zakładając, że trzeba użyć oddział jeśli 0 / oddział nie 0, ale nie widzę żadnego z tych, w swojej najnowszej wersji kodu. Przegapiłem coś? Ponadto, co jest dla DC w tym przypadku? Może to być pomocne, jeśli umieścić klucz więc wiem dokładnie, które instrukcje używasz. Jak powiedziałem wcześniej, spróbuj wykonujący swój program ręcznie - który pokaże, gdzie są błędy. Moja wskazówka dla ciebie teraz jest zidentyfikowanie część kodu, która musi być wykonywana wielokrotnie i dowiedzieć się, czy to rzeczywiście robi się wielokrotnie wykonywane.

Odpowiedział 08/01/2010 o 04:50
źródło użytkownik

głosy
2

Spróbuj wypisywanie problemu w wysokim szczeblu pseudo-kodu w pierwszej kolejności.

Następnie przełożyć je do asemblerze.

Można znaleźć pomoc dotyczącą programowania w asemblerze tutaj

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

Ten zapach jak przypisanie szkoły, więc myślę, że powinno być tyle, aby można było.

Odpowiedział 08/01/2010 o 04:51
źródło użytkownik

głosy
0

o tym myśleć w C (zakładając, że go znasz)

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

uwagę na brak sprawozdania Break (z wyjątkiem na 0'th przypadku).

czy to pomaga?

Odpowiedział 10/01/2010 o 21:51
źródło użytkownik

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