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.

Odzczyt i korekcja godziny, przerwanie 21h

benek111 30 Gru 2011 22:14 848 1
  • #1 30 Gru 2011 22:14
    benek111
    Poziom 17  

    Program do kompilacji pod Free Pascala pod DOSa. Założenie jest takie : program ma zmieniać godzinę w czasie systemowym o +1 po naciśnięciu strzałki do góry i odpowiednio o -1 po naciśnięciu strzałki w dół na klawiaturze.
    Wymyśliłem sobie to tak:
    1. odczytam aktualną godzinę ( przerwanie 21h funkcja 2Ch)
    2. dodam lub odejmę 1
    3. zapiszę poprawionę godzinę ( przerwanie 21h funkcja 2Dh)
    Problem jest taki, że nie zapisuje poprawionej godziny.
    Proszę o pomoc bo w asemblerze za bardzo się nie orientuję i pewnie coś zwaliłem.

    Kod: pascal
    Zaloguj się, aby zobaczyć kod

    program czas;
    uses crt, graph;

    var gd,gm:integer;
    var dana:byte;
    var dana1,k:string;
    begin


    gd:=D4bit; {na d4bit nie przelacza stron an D8bit przelacza}
    gm:=m640x480;
    initgraph(gd,gm,'');


    repeat

    { Odczytanie czasu }
    asm
    MOV AH,2Ch
    int 21h
    mov dana,CH {kopiowanie godziny do zmiennej dana}
    mov AH,4Ch
    end;
    {Funkcja zwraca czas w rejestrach CX i DX: CH - godzina, CL - minuta, DH - sekunda, DL - 1/100 sekundy.}

    str(dana,dana1);
    outtextxy(200,200,dana1);
    outtextxy(300,300,'+1 godz- strzalka do gory');
    outtextxy(300,310,'-1 godz- strzalka do na dol ');
    if keypressed then k:=readkey;
    if k=(#72) then
    begin
    dana:=dana+1;
    str(dana,dana1);
    outtextxy(300,400,dana1);

    ASM
    MOV AH,2Dh {ustawienie godziny}
    MOV CH,dana
    INT 21h
    end;
    k:=('a');
    asm
    mov dana,AL { rejestr pokazuje czy operacja się wykonała poprawnie jesli jest -0 , FFh - niewykonane}
    int 21h
    end;

    str(dana,dana1);
    outtextxy(300,450,dana1); {wyswietlenie stanu rejestru AL}

    end;


    if k=(#80) then
    begin
    dana:=dana-1;
    str(dana,dana1);
    outtextxy(300,400,dana1);
    ASM
    MOV AH,2Dh
    MOV CH,dana
    INT 21h
    end;
    k:=('a');
    end;


    until k='k'
    end.
    Kod: pascal
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [godziny] 19 [minuty]:

    Odpowiadam sam sobie:
    W funkcji 2Dh przerwania 21h trzeba zapisać wszystkie rejestry tzn.
    CH- godziny
    CL- minuty
    DH- Sekundy
    DL- Setne części sekundy
    A zmyliło mnie to, że zapisując tylko rejestr CH- godziny , przed wejściem w pętlę REPEAT UNTIL , wszystko działało OK. Czyli godziny zmieniały się. Ciekawe ?? :?:

    0 1
  • #2 31 Gru 2011 09:05
    Dżyszla
    Poziom 42  

    oczywiście. Każde wyjście z bloku asm musisz traktować jako utratę rejestrów. Jeśli chcesz to zrobić poprzez asm - cały kod powinien być w nim napisany, aby mieć kontrolę nad rejestrami. W przeciwnym wypadku musisz inicjować na nowo.

    0