Informații portal msevm

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.

articole similare