Cicluri, permite de a efectua o anumită secțiune a unui program de mai multe ori, în orice limbă, este una dintre cele mai comune modele. Sistemul de MP 86 cicluri de instruire sunt puse în aplicare, în principal, prin intermediul buclei de comandă (bucla), deși există și alte modalități de buclare. În toate cazurile, numărul de etape din ciclul determinat de conținutul registrului CX, astfel încât numărul maxim de etape de 64 K.
Luați în considerare un exemplu simplu de organizare a ciclului. Lăsați programul rezervat spațiu pentru o gamă largă de dimensiuni de 10.000 de cuvinte, iar această matrice trebuie să fie umplut cu serii de numere naturale de la 0 la 9999. Aceste numere, completând elementele succesive ale șirului, denumite uneori ca numărul de substituenților. Corespunzătoare Programul fragment va fi după cum urmează:
; Segmentul de date
array dw 10000 DUP (0)
; În segmentul de program
mov AX, 0; Valoarea inițială a agregatului
mov CX, 10000; contor buclă
umple: mov [BX] [SI], AX; Filler trimite în matrice
inc AX; Incrementați agregat
adaugă SI, 2; indice de modificare
umplere buclă; echipa ciclu
; Organizarea de ciclu lung
mov CX, 10000; Ciclul Counter
umple :; Marchează începutul ciclului
; corp ciclu lung
dec CX; contor buclă Decrementați
cmp CX, 0; A lucrat dintr-un număr predeterminat de etape?
finisaj je; Da, marchează continuarea programului
JMP de umplere; Nu, la începutul ciclului
termina :; program continuu
În acest fragment foarte tipic noi „manual“ descreste conținutul contorului buclei și să compare valoarea primită cu 0. Dacă CX = O, acest lucru înseamnă că, în ciclul este satisfăcut un număr predeterminat de etape, și condiționată de procesare je instruire ramură continuă la continuarea unui program (finisaj eticheta ). Dacă CX nu este încă zero, echipa de salt necondiționat JMP transportat înapoi la început. După cum sa arătat în Sec. 2, comanda JMP vă permite să se mute în orice punct al segmentului, și se îndepărtează o limită privind mărimea ciclului corpului.
Dacă este necesar, organizarea de bucle imbricate, pentru stocarea contorul buclei exterioare pentru durata teancului intern este comod de utilizat. Codul de mai jos este organizat durata în timp a unei întârzieri secunde câteva (o anumită cantitate de întârziere depinde de viteza procesorului).
exterior: împinge CX; Salvați-l în stivă
mov CX, 0; contor buclă interioară
interior: buclă internă; bucla bucla interioară
pop CX; Restaurare contor extern
outher buclă; buclă exterioară buclă
cmp AX, BX; Compararea a două registre
je egal; salt dacă AX = BX
cmp SI Mem; registru comparație și celula de memorie
jne notequ; Salt dacă SI<>mem
21h int; DOS apel
jc syserr; Salt dacă a existat o eroare
sau BX, BX; Analiza BX
jz zero; sari dacă BX = 0
INPT: în AL, DX; dispozitiv de intrare a prezentului
testul AL, 80h; bit 7 în prezenta analiză
je INPT; intrare până în prezent. în timp ce
; Bit 7 = 0 (în așteptare setarea bitului 7)
AX test 7; 0,1,2 biți de analiză în AX
jne găsit; Salt în cazul în care cel puțin un bit
; Unul este instalat
testare DI, din H; Analiza bit 0. 3 DI
JZ reset; Salt dacă acestea sunt lăsate să cadă
mov ax, date; Inițializarea
muta DS, AX; registru DS
; Deriva un mesaj de serviciu
mov AH, 09h; funcția O
; Pentru a pune intrare șir de interogare în DOS
mov ah, 3Fh; Funcția de intrare
mov BX, 0; descriptor tastatură
mov CX, 80, introduceți maxim 80 de octeți
mov actlen, AX, de fapt, a introdus
; Am converti litere mici în capitalul românesc
mov CX, actlen; șir de intrare lungime
mov SI, 0; Index în tampon
Filtru: mov al, buf [SI]; Ia simbolul
cmp AL, „o“, mai puțin „o“?
noletter jb, Da, nu convertiți
cmp AL, 'I', mai 'eu'?
noletter ja; Da, nu convertiți
cmp AL, 'n', mai 'n'?
ja mai mult; Da, pentru verificări suplimentare
sub AL, 20h; 'a' .. 'n'. Transformarea într-un capital
magazin jmp; Pe conservare în tampon
mai mult: cmp AL, 'p'; 'p1' mai mică (cu caractere grafice)?
jb noletter;> 'n',<'p'. Не изменять
sub AL, 50h; 'p'. 'I'. Transformarea într-un capital
magazin: mov buf [SI], AL, trimis înapoi la buf
noletter: inc SI; deplasa indicatorul
filtru de buclă, toate simbolurile ciclului
; Deducem rezultatul de conversie de pe ecran pentru a controla
mov AX, 40h; funcția O
mov BX, 1; Ecran Descriptor
mov CX, actlen; Lungime Mesaj
mov ah, 01, opriți programul
int 21h; așteptare pentru apăsare de tastă
msg db "Enter! $"
buf db 80 DUP ( ''); Tampon de intrare
stivă segment stk
Mul - comanda înmulțirea numerelor fără semn;
imul - echipă înmulțirea numerelor semnate;
div - comandă împărțirea numerelor fără semn;
idiv - diviziune echipa de numere semnate.
Vom explica diferențele dintre aceste echipe pe exemple formale.
, Înmulțirea numerelor pozitive cu semnul
mov AL, 5, primul factor este egal cu 5
mov BL, 7, al doilea factor este 7
BL Mul; AX = 0023h = 35
mov AL, 5, primul factor este egal cu 5
mov BL, 7, al doilea factor este 7
imul BL; AX = 0023h = 35
Ambele echipe, Mul și imul, da, în acest caz, același rezultat ca numere pozitive, cu un semn identic cu numere întregi fără semn. Nu atât în multiplicarea numerelor negative.
; Multiplicarea numerelor negative cu semnul
mov AL, OFCh; primul factor = 252
mov BL, 4; Al doilea factor = 4
BL Mul; AX = 03F0h = 1008
mov AL, OFCh; primul factor = -4
mov BL, 4; Al doilea factor = 4
imul BL; AX = FFFO = -16
Aici echipele de acțiune și Mul imul pe aceleași operanzii produce rezultate diferite. În primul exemplu număr fără semn FcH, care este interpretat ca 252, este multiplicat cu 4, rezultând într-un număr fără semn 3F0, adică 1008. În al doilea exemplu, același număr privit ca un FcH număr semnat. În acest caz, este -4. Multiplicarea prin 4 dă FFF0h, adică -16.