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

asembler, odczyt znaku z klawiatury

15 Cze 2010 11:00 6452 4
  • Poziom 9  
    Cześć.
    Chce napisać program, który pobiera znak z klawiatury (liczbe 0-9), i przekazuje ją do pętli, gdzie wyświetlany jest jakiś napis, w pętli o liczniku zadeklarowanym przez użytkownika.

    mam tyle:
    Code:

    .model small
    .386
     
    .data
    tekst db "petla znakow",0Ah,0Dh,"$"
    .stack 100h
    .code
    .startup

    mov dx, offset tekst
    mov ah, 09h
    int 21h

    mov cx,2
    petla:
    mov ah,2
    mov dl,'@'
    int 21h
    loop petla

    .exit
    end


    do odczytu z klawiatury jest ten kod:
    mov ah,10h
    int 16h

    ale nie wiem jak go połączyć z pętlą.

    Jakieś rady ?
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Użytkownik usunął konto  
  • Poziom 9  
    Najprościej napisać nic nie wnoszącą odpowiedź jeśli się nie zna rozwiązania, racja :) ?
    Nie jestem asemblerowcem, ten język nie jest intuicyjny, jeśli się zajmuje już parę lat językiem wysokiego poziomu, to pisanie w asemblerze sprawia olbrzymie problemy.

    Ale wracając do tematu... do rejestru cx, odpowiadającemu licznikowi, trzeba dodać wartość z klawiatury. Pisząc
    Code:

    mov cx,ah

    gdzie ahprzechowuje wartość wciśniętego znaku, niestety wyskakują mi błędy, więc nie tędy droga.

    Więc proszę o jakieś konkretne odpowiedzi.

    Pozdrawiam.
  • Poziom 35  
    Nie wiem czy dobrze zrozumiałem? Ale po przerwaniu 16h mogłoby być:
    Code:

    1 jz powrót_do_pętli_przed_przerwaniem_16h
    2 cmp al,(kod_klawisza_0)
    3 jb powrót_do_pętli_przed_przerwaniem_16h
    4 cmp al,(kod_klawisza_9)
    5 ja powrót_do_pętli_przed_przerwaniem_16h
    6. dalszy kod


    W skórcie to tak, tylko trzeba pamiętać o opróżnieniu bufora przed odczytem - do odczytu bufora należy skorzystać o ile dobrze pamiętam z funkcji 10h przerwania 16h.

    Czyli po kolei:
    1 Jeśli flaga ZF ustawiona (brak klawisza) to powrót do przerwania 16h
    2. Porównanie kodu ASCII klawisza 0
    3. Jeśli mniejszy to powrót do przerwania 16h
    4. Porównanie kodu ASCII klawisza 9
    5. Jeśli większy to powrót do przerwania 16h
    Powinien ci zostać w rejestrze AL kod ASCII między 0 a 9. Odejmujesz od niego 48 (taka pozycja 0 w tabeli ASCII) i otrzymujesz liczbę między 0 a 9 odpowiadającą klawiszowi. Następnie dodaj sobie to do tego CX i gotowe.

    PS. Proszę się nie pieklić jeśli popełniłem gdzieś błąd, bo jest rano i boli mnie łeb.
  • Użytkownik usunął konto