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