Дейін» циклын йымдастыру.

Мысала Паскальды

repeat <циклды денесі> until X<=0; операторын алайы.

Бл операторды Ассемблерде жзеге асырылу слбесі:

 

BEGIN: циклды денесіне сйкес командалар тобы  
  CMP X, 0 ;Xпен 0 салыстырады
  JG BEGIN ;X >0 à BEGIN

Бл слба бойынша алдымен циклды денесіне сйкес командалар тобы орындалып (е болмаанда бір рет), соында келесі цикла ту шарты тексеріледі (Паскальда циклдан шыу шарты тексерілетін): егер шарт «аиат» болса, онда циклды денесі айталанады, ал егер «жалан» болса, онда цикл аяталады.

6.3.5-мысал. Рнатурал саны берілген. Осы сан алашы натурал сандарды кбейтіндісі болса неше кбейткіш алынанын анытап N-ге, ал болмаса Х-ке 1-ді меншіктеу керек. Р сз лшемді, ал N мен Х байт лшемді болсын.

Шешуі. андайда бір кмекші айнымалы (айталы p1) аламыз. Бірден бастап натурал сандарды біртіндеп кбейтіп осы айнымалыа жазамыз. Табылан кбейтінді p1 берілген Р санынан аспаанша (p1< p) циклды айталаймыз. Цикл аяталанда циклды айталану саны n неше кбейткіш алынанын крсетеді. Егер Рp1 болса, X- ке 1-ді меншіктейміз (X=1).

P DW 0 ;Р берілген натурал сан, сз лшемді

N DB 0 ;N аныталатын кбейткіштер саны, байт лшемді

X DB 0 ;Х кмекші айнымалы, байт лшемді

. . .

Mov n,1 ;n=1

mov p1,1 ;p1=1 кмекші айнымалы, сз лшемді

;Циклды денесі

l1: mov ax,p1 ;p1à ax

mul n ;p1* N

mov p1,ax ;p1= p1* N

inc n ;n= n +1

;Циклды аяталуын тексеру

cmp ax,p ;p1< p ?

jl l1 ;p1< p болса à l1

;p саны алашы n натурал сандарды

;кбейтіндісі болатынын тексеру

cmp ax,p ;p1=p ?

jle l2 ;p1=p болса à l2

mov x,1 ;x=1

l2:

. . .

6.3.6 -мысал. n натурал саны берілген. Осы санны цифрларыны осындысын табу керек (мысалы, n = 7528 болса нтиже: 7+5+2+8=22).

Шешуі. Берілген санны цифрларын табу шін сол санды 10-а (сан онды санау жйесінде боландытан) блеміз, табылан бліндіні таыда 10-а блеміз осы процесті блінді нлге жеткенше айталаймыз. р блуді алдыы санны цифрларын береді, оларды осып отырамыз.

N DD 0 ;N берілген натурал сан, екіеселі сз лшемді

S DB 0 ;S-а саны цифрларыны осындысы жазылады

. . .

mov x,10 ;X=10

mov s,0 ;s=0

l1: mov ax,n ;ax=N

div x ;N div 10

add s,ah ;s=s+N mod 10

mov ah,0 ;AL-ді АХ-ке зарту шін

mov n,ax ;N=N div 10

cmp n,0 ;N0 ?

jne l1 ;N0 à l1

. . .

Іс жзінде циклды саны белгілі болатын жадай жиі кездеседі, ондай жадай Паскальда for операторымен жзеге асырылады, ал Ассемблерде арнайы циклды басару командалары осылан.

 

Дріс №8

Таырыбы:Циклдарды басару командалары.

Жоспары.LOOP, LOOPPE/ LOOPPZ жне LOOPNE/LOOPNZ командалары. Мысалдар.

Циклдарды басару командалары

LOOP командасы

LOOP командасы жоары дрежелі тілдердегі For операторы трізді цикл есептеуішін автоматты трде азайту арылы йымдастырылады.

Айталы, андай да бір командалар тобын (циклды денесін ) N рет айталау керек болсын, онда ассемблерде мндай циклды келесі слба бойынша йымдастыруа болады:

  MOV CX,N / MOV ECX,N ;CX = N / ECX = N
BEGIN: циклды денесіне сйкес командалар тобы  
  DEC CX / DEC ECX ;CX = CX-1 / ECX=ECX-1
  CMP CX,0 / CMP ECX ;CX = 0? / ECX=0?,0
  JNE ;CX 0 / ECX0 BEGIN

 

Соы ш команда р циклдарды соында пайдаланылады. Сол себепті процессорды командалар жйесіне, осы ш команданы жмыстарын атаратын, арнайы макрокоманда енгізілген:

LOOP <белгі>

LOOP командасыны кмегімен жоарыдаы слбе былайша жазылады:

  MOV CX,N / MOV ECX,N ;CX:=N / ECX:=N
BEGIN: циклды денесіне сйкес командалар тобы  
  LOOP BEGIN ;CX / ECX>0 à BEGIN

Ышамды болды, сонымен атар LOOP командасы ш командаа араанда жылдамыра орындалады.

6.4.1.1 -мысал.N натурал саны берілген

S=1! + 2! + … + N! рнегін есептеу керек.

Шешуі. осылыштар саны N боландытан, LOOP командасын пайдалану шін N-ді СХ регистріне жазамыз. р циклда біртіндеп k факториалды есептеп оны андайда бір айнымалыа (s=s+k!)осып отырамыз.

N DW ? ; N осылыштар саны

S DD ? ;S осынды меншіктелетін айнымалы

...

mov s,0 ;s=0, осындыны алашы мні

mov f,1 ;f=1, факторалды алашы мні

mov k,1 ; k=1

mov cХ,n ; cХ=n

l: mov eax,f ; eax=f

mul k ; f*k

mov f,eax ; f=f*k

add s,eax ;

inc k ; k= k+1

loop l ; à L

. . .

6.4.1.2 -мысал. Фибоначчи саны (fn) f1=f2=1, fn=fn-1+fn-2, мнда n=3,4,… формулаларымен аныталады. Fn-ті анытау керек.

Шешуі. Фибоначчиді n-ші санын табу шін циклды n-2 рет орындау керек, себебі, алашы екі мні белгілі, сондытан СХ регистріне (N-2) -ні жазамыз. р циклда алдыы екі сан осылып кезекті сан аныталады.

f1 DW 1 ;f1-Фибоначчиді 1-ші саны

f2 DW 1 ;f2 -Фибоначчиді 2-ші саны

fn DW ? ;fn -Фибоначчиді n-ші саны

. . .

MOV F1,1 ;F1=1

MOV F2,1 ;CX=N

SUB CX,2 ;CX=N-2

L: MOV AX,F1 ;AX=F1

ADD AX,F2 ;AX= F1+F2

MOV FN,AX ;FN= F1+F2

MOV BX,F2 ;BX=F2

MOV F1,BX ;F1=BX

MOV F2,AX ;F2=AX

LOOP L ;àL

. . .

6.4.1.3 -мысал. N натурал саны берілген

рнегін есептеу керек.

Шешуі. Бл мысалда N осылыш осу керек. р осылыш kk (мнда k=1,2,... ,n) рнегімен есептеледі, яни циклды ішінде цикл йымдастыру ажет. Ішкі циклда да LOOP командасы олданылатын болса, СХ регистріні мнін сатап алып, сырты цикла тер алдында кайтадан алпына келіру керек.

N DB ? ;N осылыштар саны

K DB ? ;K кмекші айнымалы

S DD ? ;S осынды меншіктелетін айнымалы

D DD ? ;D kk меншіктелетін айнымалы

. . .

MOV S,0 ; S=0 осындыны алашы мні

MOV CX,N ; CX=N сырты цикл есептегіші

MOV K,1 ; K=1

;сырты циклды басталуы

L1: MOV D,1 ; D=1 осылышты алашы мні

MOV X,CX ; X=CX CX-ті сатап алу

MOV CX,K ; CX=K ішкі цикл есептегіші

;ішкі циклды басталуы

L2: MOV EAX,D ; EAX=D

MUL K ; D*K

MOV D,EAX ; D=D*K

LOOP L2 ; à L1

INC K ; K=K+1

ADD S,EAX ; S=s+kk

MOV CX,X ; CX=X, CX-ті алпына келтіру

LOOP L1 ; à L2