Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[asembler] - Prezentacja wyniku w monitorze CGA.

dawid.barracuda 03 Lis 2015 15:57 459 3
  • #1 03 Lis 2015 15:57
    dawid.barracuda
    Poziom 13  

    Dzień dobry.
    Mam taki problem - otóż napisałem program w asemberze, który wypisuje imię i nazwisko, liczy powtórzenia danego znaku pojawiającego się w całym monitorze CGA oraz tenże znak zaznacza poprzez zmianę koloru jego i koloru tła. Oto kod:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Problem polega na tym, że nie wiem jak poprawnie wyświetlić liczbę z rejestru BX na monitorze CGA. Chciałbym podać tę liczbę w formie dzisiętnej, szesnastkowej i dwójkowej.
    Bardzo proszę o wskazówki jak zabrać się za ten problem i pozdrawiam.

    0 3
  • #2 05 Lis 2015 01:57
    Argon1
    Poziom 6  

    Wyświetlasz tak jak znaki, tylko musisz zamienić swoją liczbę na ASCI.

    Stwórz sobie podprogram który będzie zamieniał liczbę z danego rejestru na ASCI z dowolnego formatu. Pamiętaj, że liczby są przechowywane w formacie HEX.
    Zobacz czy nie masz komendy która konwertuje HEX na BCD (dziesiętny), wtedy tylko dodajesz $30 to każdej cyfry z BCD i masz pikną liczbę na ekranie.
    A jak nie ma komendy w asm, to masz pełno przykładów w necie jak to zrobić.
    pozdro

    0
  • #3 05 Lis 2015 09:43
    kinggustav
    Poziom 20  

    Jak kolega napisał musisz zamienić liczbę na odpowiednie znaki ASCII i wydrukować te znaki. Możesz napisać uniwersalną procedurę zamiany, działającą na zasadzie: dzielenie i resztą z dzielenia indeksowanie tablicy cyfr szesnastkowych (dla 10 i 2 wykorzysta mniej cyfr). Możesz też napisać oddzielne procedury i wykorzystać fakt, że na 2 i 16 konwertuje się łatwiej. Musisz tylko jeszcze podjąć decyzję czy liczba w rejestrze będzie bez znaku (łatwiejsze) czy ze znakiem.

    0
  • #4 05 Lis 2015 12:24
    Argon1
    Poziom 6  

    Nie trzeba tak kombinować jak sugeruje kinggustav. Bo trzeba pamiętać, że przesówjąc bity w lewo, mnożymy o 2, a w prawo dzielimy o 2. No i można skorzystać z komendy która ustawi nam bajt w BCD.
    Wtedy
    AND $0F
    ADD $30

    I masz mniejszą cyfrę liczby

    ROR (x4)
    AND $0F
    ADD $30

    I masz większą cyfrę liczby, dlatego dobrze jest zapisywać je od tylu, np. jakiś rejestr +20 i z każdą cyfrą zmniejszasz go o 1. A resztą wypełniasz spacjami ($20) i masz ładną liczbę dziesiętną gdzieś w pamięci gotową do wyświetlenia jak imię i nazwisko.

    Dodano po 19 [minuty]:

    Bianrnie to już w ogóle banalnie.

    Lecisz ROR i sprawdzasz flagę C (chyba) i jak jest ustawiona to w swoim buforze wstawiasz znak '1' -> $31, a jak jest 0 to '0' -> $30

    Szesnastkowo, też banalnie..
    AND $0F

    sprawdzasz czy większe niż 9, jeżeli nie to dodajesz $30
    A jak tak, to dodajesz (66-9) -> 65 to znak A w ASCI, a odejmijąc 9 (może być 8 od 65) dostajesze z $0A -> $01

    I masz 'pikną' liczbę w HEX

    0