Datora organizācija un valoda Asamblers (2000)

autors:A.Vjačins


1.  FUNKCIJAS IZSKAITĻOŠANA


1.1.   Uzdevuma nostādne

Izskaitļot funkciju:
(4*X^3-Y+1) / (X^2*Y+1), ja 4*X^3-Y+1 > 0
(4*X^3-Y+1) / (X^3-Y^2), ja 4*X^3-Y+1 <= 0.

1.2.   Programmas teksts

Comment &
   1. PRAKTISKAIS DARBS
   IZSKAITĻOT FUNKCIJU:
   (4*X^3-Y+1) / (X^2*Y+1), ja 4*X^3-Y+1 > 0
   (4*X^3-Y+1) / (X^3-Y^2), ja 4*X^3-Y+1 <= 0
&

dosseg
.model tiny
.code
.startup
           Jmp _Start 
X          Db  1
Y          Db  -2
Four       Dw  4
Zero       Equ 0
Z          Dw  ?

_Start:
           Mov  Al, X
           Imul X
           Mov  Bx, Ax
           Mov  Al, X
           Cbw
           Imul Bx
           Imul Four
           Mov  Bx, Ax
           Mov  Al, Y
           Cbw
           Sub  Bx, Ax
                     Add  Bx, 1       
           Cmp  Bx, Zero
           Jle  Branch_C

           Mov  Al, X
           Imul X
                     Imul Y
                     Add  Ax, 1 ; X*X*Y+1
           Jmp  Rezult

Branch_C: Mov  Al, Y
                    Imul Y
                    Mov  Cx, Ax ; Y*Y
               
                    Mov  Al, X
          Imul X
                    Mov  Dx, Ax
                    Mov  Al, X
                    Cbw
                    Imul Dx     ; X*X*X
                  
                    Sub Ax, Cx
                           
Rezult:
          Xchg Ax, Bx
          Cwd
          IDiv Bx
          Mov  Z, Ax
.exit 0
end

1.3.   Programmas rezultāti

Funkcijas izskaitļošanas rezultāts pie x un y vērtībām 1, -2 ir –7. Hex sistēmā tās ir FFF9.



Pēc funkcijas rezultāta izskaitļošanas rezultāts tika ierakstīts reģistrā AX. Zemāk piedāvātais zīmējums satur ekrāna izskatu komandas debug l1_com.com izpildes laikā. Zīmējumā pēdēja rindkopa satur l1_com.com programmas izpildes rezultātus: reģistrā Ax ir ievietota vērtība FFF9. Šīs skaitlis ir pierakstīts papildus kodā. Pārveidojot šo skaitli decimālajā sistēmā, tiek iegūts skaitlis –7.
1.zīm “Programmas l1_com.com izpilde”

2.  DARBS AR VEKTORIEM


2.1.   Uzdevuma nostādne

Atrast vidējo aritmētisko vērtību pozitīvajiem skaitļiem.

2.2.   Programmas teksts

Comment &
                viedejais aritmetiskais pozitivaijem skaitliem
&

dosseg
.model tiny
.code
.startup
           Jmp Start
   Vector  Dw  2, 7, -1, 4, 15
   N       Equ 5
   Zero    Equ 0     

Start:
                     Lea  Bx, Vector
           Mov  Cx, N
           Xor  Ax, Ax
           Mov  Dx, 0
                  
S:         Cmp  Word Ptr [Bx], Zero
                     Jl   _Not
                     Add  Ax, [Bx]  
           Inc  Dl
_Not:     
           Add  Bx, 2
           Loop S

           Idiv Dl
.exit 0
end

2.3.   Programmas rezultāti

Programmas rezultātu pārbaudei tika izmantota MS-DOS komanda debug. Lai apskatītu programmas rezultātu ir nepieciešams komandrindā uzrakstīt sekojošu komandu ar parametriem: debug l2_com.com. Programmas rezultāti atrodas reģistrā Ax. Ar roku saskaitot vērtības 2, 7, 4, 15 un šo rezultātu sadalot ar 4 (pozitīvo elementu skaits) tiks iegūts rezultāts 7, kas Hex sistēma ir 0007. Respektīvi, ja programma strādā pareizi, tad pēc programmas beigšanas reģistram Ax ir jāsatur vērtība 0007.



Programmas izpildes rezultāti ir sekojoši:
2.zīm. “Programmas l2_com.com izpildes rezultāti”
2.zīmējumā var apskatīt programmas izpildes rezultātus. Pati pēdēja rindkopā reģistra Ax vērtība ir 0007. Respektīvi , programma strādā pareizi.

3.  DARBS AR MATRICĀM UN VEKTORIEM


3.1.   Uzdevuma nostādne

Uzdota inicializēta matrica Matrix[N*M], N – rindu skaits, M – stabiņu skaits, un neinicializēts vektors Vector. Matricas elementus adresēt formā Matrix[Reģistrs][Reģistrs]. Rezultātus saglabāt vektorā Vector, izmantojot komandas Lea un Mov. Atsevišķā programmas blokā imitēt vektora drukāšanu, cikliski ievietojot vektora elementus reģistrā Ax.
Atrast matricas Matrix[N*M]katra stabiņa elementu summu.

3.2.   Programmas teksts

dosseg
.model tiny
.code
.startup
        Jmp     Start
N             Equ         2
M            Equ         3
Matrix    DW         1, 2, 3
                DW         4, 5, 6
Vector    DW         M Dup (?)
Lo           Equ         2
Hi            Equ         6
S              Equ         Type Matrix

Start:
                Xor         Bx, Bx
                Mov       Cx, N
                Lea         Di, Vector

Cols:       Mov       Dx, Cx
                Mov       Cx, M
                Xor         Si, Si
                Xor         Ax, Ax

Rows:     Add        Ax, Matrix[Bx][Si]
                Add        Si, S*M
                Loop      Rows

                Mov       [Di], Ax
                Add        Bx, S      
                Mov       Cx, Dx
                Add        Di, S 
                Loop      Cols  

                Mov       Bx, 0
                Mov       Cx, M

Print:
Mov       Ax, Vector[Bx]
                Add        Bx, S
                Loop      Print
       
.exit 0
end

3.3.   Programmas rezultāti

Programmas rezultātu pārbaudei tika izmantota MS-DOS komanda debug. Lai apskatītu programmas rezultātus, ir nepieciešams komandrindā uzrakstīt sekojošu komandu ar sekojošiem parametriem: debug l3_com.com. Programmas rezultāti (matricas katra stabiņa elementu summa) secīgi tiek izvadīti reģistrā Ax.
Matrica Matrix[N*M]satur 3 stabiņus ar sekojošiem elementiem:
1.stabiņš – 1, 4;
2.stabiņš – 2, 5;
3.stabiņš – 3, 6.
Saskaitot šos elementus, tiek iegūti sekojoši rezultāti:
1.stabiņa elementu summa ir 5 (0005);
2.stabiņa elementu summa ir 7 (0007);
3.stabiņa elementu summa ir 9 (0009);
Respektīvi, ja programma strādā pareizi, tad programmas ciklā Print reģistrā Ax secīgi ir jāizvada skaitļus 0005, 0007, 0009.



Programmas izpildes rezultāti ir sekojoši:
3.zīm. “Programmas l3_com.com izpildes rezultāti”
3.zīmējumā var apskatīt programmas izpildes rezultātus: ir redzams, ka programma reģistrā Ax secīgi izvada augšminētus skaitļus. Respektīvi , programma strādā pareizi.


4.  APAKŠPROGRAMMAS UN PARAMETRU NODOŠANA


4.1.   Uzdevuma nostādne

Noformēt  matricas Matrix apstrādi un rezultejošā vektora drukāšanu kā apakšprogrammas. Parametru nodošana jāveido izmantojot steku. Katrā apakšprogrammā obligāti jāsaglabā, jāatjauno reģistru saturs.        
Pirmās apakšprogrammas parametri:
1.        rindu skaits;
2.        stabiņu skaits;
3.        matricas adrese;
4.        vektora adrese.
Otras apakšprogrammas parametri:
1.  stabiņu skaits;
2.  vektora adrese.
Atrast matricas Matrix[N*M]katra stabiņa elementu summu.

4.2.   Programmas teksts

dosseg
.model tiny
.code
.startup
            Jmp Start
    N       Equ 2
    M       Equ 3
    Matrix  Dw  1, -2, 3
            Dw  4, 5, 6
    Vector  DW  M Dup (?)
    S       Equ Type Matrix

FormVector  Proc
            Local Temp:word, a:word
                               
                      Push Bp
            Mov  Bp, Sp

            Push Cx
            Push Bx
            Push Dx
            Push Di
            Push Ax

                      Mov  Ax, [Bp+6]
                      Mov  Dx, S
            Mul  Dx
            Mov  Temp, Ax

            Mov  Cx, [Bp + 6]
            Mov  Si, [Bp + 8]
                      Mov  Di, [Bp + 10]

Cols:      
            Mov  Bx, Si
            Mov  Dx, Cx
            Mov  Cx, [Bp + 4]
                      Xor  Ax, Ax

Rows:       Add      Ax, [Bx]
            Add  Bx, Temp
            Loop Rows

            Mov  [Di], Ax
            Add  Si, S
                      Mov  Cx, Dx
            Add  Di, S 
            Loop Cols  

            Pop Ax
            Pop Di
            Pop Dx
            Pop Bx
            Pop Cx

            Pop  Bp
            Ret  2*4
FormVector  EndP

Print       Proc
            Push Bp
            Mov  Bp, Sp
            Push Cx
            Push Bx
            Push Ax

            Mov  Cx, [Bp + 4]
            Mov  Bx, [Bp + 6]
Pr:         Mov  Ax, [Bx]
            Add  Bx, S
            Loop Pr

            Pop  Ax
            Pop  Bx
            Pop  Cx
            Pop  Bp
            Ret  2*2
Print       EndP

Start:
            Lea  Ax, Vector
            Push Ax
            Lea  Ax, Matrix
            Push Ax
            Mov  Ax, M
            Push Ax
            Mov  Ax, N
            Push Ax
            Call FormVector           

            Lea  Ax, Vector
            Push Ax
            Mov  Ax, M
            Push Ax
            Call Print
.exit 0
end

4.3.   Programmas rezultāti

Programmas rezultātu pārbaudei tika izmantota MS-DOS komanda debug. Lai apskatītu programmas rezultātus, ir nepieciešams komandrindā uzrakstīt sekojošu komandu ar sekojošiem parametriem: debug l4_com.com.
Matrica Matrix[N*M]satur 3 stabiņus ar sekojošiem elementiem:
1.stabiņš: 1, 4;
2.stabiņš: -2, 5;
3.stabiņš: 3, 6.
Saskaitot šos elementus, tiek iegūti sekojoši rezultāti:
1.stabiņa elementu summa ir 5 (0005);
2.stabiņa elementu summa ir 3 (0003);
3.stabiņa elementu summa ir 9 (0009);
Respektīvi, ja programma strādā pareizi, tad programmas procedūrai Print reģistrā Ax secīgi ir jāizvada skaitļus 0005, 0003, 0009.



Programmas izpildes rezultāti ir sekojoši:
4.zīm. “Programmas l4_com.com izpildes rezultāti”
4.zīmējumā var apskatīt programmas izpildes rezultātus: ir redzams, ka programma reģistrā Ax secīgi izvada augšminētus skaitļus. Respektīvi , programma strādā pareizi.


5.  TEKSTU RINDU APSTRĀDE


5.1.   Uzdevuma nostādne

Programma apstrādā teksta rindu – failu nosaukumu formā [.]. Iegūt no tā 11 baitus garu virkni, kur faila vārds novietots pirmajos 8 baitos un paplašinājums pēdējos 3 baitos:
1 2 3 4 5 6 7 8 9 0 1
n a m e             e x t
Visos gadījumos rezultējošā teksta rinda jāizdrukā. Skaitļi – rezultāti jāsaglabā reģistros vai atmiņā.

5.2.   Programmas teksts

dosseg
.model tiny
.code
.startup
        jmp Start
StrEnd  Equ '$'
Point   Equ '.'
FilName Db  'name.ext', '$', 13, 10
Result  Db  11 Dup (?)
Len     Equ $ - FilName - 3
Pos            Dw  0

Start:
        Push  Es

        Push  Ds
        Pop   Es

        Cld
        Mov   Cx, Len
        Mov   Al, Point
                  Lea   Si, FilName ;source DS:SI
        Lea   Di, Result  ;destination ES:DI

PointFind:
                  Lodsb
                  Cmp   Al, 46
                  Je    Found       ;else write name
                  Stosb
                  Inc   Pos
                  Loop  PointFind

Found:
                  Mov   Cx, 3
                  ;Aprekina nepieciesamo nobidi
                  Mov   Ax, 8
                  Sub   Ax, Pos
                  Mov   Pos, Ax
                  Add   Di, Pos
                  Jmp   WriteExt

WriteExt:
                  Lodsb
                  Stosb
                  Loop  WriteExt
                  Mov   ES:[Di], Byte Ptr StrEnd ;pievieno rindas beigas simbolu
               
                  Lea   Dx, Result
                  Mov   Ah, 9
        Int   21h

        Pop Es
.exit 0
end

5.3.   Programmas rezultāti

Programmas rezultātu pārbaudei tika izmantota MS-DOS komanda debug. Lai apskatītu programmas rezultātus, ir nepieciešams komandrindā uzrakstīt sekojošu komandu ar sekojošiem parametriem: debug l5_com.com.
Kontrolpiemēram tika izmantots sekojošais faila nosaukums: name.ext. Pēc programmas izpildes jābūt izvadītai sekojošai teksta rindai: name    ext (name, 4 atstarpes, ext).



Programmas izpildes rezultāti ir sekojoši:
5.zīm. “Programmas l5_com.com izpildes rezultāti”
1.zīmējumā var apskatīt programmas izpildes rezultātus. Programma izvade sekojošu rezultātu: name    ext (name, 4 atstarpes, ext), respektīvi , programma strādā pareizi.

6.  SECINĀJUMI

Katram laboratorijas darbam ir izveidoti un šajā nodaļā piedāvāti atsevišķi secinājumi.

6.1.   Funkcijas izskaitļošana

Darba izpildes gaitā tika izveidota com – programma, kas izskaitļo funkciju:
(4*X^3-Y+1) / (X^2*Y+1), ja 4*X^3-Y+1 > 0
(4*X^3-Y+1) / (X^3-Y^2), ja 4*X^3-Y+1 <= 0.
Programmas rezultāti (reģistra Ax saturs) tika apskatīti ar MS-DOS komandas debug palīdzību. Funkcijas izskaitļošanai vajadzēja izveidot divus lielus zarus: programma izpildās pēc pirmā zara, kad izteiksmes (4*X^3-Y+1) / (X^2*Y+1) rezultāts ir lielāks par nulli, programma izpildās pēc otrā zara, kad izteiksmes (4*X^3-Y+1) / (X^2*Y+1) rezultāts ir mazāks vai vienāds ar nulli. Lai noteiktu, pēc kura zara programmai ir jāizpildās, vispirms bija nepieciešams izrēķināt izteiksmes (4*X^3-Y+1) / (X^2*Y+1) vērtību. Atkarībā no izskaitļotas vērtības, vadība tika nodota atbilstošajam zaram. Vadības nodošana tika realizēta sekojoši:

Cmp  Bx, Zero

Jle  Branch_C.

6.2.   Darbs ar vektoriem

Izpildot šo darbu, manuprāt, ir jāpievērš uzmanība sekojošām lietām:
1.        Masīvu apstrāde ar Assembleru. Masīvs ir definēts programmas sākumā: Vector Dw 2,7,-1,4,15. Pieeja masīva katram elementam var tikt organizēta pēc tā adreses, t.i. masīva katrs elements atmiņā atrodas pēc noteiktas adreses. Griežoties pie šis adreses, var griezties pie masīva noteikta elementa. Šis programmas ietvaros pieeja masīva elementiem tika organizēta pielietojot netiešas adresācijas pēc bāzes veidu. Sākumā, reģistrā Bx tika ievietota masīva pirmā elementa adrese. Par cik katrs masīva elements ir 2 baitu liels (1 vārds ir 2 baiti), tad, lai iegūtu pieeju nākamam elementam, katrā cikla iterācijā reģistra Bx vērtībai tika pieskaitīta vērtība 2. Respektīvi, reģistrs Bx pēc katras pieskaitīšanas, norādīja uz masīva nākamo elementu;
2.        Ciklu organizēšana ar Assembleru. Šis programmas ietvaros cikla organizēšanai tika izpildītas sekojošas darbības:
Programmas sākumā reģistram Cx tika piešķirta vērtība N (masīva elementu skaits). Rezultātā, cikls izpildījās tieši N reizes. Pēc katras Loop komandas izpildes reģistra Cx vērtība samazinājās par 1.

6.3.   Darbs ar matricām un vektoriem

Programmā matrica Matrix[N*M]ir definēta un inicializēta sekojoši:
Matrix DW     1, 2, 3
            DW     4, 5, 6
Katrs matricas elements ir 2 baitu liels (1 vārds = 2 baiti). Atmiņā matrica ir attēlota kā vārdu (baitu) vektors, t.i. matricas elementi atmiņā ir novietoti secīgi viens pēc otra: 1, 2, 3, 4, 5, 6. Līdz ar to, lai strādātu ar matricas stabiņiem, ir nepieciešams izveidot un pielietot speciālas formulas, pēc kuriem tiks izskaitļota katra elementa adrese. Shematiski matricu var attēlot sekojoši:
                                       M
      
    N
1 (0)
2 (2)
3 (4)
4 (6)
5 (8)
6 (10)
Ar Bold ir attēloti matricas elementi, bet iekavas ir dota nobīde baitos no matricas sākuma adreses. Patiesībā, atmiņā matrica glabājas sekojošā veidā:
                                                                 L
1(0)
2(2)
3(4)
4(6)
5(8)
6(10)
L ir vektora elementu skaits. Iekavās ir dota nobīde baitos no vektora sākuma adreses. Respektīvi, lai strādātu ar matricas stabiņu elementiem, ir nepieciešams strādāt ar elementu 1 (nobīde ir 0), 4 (nobīde ir 6) un tml. Līdz ar to, programmā ir jāizveido 2 ciklus: pa kolonām (ārējais) un pa rindām (iekšējais).
Katrs matricas elements ir adresēts ar divu reģistru palīdzību:
Matrix[Bx][Si]
Šinī gadījumā Bx ir bāzes adrese un Si ir indeksa adrese. Par cik, tika izmantots reģistrs Bx, dati atrodas datu segmentā. Pielietojot tādu adresācijas veidu EA (effective address) tiek izskaitļots pēc formulas:
EA = [bāzes reģistrs] ­­+ [indeksa reģistrs] + konstanta
Kā jau tika minēts programmā ir izveidoti divi cikli. Ciklu izveidošanā tika izmantots reģistrs Cx kā cikla iterāciju skaitītājs. Par cik katrā ciklā ar katru iterāciju reģistra Cx vērtība samazinās par 1, kaut kur ir jāsaglabā šī reģistra vērtības. Šim nolūkam tika izmantots reģistrs Dx. Tā, pirms ciklu izveidošanas uz reģistru Cx tika pārsūtīta vērtība 3 (kolonu skaits). Ārējā ciklā reģistra Cx vērtība tika saglabāta reģistrā Dx, un pirms iekšēja cikla sākuma reģistrā Cx tika iesūtīta vērtība 2 (rindu skaits). Respektīvi, iekšējais cikls atkārtosies 2 reizes un reģistra vērtība Cx būs 0. Tagad, pirms komandas Loop Cols, reģistra Dx vērtība tiek nosūtīta uz reģistru Cx. Respektīvi, ārēja cikla skaitītāja vērtība tiks atjaunota.

6.4.   Apakšprogrammas un parametru nodošana

Programmā tika izveidotas 2 procedūras:
1.        FormVector – apstrādā matricu un veido vektoru (katrs vektora elements ir matricas stabiņu elementu summa);
2.        Print – imitē vektora elementu drukāšanu (pārsūta vektora katru elementu uz reģistru Ax).
Katra procedūra saņem parametrus. Parametru nodošanai programmā tika izmantots steks (augsta līmeņa valodas parametru nodošanai apakšprogrammas arī izmanto steku). Steks ir speciālais atmiņas apgabals, kas ir paredzēts datu īslaicīgai glabāšanai. Eksistē vairākas komandas, kas ļauj strādāt ar steku. Visizplatītākās ir sekojošas:
1.      Push – kāda elementa iestumšana stekā;
2.      Pop – elementa izstumšana no steka galvas.
Elements, kas atrodas stekā ir adresēts ar divu reģistru palīdzību: ss – steka segmenta adrese un sp – steka radītājs, respektīvi elementa, kas atrodas steka galvā, adrese ir ss:sp. Pēc komandu push vai pop izpildes steka radītāja vērtība izmainās. Tā, programmā pēc komandas push Ax izpildes steka radītāja sp vērtība samazinājās par 2; un otrādi, pēc komandas pop Ax izpildes steka radītāja sp vērtība palielinājās par 2. Komandas push un pop ir jāizmanto pārī, t.i. pēc katras komandas push izmantošanas ir jāizmanto arī komanda pop. Iestumjot elementus stekā un izstumjot tās no steka ir jāievēro elementu iestumšanas un izstumšanas secība, t.i. secīgi iestumjot elementus a, b, tās ir jāizstumj pretējā kārtībā (b,a).
Uzdevuma nostādnē ir pateikts, ka katrā procedūrā ir jāsaglabā, jāatjauno reģistru saturs. Programmā tās ir realizēts sekojoši: katras apakšprogrammas sākumā stekā tiek iestumtas izmantojamo reģistru vērtības, bet pirms beigt apakšprogrammu šīs vērtības tiek izstumtas no steka.
Viens no procedūras FormVector parametriem ir vektora adrese. Procedūra no matricas veido vektoru (aizpilda vektora elementus ar izskaitļotām vērtībām). Pie vektora elementiem procedūras komandas griežas pēc vektora  elementu adreses.
Pirms apakšprogrammas beigšanas ir jānorāda komanda ret (atgriešanas no apakšprogrammas komanda).

6.5.   Tekstu rindu apstrāde

Teksta rinda Assemblerā ir atmiņas apgabals, kuru garums var svārstīties no 1 baita līdz 64 kB. Assemblerā eksistē speciālas komandas, kas ir paredzētas darbam ar teksta rindām. Ar teksta rindām var tikt izpildītas sekojošas pamatoperācijas:
1.      Pārsūtīšana no viena atmiņas apgabala uz citu – komanda movs, movsb, movsw, movsd. Neatkarīgi no tā, kādi mainīgie tiek izmantoti šajās komandās avots (source) vienmēr atrodas pēc adreses DS:SI, bet saņēmējs (destination) pēc adreses ES:DI;
2.      Vienas teksta rindas (atmiņas pagabala) salīdzināšana ar otro – cmps, cmpsb, cmpsw, cmpsd. Tāpat kā iepriekšējā gadījumā, šīs komandas salīdzina avotu ar saņēmēju;
3.      Teksta rindu skanēšana – scas, scasb, scasw, scasd. Šīs komandas meklē teksta rindā vērtību, kas atrodas reģistrā Al, Ax vai Eax (tikai procesoram 80386 un augstāk);
4.      Teksta rindas lasīšana – lods, lodsb, lodsw, lodsd. Šīs komandas nolasa teksta rindas saturu akumulatorā. Atkarībā no nolasītas vērtības tipa, tās var tikt pārsūtīta uz reģistru Al, Ax vai Eax. Vērtības tiek nolasītas no teksta rindas, kas atrodas pēc adreses DS:SI. Pēc kārtējas komandas izpildes indeksa reģistra vērtība automātiski tiks palielināta (pazemināta) par 1, 2 vai 4 (konkrēta vērtība ir atkarīga no nolasāma elementa tipa: baits – 1, vārds – 2 vai dubultvārds – 4);
5.      Ierakstīšana teksta rindā – stos, stosb, stosw, stosd. Ierakstāma vērtība atrodas reģistrā Al, Ax vai Eax. Vērtība tiek ierakstīta teksta rindā, kas atrodas pēc adreses ES:DI.
Kā jau tika minēts teksta rindas ir atmiņas apgabali, kas atmiņā var aizņemt maksimāli 64kB, t.i. vienu segmentu. Strādājot ar divām teksta rindām, viena rinda ir avots un otra saņēmējs. Tā, šis programmas ietvaros rinda-avots ir rinda, kas satur faila vārdu (FilName). Šī rinda tika novietota pēc adreses DS:SI:
Lea   Si, FilName ;source DS:SI.
Rinda-saņēmējs ir 11 baitu gara rinda, kas satur programmas izpildes rezultātu. Šī rinda atmiņā tika novietota pēc adreses ES:DI:
Lea   Di, Result  ;destination ES:DI.
Visu šeit aprakstīto komandu izpildes rezultātā automātiski tiek izmainītas indeksu reģistru (SI, DI) vērtības, lai norādītu uz teksta rindas nākamo  (iepriekšējo) elementu. Lai šo indeksu vērtības tiktu automātiski mainītas ir nepieciešams karodziņa reģistra karodziņam DF piešķirt konkrēto vērtību: DF ir 0 – indeksu reģistru vērtība tiks automātiski pazemināta; DF ir 1 – indeksu reģistru vērtība tiks automātiski palielināta. Dažu komandu izpildes rezultātā mainās arī karodziņa reģistra dažu karodziņu vērtības.
Augšminēto komandu pielietošanas gadījumā var tikt izmantoti dažādi operandu tipi (baits, vārds, dubultvārds). Katram tādam tipam atbilst konkrēta komanda, t.i. baitam atbilst komanda, kuras nosaukuma pēdējais simbols ir ‘b’ – movsb, stosb, lodsb un tml; vārdam atbilst komanda, kuras nosaukuma pēdējais simbols ir ‘w’ – movsw, stosw, lodsw un tml; dubultvārdam analoģiski. Šajās komandās var arī tieši norādīt izmantojama operanda tipu. Piemērām, ja no atmiņas viena apgabala (rinda-avots) uz citu (rinda-saņēmējs) tiek pārsūtīts baits, tad komandas pieraksts būtu sekojošais:
movs b1, b1.

7.  LITERATŪRAS SARAKSTS

1.      G. Maiko “Assembler for IBM PC”, 1999.
2.      Lekciju konspekts priekšmetā “Datoru organizācija un assembleri”.

Nav komentāru:

Ierakstīt komentāru