• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Assembler - nie mogę zrozumieć :P

42 Warsaw Coding Academy
0 głosów
1,440 wizyt
pytanie zadane 17 listopada 2017 w Inne języki przez Cherry96 Nowicjusz (170 p.)
edycja 18 listopada 2017 przez Eryk Andrzejewski

Witam, mam problem ze zrozumieniem kodu (jestem początkujący). Czy ktoś mógłby mi wytłumaczyć, czy chociaż nakierować?
 

;Pobieram Znak
mov     ah, 1
int     21h

;Zwiekszam o 1
mov      dl, al   
inc     dl

; Wyświetlam znak powiększony o 1
mov     al, 2
int     21h



Chodzi mi głównie o wyświetlanie. Czegoś tutaj nie rozumiem:

jeśli znak jest w dl, to dlaczego wyświetlam go poprzez al ?

1 odpowiedź

+2 głosów
odpowiedź 18 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
wybrane 18 listopada 2017 przez Cherry96
 
Najlepsza

Jest coś takiego jak spis przerwań Ralpha Browna (RBIL). Jeżeli nie chce Ci się pobierać plików, które są czystym tekstem, możesz skorzystać np. z tej strony: http://www.ctyme.com/intr/int.htm

Masz tu po prostu listę przerwań i opisy ich działania, w którym rejestrze znajduje się który parametr i tak dalej.

Przerwania DOSa, których używasz, to przerwanie 0x21 (czyli inaczej 21h). Ale to, która procedura ma się wykonać (czy np. napisanie znaku, czy wczytanie znaku z klawiatury), zależy od zawartości rejestru AH.

Przeanalizujmy twój kod:

;Pobieram Znak
mov ah, 1
int 21h

Z tego spisu przerwań można wyczytać:

DOS 1+ - READ CHARACTER FROM STANDARD INPUT, WITH ECHO

AH = 01h

Return:
AL = character read

A więc wczytujesz znak z klawiatury do rejestru AL.

Dalej:

;Zwiekszam o 1
mov dl, al   
inc dl

Czyli zawartość AL wrzucasz do rejestru DL, a następnie inkrementujesz zawartość rejestru DL - będziesz miał tam znak o kodzie o jeden większym.

I teraz dochodzimy do twojego problemu. Pytasz: czemu znak wyświetlany należy umieścić w rejestrze DL? A no trzeba zajrzeć do tego spisu przerwań. Dla przerwania 21h AH=2

DOS 1+ - WRITE CHARACTER TO STANDARD OUTPUT

AH = 02h
DL = character to write

Return:
AL = last character output (despite the official docs which state nothing is returned) (at least DOS 2.1-7.0)

Czyli po prostu tutaj znak wrzuca się do rejestru DL, tak jest skonstruowane to przerwanie, że przyjmuje parametr w postaci rejestru DL.

Tyle. wink

A podsumowując: zaglądaj do dokumentacji, tam jest wszystko napisane.

 

komentarz 18 listopada 2017 przez Cherry96 Nowicjusz (170 p.)
Wielkie dzięki. Sporo mi rozjaśniłeś :D
komentarz 18 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Chyba niepotrzebnie aż tak to analizowałem, ale zawsze jest jakiś przykład, jak powinno się (mam nadzieję) czytać jakąś dokumentację. smiley

komentarz 10 kwietnia 2024 przez sensor Użytkownik (680 p.)

@Eryk Andrzejewski, witaj a możesz podać jakiś link z dokładną, szczegółową polskojęzyczną dokumentacją

Podobne pytania

+1 głos
2 odpowiedzi 656 wizyt
pytanie zadane 10 kwietnia 2024 w Systemy operacyjne, programy przez sensor Użytkownik (680 p.)
0 głosów
1 odpowiedź 202 wizyt
0 głosów
1 odpowiedź 916 wizyt
pytanie zadane 14 grudnia 2017 w Inne języki przez Cherry96 Nowicjusz (170 p.)

93,377 zapytań

142,379 odpowiedzi

322,528 komentarzy

62,726 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...