 Wane informacje (2:482/33)  -WANE- 
 Msg  : 103 of 103                          Loc
 From : Marcin Macinski                     2:482/33        Thu, 13 Feb, 15:43
 To   : All
 Subj : Assembler, the story begins [part 9, memory moving]

Vitay All!

 Elementem niezbdnym w dalszej nauce bdzie umiejtno kopiowania fragmentu
pamici w inne miejsce. Z pewnoci po wszystkich poprzednich odcinkach kady
ju potrafi odczyta bajt z dowolnego miejsca pamici czy zapisa warto w
jakiekolwiek miejsce RAM'u <: Dla tych, ktrzy nie umiej, maa przykadowa
ciga:

 Odczyt:                                    Zapis:
    mov ax,rdo_segment                       mov ax,przeznaczenie_segment
    mov ds,ax                                   mov es,ax
    mov si,rdo_offset                        mov di,przeznaczenie_offset
    mov ax,ds:[si]                              mov es:[di],liczba
    (w AX mamy warto spod DS:SI)              (w ES:DI mamy warto LICZBA)

 Pamitamy jednak z poprzedniego odcinka, e mov ax,ds:[si] mona zastpi przez
lodsb. Wnioskowa mona zatem, e istnieje analogiczna instrukcja, ktra
powoduje zapis do pamici. Jest to

 >STOSB
    kopiuje zawarto rejestru AX do ES:DI. Jeli flaga DF jest wyzerowana,
    zwiksza DI o 1, jeli jest zapalona, zmniejsza DI o 1.

 Odpowiednikiem mov es:[di],ax jest wic mnemonik stosb.

 Dalsze studiowanie listy rozkazw procesora 80x86 przynosi coraz ciekawsze
odkrycia, jak na przykad to, e w celu przekopiowania bajtu spod DS:[SI] do
ES:[DI] wcale nie trzeba pisa
    lodsb
    stosb
poniewa okazuje si, e suy do tego komenda

 >MOVSB
    kopiuje zawarto DS:SI do ES:DI. Jeli flaga DF jest wyzerowana, zwiksza
    SI oraz DI o 1, jeli jest zapalona, zmniejsza SI oraz DI o 1.

 Zamy, e chcemy teraz przekopiowa pierwsz poow ekranu w trybie 13h na
drug poow. Robimy to tak:
    mov ax,0a000h       ;ekran w 13h to 0A000h:????
    mov ds,ax           ;segment do DS
    mov es,ax           ;segment do ES
    xor si,si           ;ustawiamy odczyt na pozycji 0A000h:0
    mov di,32000        ;ustawiamy zapis na pozycji 0A000h:32000
    mov cx,32000        ;kopiowanie 32000 bajtw
    kopiuj:
        movsb           ;jedziemy z koksem
    loop kopiuj

 Sprytni projektanci wyposayli jednak procesor w bardzo uyteczny mnemonik

 >REP
    powtrzenie operacji o CX razy.

 Zamiast wic
    mov cx,32000
    kopiuj:
        movsb
    loop kopiuj

 piszemy:
    mov cx,32000
    rep movsb

 REP stosuje si jedynie z tymi mnemonikami, ktre powoduj zapis/odczyt pamici
(movsb, stosb, out, ins, scas, cmps).

 Tak dla informacji, istniej jeszcze instrukcje

 >REPE (lub REPZ)
    jak REP; dodatkowo sprawdza flag ZF. Jeli nie jest ustawiona, koczy
    ptl.

 >REPNE (lub REPNZ)
    jak REP; dodatkowo sprawdza flag ZF. Jeli jest ustawiona, koczy ptl.


 Programu dzisiaj nie napisaem, bo i nie ma po co (:


 ZADANIE DOMOWE:
    Mamy dany obszar pamici od 1000h:0000h do 1000h:000Fh (16 bajtw innymi
sowy) oraz sta o wartoci 0FFh. Opracowa ptl, ktra w kadej iteracji
bdzie przenosia (_nie_ kopiowaa) sta poczynajc od 1000h:0000h, a koczc
na 1000h:000Fh. Po przeniesieniu bajtu ma by przywracana oryginalna zawarto
komrki pamici.

  ,
 /;`\ koniu
 ` | \____
 .-(_ ___ ):.
  `  | ,-'| ;
     ^    ^
--- GoldED/386 2.50+
 * Origin: Kto rzadko save'uje, ten w nocy pracuje (2:482/33)
