Assembler - zamiana między systemami

0

Witam. Mam do zrealizowania program, który rozpozna w jakim systemie wpisano liczbę, a następnie wypisze to na ekran + wypiszę wartośc tej liczby w systemie dziesiętnym. Program ma wyglądać tak:

user image

Nie bardzo wiem, jak się za to zabrać. Myślałem, że może coś z tablicami, ale nie działają mi :(

1

Specyfikacja jaką podałeś nie jest szczególnie precyzyjna, ale trudno, będę się domyślał.

Więc pomijając wszystkie szczegóły związane z wczytywaniem danych, masz w zasadzie trzy rzeczy do zrobienia:

  1. rozpoznanie systemu
  2. obliczenie wartości
  3. wypisanie wyniku.

Z 3) sobie poradzisz mając podstawy asemblera.
Jeśli chodzi o 1) to to kilka if-ów (w przypadku asm, skoków warunkowych, ale polecam myśleć strukturalnie/w kategoriach if-ów na przykład), coś w rodzaju:

if (word[0] != '0') {
    result = convert(10, word);
} else if (word[0] == 'o') { // nitpick: tutaj wypadałoby jeszcze sprawdzić czy liczba to nie "" (ciąg pusty)
    result = convert(8, word + 2);
} else if (word[0] == 'x') {
    result = convert(16, word + 2);
} else {
    print("nieznany system");
    return 1;
}

A jeśli chodzi o 2), istnieje prosty algorytm na obliczenie wartości liczby zapisanej w dowolnym systemie pozycyjnym (OT: 'obliczenie wartości zapisanej liczby to sensowne sformułowanie? Jak to wyrazić lepiej? ).

mając liczbę "12345" (12345 zapisane w systemie 10kowym), znamy jej wartość bo możemy obliczyć:
12345 = 5 * 10<sup>0 + 4 * 10</sup>1 + 3 * 10<sup>2 + 2 * 10</sup>3 + 1 * 10^4
12345 = 5 * 10^0 + 4 * 10^1 + 3 * 10^2 + 2 * 10^3 + 1 * 10^4

Analogicznie 0x89AB = 11160 + 1016</sup>1 + 9162 + 816</sup>3

Więc żeby znaleźć liczbę zapisaną w stringu, idziesz od końca po jej cyfrach i sumujesz cyfra*baza^potęga jak powyżej.

0

Dzięki za zainteresowanie tematem i odpowiedź. Ogólnie wiem jak zamieniać z jednego systemu na drugi system. Największym problemem w tym zadaniu jest dla mnie "chodzenie po cyfrach". W C liczbę zapisałbym w tablicy i poruszałbym się po indeksach, tutaj nie wiem jak to zrobić.
Czytałem o tablicach w asemblerze, ale pomimo zapisania tak jak w przykładach wyskakują mi errory.

Jeszcze dodam, bo być może jest to istotne, że piszę w składni AT&T na linuxie.

0

Czytałem o tablicach w asemblerze, ale pomimo zapisania tak jak w przykładach wyskakują mi errory.

W C liczbę zapisałbym w tablicy i poruszałbym się po indeksach, tutaj nie wiem jak to zrobić.

Hm, mniej więcej tak samo. Podaj ten kod który napisałeś i Ci nie działa, zobaczymy co można poprawić.

Jeszcze dodam, bo być może jest to istotne, że piszę w składni AT&T na linuxie.

Tak OT - AT&T jest brzydka (a przynajmniej tak uważa większość, łącznie ze mną), jeśli masz wybór polecam składnię intela.

1 użytkowników online, w tym zalogowanych: 0, gości: 1