ASEMBLER Konwersja Liczy Szesnastkowej na binarną

0

Cześć!

Muszę zrobić program w asemblerze, ale tutaj uwaga (na 8080 czyli na 8 bitow), który zamienia liczbę z zakresu 00 do FF na binarną i wyświetla ją na ekran.
Program zrobić zrobiłem, mimo że to moja pierwsza styczność z ASM, natomiast wykładowca uparł się że musi on być jak najbardziej optymalny.

Moj algorytm jest prosty:

Pobierz liczbe od uzytkownika
Rozpoznaj ją
Wypisz na ekran, wczesnej wykorzystujac 4 rejestry do zaladowania wartości binarnej

Jest to metoda typowo siłowa, ale za chiny nie mogę wpaść na prostsze rozwiązanie.. Może ktoś z was ma jakiś pomysł?
Zdaje sobie sprawę, że rozpoznanie liczby mogę zrobić w pętli, ale jej wyświetlanie już nie będzie takie szybkie..

  ORG 800h
        MVI L,0 ; licznik liczby
        RST 2
        MOV C,A
        RST 2
        MOV B,A
        MVI A,' '
        RST 1
        MVI A,' '
        RST 1
        MOV A,C

POCZATEK

      CPI 30H
     JZ JEST_ZEREM
     CPI 31H
     JZ JEST_JEDYNKA
     CPI 32H
     JZ JEST_DWOJKA
     CPI 33H
     JZ JEST_TROJKA
     CPI 34H
     JZ JEST_CZWORKA
     CPI 35H
     JZ JEST_PIATKA
     CPI 36H
     JZ JEST_SZOSTKA
     CPI 37H
     JZ JEST_SIODEMKA
     CPI 38H
     JZ JEST_OSEMKA
     CPI 39H
     JZ JEST_DZIEWIATKA
     CPI 41H
     JZ JEST_DZIESIATKA
     CPI 42H
     JZ JEST_JEDENASTKA
     CPI 43H
     JZ JEST_DWUNASTKA
     CPI 44H
     JZ JEST_TRZYNASTKA
     CPI 45H
     JZ JEST_CZTERNASTKA
     CPI 46H
     JZ JEST_PIETNASTKA


     HLT


JEST_ZEREM  
           MVI C,'0'
           MVI D,'0'
           MVI E,'0'
           MVI H,'0'
           JMP WYSWIETL


JEST_JEDYNKA 
           MVI C,'0'
           MVI D,'0'
           MVI E,'0'
           MVI H,'1'
           JMP WYSWIETL
           
JEST_DWOJKA
           MVI C,'0'
           MVI D,'0'
           MVI E,'1'
           MVI H,'0'
           JMP WYSWIETL
JEST_TROJKA
           MVI C,'0'
           MVI D,'0'
           MVI E,'1'
           MVI H,'1'
           JMP WYSWIETL
JEST_CZWORKA
           MVI C,'0'
           MVI D,'1'
           MVI E,'0'
           MVI H,'0'
           JMP WYSWIETL
JEST_PIATKA
           MVI C,'0'
           MVI D,'1'
           MVI E,'0'
           MVI H,'1'
           JMP WYSWIETL
JEST_SZOSTKA
           MVI C,'0'
           MVI D,'1'
           MVI E,'1'
           MVI H,'0'
           JMP WYSWIETL
JEST_SIODEMKA
           MVI C,'0'
           MVI D,'1'
           MVI E,'1'
           MVI H,'1'
           JMP WYSWIETL
JEST_OSEMKA
           MVI C,'1'
           MVI D,'0'
           MVI E,'0'
           MVI H,'0'
           JMP WYSWIETL
JEST_DZIEWIATKA
           MVI C,'1'
           MVI D,'0'
           MVI E,'0'
           MVI H,'1'
           JMP WYSWIETL
JEST_DZIESIATKA
           MVI C,'1'
           MVI D,'0'
           MVI E,'1'
           MVI H,'0'
           JMP WYSWIETL
JEST_JEDENASTKA
           MVI C,'1'
           MVI D,'0'
           MVI E,'1'
           MVI H,'1'
           JMP WYSWIETL
JEST_DWUNASTKA
           MVI C,'1'
           MVI D,'1'
           MVI E,'0'
           MVI H,'0'
           JMP WYSWIETL
JEST_TRZYNASTKA
           MVI C,'1'
           MVI D,'1'
           MVI E,'0'
           MVI H,'1'
           JMP WYSWIETL
JEST_CZTERNASTKA
           MVI C,'1'
           MVI D,'1'
           MVI E,'1'
           MVI H,'0'
           JMP WYSWIETL
JEST_PIETNASTKA
           MVI C,'1'
           MVI D,'1'
           MVI E,'1'
           MVI H,'1'
           JMP WYSWIETL

WYSWIETL   MOV A,C
           RST 1
           MOV A,D
           RST 1
           MOV A,E
           RST 1
           MOV A,H
           RST 1

           INR L      ;Spr czy wysw druga licz
           MOV A,L    ;Spr czy wysw druga licz
           CPI 1
           JZ SPR
           HLT




SPR MOV A,B
JMP POCZATEK

Myślałem jeszcze nad takim rozwiązaniem:

Sprawdź, czy liczba jest większa od 8, jeżeli jest to wypisz jako MSB "1", jeżeli nie to wypisz jako MSB "0", natomiast jeżeli liczba jest równa 8, to wypisz cała sekwencje: "1000".
Tylko ten kod znów byłby długi i nieoptymalny..

0

Jak byś to zrobił na kartce, ręcznie?

0

Podzielił bym liczbe na dwie, czyli np. A, B no i korzystając z tego iż wiem że A to 10, a B to 11 to wypisałbym to binarnie. Właśnie ten pierwszy program jest moją realizacją tego, w jaki sposób zrobił bym to na kartce.. : D

0

Em, to nie jest zły pomysł - ale nie jest też uniwersalny.
W jaki sposób na kartce przeliczyłbyś liczbę z dowolnej podstawy A na dowolną podstawę B, przy czym zakładamy 2 <= A, B <= 36.

1

Przepraszam, ale kompletnie nie rozumiem co masz teraz na myśli..
To, w jaki sposób na kartce dokonał bym konwersji zależy przede wszystkim od tego z jakiej konkretnej podstawy zamienił bym na którą konkretną.

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