Циклды ыысу командасы
Циклды ыысу командасына битті ыысу мнін сатайтын командалар жатады. Циклдік ыысу командасыны 2 типі бар:
- арапайым циклдыќ ыысу командалары;
- cf тасымалдау жалауы арќылы циклды ыысу командалары.
Ќарапайым циклдыќ ыысу командаларына жататындар:
rol операнд, ыѓысулардыњ_санауышы (Rotate Left) — сола арай циклды ыысу. Операндтыњ ќ±рамы ыѓысулардыњ_санауышы операндымен аныќталатын биттер санына солѓа ќарай жылжиды. Солѓа ќарай жылжитын биттер сол операндќа оњ жаѓынан жазылады;
ror операнд, ыѓысулардыњ_санауышы (Rotate Right) — оња арай циклды ыысу. Операндтыњ ќ±рамы ыѓысулардыњ_санауышы операндымен аныќталатын биттер санына оњѓа ќарай жылжиды. Оњѓа ќарай жылжитын биттер сол операндќа сол жаѓынан жазылады.
арапайым циклдік ыысу командалары µздерініњ жмысы барысында бір пайдалы рекетті жасайды, атап айтса: циклдік ыысатын бит операндќа тек ќана басќа жаѓынан жылжып ќана ќоймайды, оныњ мєні бір уаќытта cf жалауыныњ мєні болады. Мысалы, еах регистрініњ екі жартысыныњ ќ±рамын ауыстыру шін келесі командаларды орындау жеткілікті:
mov eax, ffff0000h
mov cl, 16
rol eaх, cl
cf тасымалдау жалауы арќылы циклдыќ ыѓысу командаларыныњ ќарапайым циклдыќ ыѓысу командаларынан айырмашылыѓы ыѓысатын бит операндќа бірден т‰спейді, алдымен cf тасымалдау жалауына жазылады. Тек ќана берілген ыѓысу командасыныњ келесі орындалуы (ол циклды орындалѓан кезде) б±рын жылжытылѓан биттіњ операндтыњ басќа соњына орналасуына єкеледі.
Cf жалауы арќылы циклдыќ ыѓысу командаларына келесілер жатады:
rcl операнд, ыѓысулардыњ_санауышы (Rotate Through Carry Left) — тасымал арылы циклды солѓа ыысу. Операндтыњ ќ±рамы ыѓысулардыњ_санауышы операндымен аныќталатын биттер санына солѓа ќарай жылжиды. Жылжитын биттер кезекпен cf тасымалдау жалауыныњ мєні болады;
rcr операнд, ыѓысулардыњ_санауышы (Rotate through Carry Right) — тасымал арылы циклды оа ыысу. Операндтыњ ќ±рамы ыѓысулардыњ_санауышы операндымен аныќталатын биттер санына оњѓа ќарай жылжиды. Жылжитын биттер кезекпен cf тасымалдау жалауыныњ мєні болады.
Тасымалдау жалауы арќылы ыѓысу кезінде, дербес жаѓдайда циклдыќ ыѓысатын биттерді ауыстыруды жасауѓа болады. Мысалы, bх регистріне еах регистріні лкен блігін жазуды ќарастырайыќ:
mov cx, 16 ;еах ‰шін ыысулар саны
ml:
clc ; cf жалауын 0-ге тастау
rcl еах, 1 ; cf –ке еах-тен шеткі сол жаќ биттіњ ыѓысуы ыысуы
rcl bx ; bх –ке оњ жаќтан cf-тен биттердіњ ауысуы
loop ml ; цикл 16 рет
rol еах, 16 еах-ті о жаын ќалпына келтіру
арапайым циклдік ыѓысу командаларын баса да рекеттерде олдануа болады. Мысалы, еах регистріндегі бірлік биттерді санын анытау керек болсын:
xor dx, dx ; бірлік биттерді санау шін dx –ті тазалау
mov cx, 32 ; санаудыњ циклдар саны
cycl: : ; циклдыњ белгісі
ror eax, 1 ; оа арай циклдік 1 битке ыысу
jnc not_one ; егер, cf –тегі кезекті бит
; бірге те емес болса, онда кµшу
inc dx ; цикл санауышын арттыру
not_one:
loop cycl ; егер, сх-тегі мєн 0-ге тењ емес болса,
; онда cycl белгісіне кµшу
Жолдыќ командалар
Жолдармен, немесе тізбектелген символдар немесе сандармен ж±мыс істеу ‰шін микропроцессорда бірќатар арнайы командалар ќарастырылѓан:
movs — жолды тасымалдау;
cmps — екі жолды салыстыру;
seas — жолдаы берілген элементті іздеу;
lods — жолдан аккумуляторды ж‰ктеу (AL немесе АХ регистрлерін);
stos — аккумулятордан (AL немесеАХ регистрлерінен) жолдыњ элементін жазу.
Жолдарды деу командалары программаа операндтарды айќын т‰рде кµрсетусіз енгізілсе де, єрбір команда шындыѓында екі операндты ќолданады. seas жне stos командалары ‰шін операнд-бастама ретінде аккумулятор ќызмет етеді, ал операнд-ќабылдаѓыш жадыда болады. Lods командасы шін керісінше, операнд-бастама жадыда саталады, ал абылдаѓыш ретінде аккумулятор ќызмет атарады. movs жне cmps командалары ‰шін кµз де, ќабылдаѓыш та жадыда болады.
Ќарастырылатын командалар ртрлі єрекеттерді орындаѓанда бірдей ережелерге баѓынады: жадыдаѓы операндтар єрќашан бір т‰рде адрестеледі: операнд-бастама DS:SI-регистрлері арќылы, ал операнд-ќабылдаѓыш ES:DI-регистрлері арќылы. Бір рет орындалѓан кезде командалар тек ќана бір элементті µњдейді, ал жолды µњдеу ‰шін командалар ќайталау префикстерін ќолданады. Жолды µњдеу кезінде SI жне DI регистрлері, келесі элементтердіњ адрестелуін ќамтамасыз етіп алѓа ќарай (егер df=0) немесе артќа ќарай (егер df=1) бір жолѓа автоматты т‰рде ыѓысады. Єрбір команданыњ байттармен немесе сµздермен (мысалы, movsb жєне movsw) ж±мыс істейтін модификациялары бар.
Осылайша, жолды командаларды дрыс орындалуы шін алдын ала DS:SI жне ES:DI регистрлерін реттеу, DF жалауын орнату немесе тастау, СХ-ке µњделетін жолдыњ ±зындыѓын ж‰ктеу, ал seas жне stos командалары шін операнд-бастаманы АХ регистріне (немесе байттармен ж±мыс істеген кезде AL-ге) орналастыру ќажет.
Кейде операцияны зі, осы барлы икемдеулерден кейін, єдетте тіпті операндтары жоќ бір командамен орындалады, дегенмен де онда ќайталау префиксі болуы м‰мкін.
Ќарастырылѓан командалармен µњделетін жолдардыњ жадыныњ кез келген жерінде: программаныњ мєліметтер µрісінде, мєліметтердіњ ж‰йелік облыстарында, т±раќты саќтау ќ±рылѓысында, бейнебуферде болулары м‰мкіндігін атап айтуѓа болады. Мысалы, movs командасыны кмегімен мєліметтер массивін бір массивтік айнымалыдан екіншісіне, сондай аќ тексті терминал экранына тасымалдауѓа болады.
Мысал. BIOS-таѓы т±раќты саќтау ќ±рылѓысынан оныњ шыѓарылѓан к‰нін оќу.
; программалы сегментте
main proc
mov AX, 0F000h ;DS-ке BIOS-таѓы т±раќты саќтау
mov DS, AX ; ќ±рылѓысыныњ сегменттік адресін келеміз
mov SI, 0FFF5h ; бізді ызытыратын ріске кшу
mov AX, data ; ES-ті программаны мліметтер сегментіне
mov ES, AX ; икемдейміз
mov DI,offset bios ;Мерзімді сатау шін ріске ыысу
mov CX, 8 ; 8 байтты кшіру
cld ; жол бойымен ала арай озалу
rep movsb ; байттарды тасымалдау
;Алан апаратты экрана шыару
mov AX, data ;программаны мліметтер сегментіне
mov DS, AX ; DS –ті икемдеу
mov АН, 40h ;Шыару функциясы
mov BX, 1 ;Экранны дескрипторы
mov СХ, 8 ;8 байтты шыару
mov DX,offset bios ;жола ыысу
int 2Ih ; DOS-ты шаыру
; Мліметтер сегментінде
bios db 8 dup(') ;Мерзімді сатайтын ріс
loopкомандасыны жмыс істеу алгоритмін сипаттаыз
Циклдар программаны кейбір бµліктерін кµп рет орындауа ммкіндік береді. 86 микропроцессорыныњ командалар жйесінде циклдар loop командасыны кмегімен жзеге асады. Циклда адамны саны СХ регистрі арылы аныталады. Іске асу кезінде loop командасы басында процессорды СХ регистрін 1-ге азайтады, одан кейін алынан санды 0-мен салыстырады. Егер СХ>0 болса, онда крсетілген белгіге кµшу орындалады. Егер СХ=0 болса, онда цикл ажыратылады да, процессор loop командасынан кейінгі командаѓа кшеді. Сондытан циклдан ќалыпты шыаннан кейін СХ ыли да 0-ге те болады. Командалы кодта кшу нктесіне ыѓысуѓа 1 байт ана блінеді. Ыѓысу белгісі бар шама болуы ќажет болѓандыќтан, loop командасымен басаруды беруге болатын ењ ‰лкен ара ќашыќтыќ –128-ден +127-ге дейінгі байтты ќ±райды, осылайша циклдыњ денесі 128 байтпен шектеледі.
Билет.1-сра.