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..