 Wane informacje (2:482/33)  -WANE- 
 Msg  : 80 of 93                            Snt Loc
 From : Marcin Macinski                     2:482/33        Thu, 10 Oct, 00:47
 To   : All                                                 Fri, 11 Oct, 23:34
 Subj : Assembler, the story begins [1, first program]

Vitay All!

 Zacznijmy od razu z grubej rury, czyli wywietlmy niemiertelny napis "Hello
world". W Pascalu przyszoby to atwo, bo wystarczyoby napisa

 begin
      write('Hello world');
 end.

 Ale co w assemblerze? Szczerze mwic, jest tak samo, tylko wszystko jest
rozbite na mniejsze "cegieki".
 Jak wywietli jakikolwiek napis? Majc ksik z przerwaniami szukamy sobie
funkcji DOSa, gdzie znajdujemy mniej wicej taki zapis:

 Funkcja 09h
 wywoanie: AH = 09h
            DS:DX = wskanik cigu znakw przeznaczonych do wywietlenia
 powrt:    brak
 uwagi:     cig musi by zakoczony znakiem "$"

 Wobec tego w Pascalu wygldaoby to tak:

 var r:registers;
     napis:string;
 begin
      napis:='Hello world$';
      r.ah:=$9;
      r.ds:=seg(napis);
      r.dx:=ofs(napis);
      int($21,r);
 end.

 Wystarczy powysze "przetumaczy" na assembler:

pierwszy_program segment    ; tutaj zaczyna si segment kodu, czyli nasz
                            ; program
org 100h                    ; nasz program bdzie si zaczyna od CS:100h

start:                      ; zaczynamy!

  lea dx,napis              ; (1)
  mov ah,9h                 ; (2)
  int 21h                   ; (3)
  int 20h                   ; zakoczenie programu i wyjcie do DOSa
                            ; niektrzy wol zakacza przez:
                            ;        mov ax,4c00h
                            ;        int 21h
                            ; ale ja preferuj krtsze metody (:

 napis db 'Hello world$'    ; (4)

pierwszy_program ends       ; koniec segmentu kodu
end start                   ; the end...


 No tak, ale co to wszystko znaczy? Jedziemy po kolei:

> (1) LEA X,Y
     oblicza offset Y i umieszcza go w X
     rwnowane jest MOV X,OFFSET Y

> (2) MOV X,Y
     umieszcza warto Y w X (na razie przyjmijmy, e X jest rejestrem)

> (3) INT X
     wywouje przerwanie X

> (4) cotam DB bajt1, bajt2, ..., bajtN
     lub
>     cotam DB 'ABCDEFG'
     lub
>     cotam DW sowo1, sowo2, ..., sowoN
     lub
>     cotam DD podwjne_sowo1, podwjne_sowo2, ..., podwjne_sowo3
     deklaracja danych o nazwie "cotam"

 Jak napisali mdrzy ludzie w opisie funkcji 9h przerwania 21h, w rejestrze DS
ma znajdowa si segment naszego napisu. Moecie si zapyta (a waciwie
powinnicie), dlaczego wobec tego nie przypisaem nic do DS. piesz z
wyjanieniem: nie zrobiem tego, poniewa wiedziaem, e w programach typu COM
(nasz program to wanie COM) segment danych rwna si segmentowi kodu. Nie
apiesz? Podpowied: CS oznacza z angielska Code Segment, a DS Data Segment.


 Oczywicie odpowiadam na pytania "dlaczego" i "po co" (:

  ,
 /;`\ koniu
 ` | \____
 .-(_ ___ ):.
  `  | ,-'| ;
     ^    ^
--- GoldED/386 2.50+
 * Origin: Bardziej upieski od upiea (2:482/33)
