LOOPE / LOOPZ және LOOPNE / LOOPNZ командалары

Бұл командалардың орындалуы LOOP командасы тәрізді, яғни циклдың қайталану саны СХ/ECX регистірінде көрсетіледі. Өзгешеліктері: олар циклдан ертерек (цикл аяқталмай) шығуға мүмкіндік береді.

LOOPE / LOOPZкомандаларысинонимдар. Жазылулары:

LOOPE <белгі> немесе LOOPZ <белгі>

Бұл командалардың әрекетін былай сипаттауға болады: егер есептеуіш әлі нөл болмаса (CX/ECX>0) және нөлдік жалаушасы нөл болса (ZF=0), онда цикл қайталанады; егер есептеуіш әлі нөлге тең емес бола тұрып (CX/ECX>0), ал алдыңғы команданың нәтижесінде нөлдік жалаушаның мәні бірге тең болса(ZF=1), цикл соңына жетпей аяқталады.

Цикл не себепті ақталғанын соңынан ZF жалаушасын тексеру арқылы білуге болады.

LOOPE командасы көбіне қандайда бір тізбектің белгілі бір шартты қанағаттанатын алғашқы элементін табуда қолданылады.

6.4.2.1- мысал. X айнымалысына [a,b] аралығынан N саны бөлінбейтін алғашқы санды, ал ондай сан табылмаса 0-ді жазу керек.

Шешуі. N санын біртіндеп a, a+1, a+2, … , b сандарына бөліп, бөлу қалдығын нөлмен салыстырымыз. Бұл процесс нөлге тең қалдық табылғанша немесе аралықтың барлық элементтері қараластырылып болғаша қайталанады.

A DB ? ;A берілген аралықтың бірінші саны,байт өлшемді

B DB ? ;B берілген аралықтың соңғы саны, байт өлшемді

N DB ? ;N берілген сан

X DB ? ;X нәтиже

. . .

MOV DL,N

MOV DH,0 ;DX:=N, сөз өлшемді

MOV CL,B

MOV CH,0

SUB CL,a ;CX:=b-a (цикл есептегіші)

DEC A

MOV BL,A

L1: INC BL ;a,b] аралығындағы кезекті сан

MOV AX,DX

DIV BL ;AH:=N mod BL

CMP AH,0 ;mod=0?

LOOPE L1 ;цикл CX рет және mod=0 болғанша àL1

JNE L2 ;mod<>0 à L2

MOV BL,0

L2: MOV X,BL

LOOPNE және LOOPNZ командалары синонимдер. Бұл командалар LOOPE/LOOPZ командаларына ұқсас, бірақ циклдан мәресіне жетпей шығу СХ=0 немесе ZF=1 болғанда орындалады.

Циклды басқару командаларын пайдалану ықшамды да көрнекті. Сол себепті мүмкін болған жағдайда осы командаларды пайдаланған жөн. Десекте бұл командадардың келесі ерекшеліктерін ескерген жөн:

· есептеуіш ретінде мідетті түрде EСХ/СХ регистрі алынады;

· EСХ/СХ регистрінің алғашқы мәнін циклдің денесіне дейін беру керек және ол циклдың орындалу санына тең болады;

· бұл командалар тек қысқа өтуді жүзеге астырады, сондықтан циклдың денесі 128 байттан (шамамен 30-40 команда) аспауы керек. Егер циклдың денесі одан көп командадан тұрса, онда қолдануға болмайды.

· бұл командалар циклдың соңында орналасқандықтан циклдың денесі ең болмағанда бір рет орындалады, ал егер циклдың денесі бір ретте орындалмайтын жағдай қажет болса, онда циклдың алдында, JCXZ/JECXZ шартты өту командасын қолданып, CX/ECX=0 шартын тексеру арқылы айналып өту керек.

Дәріс №9,10

Тақырыбы: Құрылымды мәліметтермен жұмыс.Массивтер.

Жоспары. Индексті айнымалылар. Адрестерді модификациялау, индекстеу. Жанама сілтеме.Бірнеше регистр бойынша модификациялау. Ассемблер тілінде модификацияланатын адрестерді жазу

Адыңғы тарауларда процессордың командалары деңгейінде қолданылатын базалық мәліметтермен жұмыс жасадық. Олардың көмегімен іс жүзінде кез келген алгоритмдерді программалауға болады. Десекте, бұл оңай шаруа емес.

Программалауды жеңілдету үшін Ассемблер тілінде оның директивалар деңгейінде жүйелі мәліметтермен жұмыс жолдарын қамтамасыз ету ойластырылған. Бұл жоғары дәрежелі тілдер мен Ассемблердің арасындағы алшақтықты біршама жоюға мүмкіндік береді.

Ассемблер трансляторлары массив, құрылым, жиын, жазба типті құрылымды мәліметтермен жұмыс жолдарын жүзеге асырады.

Массивтер

Массив –бір атау берілген, біртипті мәліметтердің белгілі бір жиынтығы.

Ассамблер программаларында массивтермен жұмыс жасау ерекшеліктері мен мүмкіндіктерін білу үшін келесі сұрақтарға жауап беру керек:

· Программадамассивтер қалай сипатталады?

· Массив қалай жаңартылады (инициализацияланады), яғни оның элементтерінің алғашқы мәндері қалай беріледі?

· Массивтің элементтеріне қалай қатынауға болады?

· Массивпен амалдарды қалай ұйымдастыруға болады?

8.1.1 Массивті сипаттау және жаңарту

Әрине,Ассамблер тілінде массивтерді сипаттаудың арнайы құралдары жоқ. Массивті DUP қайталау конструкциясын қолдану арқылы мәліметтерді анықтау диретиваларымен сипаттауға болады. Мұнда кейбір жағдайларды ескере кеткен дұрыс.

Айталық Х 100 сөз өлшемді элементтерден тұрсын:

Х DW 100 DUP (?)

Көріп отырғанымыздай, массивті сипаттауда ондағы элемент саны (100) және оның типі (DW) көрсетіледі, брақ массивтің элементтерінің қалай нөмірленетіні (индекстеленетіні) көрсетілмейді. Сондықтан мұндай сипаттауға элементтері 0-ден басталатын, яғни Х[0..99] массиві де, элементтері 1-ден басталатын, яғни Х[1..100] массиві де, және элементтері кезкелген k-дан басталатын, яғни Х[k..99+k] массиві де сәйкес болуы мүмкін. Сөйтіп, программада массивтің индексіне кез келген аралық көрсетуге болады. Қандай аралық таңдаған жөн? Кейде индекстің өзгеру аралығы тікелей есептің шартымен анықталады (мысалы, есепте элементтердің реттік нөмірі 1-ден басталатыны анық айтылған). Бірақ, егер индекстің өзгеруі айқын көрсетілмесе. Онда 0-ден бастаған жөн. Неліктен?

Бұл сұраққа жауап беру үшін массивтің элементінің адресі сол элементің индексіне қалай байланысты болатынын қарастырайық. Айталық Х массивінің элементтерін нөмірлеу k-дан басталсын:

X DW 100 DUP(?) ; Х[k..99+ k]

Олай болса келесі теңдік дұрыс:

адрес(Х[і])= Х+2*(і- k)

немесе жалпы жағдайда:

адрес(Х[і])=Х+(type X)*(і- k)

Бұл байланыс k=0 болғанда қарапайымырақ болады:

адрес(Х[і]) = Х +(type X) * і

Сондықтан, әдетте, ассамблерде программалауда массивтің элементін нөмірлеу 0-ден басталады деп есептеледі:

X DW 100 DUP(?) ;Х[0..99]

Алда, міне осылай жасаймыз.

Көпөлшемді массивтер үшін де осылай. Айталық, мысал үшін, N жолдан M бағанадан (N мен M тұрақтылар) тұратын екіөлшемді А массиві (матрицасы) беріліп және оның элементтері – екіеселі сөздер болсын да, жол нөмірлері k1-ден, ал бағаналары k2-ден басталсын:

А DD 100(М DUP(?)) ;А[k1..N+(k1-1)],k2..M+(k2-1)]

Мұнда жадта матрицаның элементтері жол бойынша орналасады деп есептейміз: алғашқы М ұяшықта (екіеселі сөздер) матрицаның бірінші жолының элементтері, келесі М ұяшықта матрицаның екінші жолының элементтері және т.с.с. орналасқан. Әрине матрицаның элементтерін бағаналары бойынша да орналастыруға болады, бірақ жол бойыша орналастыру дәстүрлі жол: осы жолды ұстанамыз.

Онда матрица элементінің адресінің элемент индекстерінен байланыстылығы келесі өрнектердегідей анықталады:

адрес(А[і,j])=A+M*(typeА)*(і-k1)+(typeA)*(j-k2)

Мұнда да бұл өрнек элементтерді нөмірлеу 0-ден басталғанда, k1=0, k2=0 болғанда, қарапайымдалады:

адрес(А[і,j])= A+M*(type А)*і+(type A)*j

Наши рекомендации