730 likes | 833 Views
Архитектура и програмирање микропроцесора Intel 8086 ( 3 ). Инструкције за померање и ротирање У/И инструкције Инструкције гранања Инструкције за рад са стринговима Декларација процедура Декларација сегмената. Инструкције за померање и ротирање.
E N D
Архитектура и програмирање микропроцесора Intel 8086 (3) Инструкције за померање и ротирање У/И инструкције Инструкције гранања Инструкције за рад са стринговима Декларација процедура Декларација сегмената
Инструкције за померање и ротирање • Инструкције за померање су shl/sаl, shr и sar. shl/sal/shr/sar reg,1 shl/sal/shr/sar mem,1 shl/sal/shr/sar reg,cl shl/sal/shr/sar mem,cl • Одредишни операнд је онај чији се садржај помера (8-, 16- или 32-битни) док се изворним операндом специфи-цира број померања.
Сл. 1. Ефекат инструкција shl и sal. Инструкције за померање и ротирање • Ако је број померања 0 нема утицаја на маркере. • CF ће садржати MS бит који је последњи “испао” приликом померања. • OF је 1 ако се два MS бита разликују приликом једноструког померања, а ако број померања није 1 недефинисан је.
Инструкције за померање и ротирање • ZF и SF се постављају на основу резултата померања. • PF ће садржати 1 ако је паран број јединица у нижем бајту резултата. • AF је увек недефинисан.
Сл. 2. Ефекат инструкције sar. Инструкције за померање и ротирање • Ако је број померања 0 нема утицаја на маркере. • CF ће садржати LS бит који је последњи “испао” приликом померања. • OF је 0 ако је број померања 1, а иначе је недефинисан. • ZF и SF се постављају на основу резултата померања. • PF ће садржати 1 ако је паран број јединица у нижем бајту резултата. • AF је увек недефинисан.
Сл. 3. Ефекат инструкције shr. Инструкције за померање и ротирање • Ако је број померања 0 нема утицаја на маркере. • CF ће садржати LS бит који је последњи “испао” приликом померања. • Aко је број померања 1, OF је једнак биту знака пре померања, а иначе је недефинисан. • ZF и SF се постављају на основу резултата померања. • PF ће садржати 1 ако је паран број јединица у нижем бајту резултата. • AF је увек недефинисан.
Сл. 4. Ефекат инструкције rcl. Инструкције за померање и ротирање • Инструкције за ротирање rcl, rxr, rol и ror имају исту синтаксу као и оне за померање.
Инструкције за померање и ротирање • После ове инструкције CF садржи последњи MS бит. • Ако је број померања 1 OF се поставља ако се промени знак услед ротације а иначе је недефинисан. • Ова инструкција не утиче на ZF, SF, PF и AF.
Сл. 5. Ефекат инструкције rcr. Инструкције за померање и ротирање • Утицај на маркере је аналоган претходној инструкцији.
Сл. 6. Ефекат инструкција rol и ror. Инструкције за померање и ротирање • Утицај на маркере код rol идентичан је као код rcl, односно утицај ror је као код rcr.
Инструкције за померање и ротирање • Уз инструкције које манипулишу битовима (логичке, померања, ...) поменимо и инструкцију test. test reg,reg test reg,mem test mem,reg test reg,imm test mem,imm
Инструкције за померање и ротирање • Ова инструкција обавља AND операцију над битовима својих операнада не смештајући резултат нигде али постављајући одговарајуће вредности маркера.
У/И инструкције • 8086 подржава две У/И инструкције: in ax/al,port in ax/al,dx out port,ax/al out dx,ax/al • Port је вредност између 0 и 255.
Инструкције гранања • Инструкција безусловног скока је jmp disp8 ;direktno intrasegmentno jmp disp16 ;direktno intrasegmentno jmp disp32 ;direktno intersegmentno jmpmem16 ;indirektno intrasegmentno jmp reg16 ;registarsko indirektno ;intrasegmentno jmp mem32 ;indirektno intersegmentno
Инструкције гранања • Интрасегментни скок је типа nearдок је интерсегментни скок типа far. • Код прва два интрасегментна скока вредност размештаја се додаје регистру IP. • Разлика је само у опсегу вредности и што се код 8-битног размештаја најпре врши његово знаковно проширење.
Инструкције гранања • Директни интерсегментни скок обавља се тако што се 32-битна адреса уписује у пар CS:IP. • Обично се уместо размештаја код ова три типа скока користе лабеле: mov dx,378h LoopForever: in al,dx xor al,1 out dx,al jmp LoopForever
Инструкције гранања • Индиректни типови скокова одвијају се тако што је циљна адреса у некој локацији чија се адреса наводи, или је у регистру.
Инструкције гранања • Међу инструкције гранања убрајамо и: • инструкцију за позив потпрограма call и • инструкцију за повратак из потпрограма ret. Зашто? call disp16 ;direktno intrasegmentno call adrs32 ;direktno intersegmentno call mem16 ;indirektno intrasegmentno call reg16 ;indirektno intrasegmentno call mem32 ;indirektno intersegmentno
Инструкције гранања • Инструкција call типа far ради следеће: • Шаље садржај регистра CS у магацин. • Шаље 16-битни офсет инструкције која следи иза позива у магацин. • Копира 32-битну ефективну адресу потпрог-рама у пар CS:IP. • Извршење се наставља од прве инструкције потпрограма.
Инструкције гранања • Инструкција call типа near ради следеће: • Шаље 16-битни офсет инструкције која следи иза позива у магацин. • Копира 16-битну ефективну адресу потпрог-рама у регистар IP. • Извршење се наставља од прве инструкције потпрограма.
Инструкције гранања • Инструкција ret врши повратак у позивајући програм: ret ;near ili far povratak retn ;near povratak retf;far povratak ret disp;near ili far povratak i pop retn disp;near povratak i pop retf disp;far povratak i pop
Инструкције гранања • Повратак се остварује читањем адресе повратка из магацина. • Повратак типа near чита 16-битну адресу из магацина и уписује је у регистар IP. • Повратак типа farчита 16-битни офсет и уписује га у IP а потом и 16-битну адресу сегмента коју уписује у CS. • Не треба мешати позиве и повратке near и far типа!
Инструкције гранања • Инструкције условног гранања у себи садрже услов на основу кога се врши гранање, уколико је он испуњен. • Ове инструкције тестирају један или више маркера са циљем да утврде да ли је услов задовољен.
Инструкције гранања Табела 1. Jcc инструкције које тестирају маркере.
Инструкције гранања Табела 2. Jcc инструкције за неозначено поређење.
Инструкције гранања Табела 3. Jcc инструкције за означено поређење.
Инструкције гранања • Код процесора 8086 (па све до 80386) инструкције условног гранања су обима 2 бајта, где је други бајт размештај. • Ово пружа могућност скока у опсегу од 128 бајтова. • Да би превазлишли ово ограничење треба употребити следећи “трик”: • Употребити облик са супротним условом. • Таква инструкција треба да прескочи инструкцију безусловног скока на оригиналну циљну адресу.
Инструкције гранања • Примера ради, ако имамо инструкцију jc target можемо је конвертовати у дужи облик помоћу следеће секвенце: jnc SkipJmp jmp target
Инструкције гранања • Инструкција JCXZ (jump if CX is zero) врши гранање на циљну адресу ако регистар CX садржи нулу. • Ова инструкција не утиче на маркере. • Инструкција LOOP декрементира реги-стар CX и врши гранање на циљну адресу ако CX не садржи нулу. • Ова инструкција такође не утиче на маркере.
Инструкције гранања • Инструкција LOOPЕ/LOOPZ врши гранање на циљну адресу ако CX не садржи нулу a ZF=1. • Инструкција LOOPNЕ/LOOPNZ врши гранање на циљну адресу ако CX не садржи нулу a ZF=0. • Обе инструкције не утичу на маркере.
Инструкције за рад са стринговима • 8086 подржава 10 инструкција за рад са стринговима: • movs • loads • stos • scas • cmps • rep • repe • repz • repnz • repne
Инструкције за рад са стринговима • Овим инструкцијама може се манипулисати појединим елементима низова или се обрађују читави низови. • Обим операнада (елемената низова) је бајт или реч а специфицирање тог обима се једноставно обавља дода-вањем суфикса bили w на крају мнемоника.
Инструкције за рад са стринговима • Инструкције movsиcmps подразумевају да ES:DI садржи сегментну адресу одредишног низа. • Инструкција lods подразумева да DS:SI указује на изворни низ док је акумулатор одредиште. • Инструкције scasи stos подразумевају да ES:DI указује на одредишни низ а изворни операнд је у акумулатору.
Инструкције за рад са стринговима • Инструкција movsкопира један елемент низа (обима бајт или реч) из мемеоријске локације чија је адреса DS:SI у локацију са адресом у ES:DI. • По копирању се регистри SI и DI инкрементирају за 1 или 2, уколико је DF обрисан; у супротном се ови регистри декрементирају за исти износ.
Инструкције за рад са стринговима movs{b,w}: es:[di]:=ds:[si] if DF=0 then si:=si+size; di:=di+size; else si:=si-size; di:=di-size; endif; • size=1 или 2у зависности од обима елемента низа.
Инструкције за рад са стринговима • Инструкција cmpsпореди бајт или реч на локацији DS:SI са оним на локацији ES:DI и на основу тога поставља маркере. • После поређења се регистри SI и DI инкрементирају или декрементирају за 1 или 2.
Инструкције за рад са стринговима cmps{b,w}: cmp ds:[si],es:[di] if DF=0 then si:=si+size; di:=di+size; else si:=si-size; di:=di-size; endif;
Инструкције за рад са стринговима • Инструкција lodsкопира бајт или реч на локацији DS:SI у акумулатор. • После копирања се регистaр SI инкрементира или декрементира за 1 или 2. lods{b,w}: ax/al:=ds:[si] if DF=0 then si:=si+size; else si:=si-size; endif;
Инструкције за рад са стринговима • Инструкција stosсмешта садржај акумулатора у локацију адресирану са ES:DI. • После копирања се регистaр DI инкрементира или декрементира за 1 или 2.
Инструкције за рад са стринговима stos{b,w}: es:[di]:=ax/al if DF=0 then di:=di+size; else di:=di-size; endif;
Инструкције за рад са стринговима • Инструкција scasпореди садржај акумулатора са вредношћу на локацији ES:DI ажурирајући потом DI. • Маркери сепостављају на исти начин као и код инструкциуја cmp и cmps. scas{b,w}: cmp ax/al,es:[di] if DF=0 then di:=di+size; else di:=di-size; endif;
Инструкције за рад са стринговима • Саме по себи наведене инструкције не могу да обраде читав низ. • Њиховим комбиновањем са rep, repz, repe, repnzи repne префиксима постиже се примена одговарајуће операције на читав низ.
Инструкције за рад са стринговима • Ово комбиновање се врши на следећи начин: • За MOVS: repmovs • За CMPS: repecmps repzcmps repnecmps repnzcmps
Инструкције за рад са стринговима • За SCAS: repescas repzscas repnescas repnzscas • За STOS: repstos
Инструкције за рад са стринговима • Ови префикси се обично не користе уз lods. • Значење префикса је да се инструкција понавља CX пута (у случају cmpsнајвишеCX пута). • Уз то, потребно је да важи и услов уграђен у сам префикс (z/e или nz/ne)
Декларација процедура • За разлику од HLL-ова, нема стриктних правила о томе шта чини процедуру (овде у значењу било које врсте потпрограма). • Могуће је позвати процедуру са било које адресе у меоморији а прва ret инструкција на коју се наиђе извршиће повратак. • Међутим, коришћење ове чињенице често доводи до нечитког програма!
Декларација процедура • Стога су обезбеђени механизми за декларисање процедура. • Оснoвни механизам за декларацију процедура је: imeproc proc {NEAR ili FAR} <iskazi koji cine proceduru> imeproc endp
Декларација процедура • Уколико се у процедури не наиђе на ниједну ret инструкцију наставља се са следећом која следи иза endp!
Декларација сегмената • Сви програми се састоје од једног или више сегмената. • У току извршења програма сегментни регистри указују на адресе одређених сегмената којих може бити највише 4. • Сегменти се дефинишу исказом imeseg segment {operandi} <iskazi> imeseg ends
Декларација сегмената • Имена сегмената траба да буду јединствена. • Ако постоји још неки сегмент са истим именом онда се он сматра наставком претходног.