Intel 8086 3
This presentation is the property of its rightful owner.
Sponsored Links
1 / 68

Архитектура и програмирање микропроцесора Intel 8086 ( 3 ) PowerPoint PPT Presentation


  • 46 Views
  • Uploaded on
  • Presentation posted in: General

Архитектура и програмирање микропроцесора Intel 8086 ( 3 ). Инструкције за померање и ротирање У/И инструкције Инструкције гранања Инструкције за рад са стринговима Декларација процедура Декларација сегмената. Инструкције за померање и ротирање.

Download Presentation

Архитектура и програмирање микропроцесора Intel 8086 ( 3 )

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Intel 8086 3

Архитектура и програмирање микропроцесора Intel 8086 (3)

Инструкције за померање и ротирање

У/И инструкције

Инструкције гранања

Инструкције за рад са стринговима

Декларација процедура

Декларација сегмената


Intel 8086 3

Инструкције за померање и ротирање

  • Инструкције за померање су shl/shr, shr и sar.

    shl/sal/shr/sarreg,1

    shl/sal/shr/sarmem,1

    shl/sal/shr/sarreg,cl

    shl/sal/shr/sarmem,cl

  • Одредишни операнд је онај чији се садржај помера (8-, 16- или 32-битни) док се изворним операндом специфи-цира број померања.


Intel 8086 3

Сл. 1. Ефекат инструкција shl и sal.

Инструкције за померање и ротирање

  • Ако је број померања 0 нема утицаја на маркере.

  • CF ће садржати MS бит који је последњи “испао” приликом померања.

  • OF је 1 ако се два MS бита разликују приликом једноструког померања, а ако број померања није 1 недефинисан је.


Intel 8086 3

Инструкције за померање и ротирање

  • ZF и SF се постављају на основу резултата померања.

  • PF ће садржати 1 ако је паран број јединица у нижем бајту резултата.

  • AF је увек недефинисан.


Intel 8086 3

Сл. 2. Ефекат инструкције sar.

Инструкције за померање и ротирање

  • Ако је број померања 0 нема утицаја на маркере.

  • CF ће садржати LS бит који је последњи “испао” приликом померања.

  • OF је 0 ако је број померања 1, а иначе је недефинисан.

  • ZF и SF се постављају на основу резултата померања.

  • PF ће садржати 1 ако је паран број јединица у нижем бајту резултата.

  • AF је увек недефинисан.


Intel 8086 3

Сл. 3. Ефекат инструкције shr.

Инструкције за померање и ротирање

  • Ако је број померања 0 нема утицаја на маркере.

  • CF ће садржати LS бит који је последњи “испао” приликом померања.

  • Aко је број померања 1, OF је једнак биту знака пре померања, а иначе је недефинисан.

  • ZF и SF се постављају на основу резултата померања.

  • PF ће садржати 1 ако је паран број јединица у нижем бајту резултата.

  • AF је увек недефинисан.


Intel 8086 3

Сл. 4. Ефекат инструкције rcl.

Инструкције за померање и ротирање

  • Инструкције за ротирање rcl, rxr, rol и ror имају исту синтаксу као и оне за померање.


Intel 8086 3

Инструкције за померање и ротирање

  • После ове инструкције CF садржи последњи MS бит.

  • Ако је број померања 1 OF се поставља ако се промени знак услед ротације а иначе је недефинисан.

  • Ова инструкција не утиче на ZF, SF, PF и AF.


Intel 8086 3

Сл. 5. Ефекат инструкције rcr.

Инструкције за померање и ротирање

  • Утицај на маркере је аналоган претходној инструкцији.


Intel 8086 3

Сл. 6. Ефекат инструкција rol и ror.

Инструкције за померање и ротирање

  • Утицај на маркере код rol идентичан је као код rcl, односно утицај ror је као код rcr.


Intel 8086 3

Инструкције за померање и ротирање

  • Уз инструкције које манипулишу битовима (логичке, померања, ...) поменимо и инструкцију test.

    testreg,reg

    testreg,mem

    testmem,reg

    testreg,imm

    testmem,imm

  • Ова инструкција обавља AND операцију над битовима својих операнада не смештајући резултат нигде али постављајући одговарајуће вредности маркера.


Intel 8086 3

У/И инструкције

  • 8086 подржава две У/И инструкције:

    inax/al,port

    inax/al,dx

    outport,ax/al

    outdx,ax/al

  • Port је вредност између 0 и 255.


Intel 8086 3

Инструкције гранања

  • Инструкција безусловног скока је

    jmp disp8;direktno intrasegmentno

    jmp disp16;direktno intrasegmentno

    jmp disp32;direktno intersegmentno

    jmp mem16;indirektno intrasegmentno

    jmp reg16;registarsko indirektno ;intrasegmentno

    jmp mem32;indirektno intersegmentno


Intel 8086 3

Инструкције гранања

  • Интрасегментни скок је типа nearдок је интерсегментни скок типа far.

  • Код прва два интрасегментна скока вредност размештаја се додаје регистру IP.

  • Разлика је само у опсегу вредности и што се код 8-битног размештаја најпре врши његово знаковно проширење.


Intel 8086 3

Инструкције гранања

  • Директни интерсегментни скок обавља се тако што се 32-битна адреса уписује у пар CS:IP.

  • Обично се уместо размештаја код ова три типа скока користе лабеле:

    movdx,378h

    LoopForever:inal,dx

    xoral,1

    outdx,al

    jmpLoopForever


Intel 8086 3

Инструкције гранања

  • Индиректни типови скокова одвијају се тако што је циљна адреса у некој локацији чија се адреса наводи, или је у регистру.


Intel 8086 3

Инструкције гранања

  • Међу инструкције гранања убрајамо и:

    • инструкцију за позив потпрограма call и

    • инструкцију за повратак из потпрограма ret.

      Зашто?

      call disp16;direktno intrasegmentno

      call adrs32;direktno intersegmentno

      call mem16;indirektno intrasegmentno

      call reg16;indirektno intrasegmentno

      call mem32;indirektno intersegmentno


Intel 8086 3

Инструкције гранања

  • Инструкција call типа far ради следеће:

    • Шаље садржај регистра CS у магацин.

    • Шаље 16-битни офсет инструкције која следи иза позива у магацин.

    • Копира 32-битну ефективну адресу потпрог-рама у пар CS:IP.

    • Извршење се наставља од прве инструкције потпрограма.


Intel 8086 3

Инструкције гранања

  • Инструкција call типа near ради следеће:

    • Шаље 16-битни офсет инструкције која следи иза позива у магацин.

    • Копира 16-битну ефективну адресу потпрог-рама у регистар IP.

    • Извршење се наставља од прве инструкције потпрограма.


Intel 8086 3

Инструкције гранања

  • Инструкција 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


Intel 8086 3

Инструкције гранања

  • Повратак се остварује читањем адресе повратка из магацина.

  • Повратак типа near чита 16-битну адресу из магацина и уписује је у регистар IP.

  • Повратак типа farчита 16-битни офсет и уписује га у IP а потом и 16-битну адресу сегмента коју уписује у CS.

  • Не треба мешати позиве и повратке near и far типа!


Intel 8086 3

Инструкције гранања

  • Инструкцјије условног гранања у себи садрже услов на основу кога се врши гранање, уколико је он испуњен.

  • Ове инструкције тестирају један или више маркера са циљем да утврде да ли је услов задовољен.


Intel 8086 3

Инструкције гранања

Табела 1. Jcc инструкције које тестирају маркере.


Intel 8086 3

Инструкције гранања

Табела 2. Jcc инструкције за неозначено поређење.


Intel 8086 3

Инструкције гранања

Табела 3. Jcc инструкције за означено поређење.


Intel 8086 3

Инструкције гранања

  • Код процесора 8086 (па све до 80386) инструкције условног гранања су обима 2 бајта, где је други бајт размештај.

  • Ово пружа могућност скока у опсегу од 128 бајтова.

  • Да би превазлишли ово ограничење треба употребити следећи “трик”:

    • Употребити облик са супротним условом.

    • Таква инструкција треба да прескочи инструкцију безусловног скока на оригиналну циљну адресу.


Intel 8086 3

Инструкције гранања

  • Примера ради, ако имамо инструкцију

    jctarget

    можемо је конвертовати у дужи облик помоћу следеће секвенце:

    jncSkipJmp

    jmptarget


Intel 8086 3

Инструкције гранања

  • Инструкција JCXZ (jump if CX is zero) врши гранање на циљну адресу ако регистар CX садржи нулу.

  • Ова инструкција не утиче на маркере.

  • Инструкција LOOP декрементира реги-стар CX и врши гранање на циљну адресу ако CX не садржи нулу.

  • Ова инструкција такође не утиче на маркере.


Intel 8086 3

Инструкције гранања

  • Инструкција LOOPЕ/LOOPZ врши гранање на циљну адресу ако CX не садржи нулу a ZF=1.

  • Инструкција LOOPNЕ/LOOPNZ врши гранање на циљну адресу ако CX не садржи нулу a ZF=0.

  • Обе инструкције не утичу на маркере.


Intel 8086 3

Инструкције за рад са стринговима

  • 8086 подржава 10 инструкција за рад са стринговима:

    • movs

    • loads

    • stos

    • scas

    • cmps

    • rep

    • repe

    • repz

    • repnz

    • repne


Intel 8086 3

Инструкције за рад са стринговима

  • Овим инструкцијама може се манипулисати појединим елементима низова или се обрађују читави низови.

  • Обим операнада (елемената низова) је бајт или реч а специфицирање тог обима се једноставно обавља дода-вањем суфикса bили w на крају мнемоника.


Intel 8086 3

Инструкције за рад са стринговима

  • Инструкције movsиcmps подразумевају да ES:DI садржи сегментну адресу одредишног низа.

  • Инструкција lods подразумева да DS:SI указује на изворни низ док је акумулатор одредиште.

  • Инструкције scasи stos подразумевају да ES:DI указује на одредишни низ а изворни операнд је у акумулатору.


Intel 8086 3

Инструкције за рад са стринговима

  • Инструкција movsкопира један елемент низа (обима бајт или реч) из мемеоријске локације чија је адреса DS:SI у локацију са адресом у ES:DI.

  • По копирању се регистри SI и DI инкрементирају за 1 или 2, уколико је DF обрисан; у супротном се ови регистри декрементирају за исти износ.


Intel 8086 3

Инструкције за рад са стринговима

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у зависности од обима елемента низа.


Intel 8086 3

Инструкције за рад са стринговима

  • Инструкција 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;


Intel 8086 3

Инструкције за рад са стринговима

  • Инструкција 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;


Intel 8086 3

Инструкције за рад са стринговима

  • Инструкција 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;


Intel 8086 3

Инструкције за рад са стринговима

  • Инструкција 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;


Intel 8086 3

Инструкције за рад са стринговима

  • Саме по себи наведене инструкције не могу да обраде читав низ.

  • Њиховим комбиновањем са rep, repz, repe, repnzи repne префиксима постиже се примена одговарајуће операције на читав низ.


Intel 8086 3

Инструкције за рад са стринговима

  • Ово комбиновање се врши на следећи начин:

    • За MOVS:

      repmovs

    • За CMPS:

      repecmps

      repzcmps

      repnecmps

      repnzcmps

    • За SCAS:

      repescas

      repzscas

      repnescas

      repnzscas

    • За STOS:

      repstos


Intel 8086 3

Инструкције за рад са стринговима

  • Ови префикси се обично не користе уз lods.

  • Значење префикса је да се инструкција понавља CX пута (у случају cmpsнајвишеCX пута).

  • Уз то, потребно је да важи и услов уграђен у сам префикс (z/e или nz/ne)


Intel 8086 3

Декларација процедура

  • За разлику од HLL-ова, нема стриктних правила о томе шта чини процедуру (овде у значењу било које врсте потпрограма).

  • Могуће је позвати процедуру са било које адресе у меоморији а прва ret инструкција на коју се наиђе извршиће повратак.

  • Међутим, коришћење ове чињенице често доводи до нечитког програма!


Intel 8086 3

Декларација процедура

  • Стога су обезбеђени механизми за декларисање процедура.

  • Оснoвни механизам за декларацију процедура је:

    imeprocproc{NEAR ili FAR}

    <iskazi koji cine proceduru>

    imeprocendp


Intel 8086 3

Декларација процедура

  • Уколико се у процедури не наиђе на ниједну ret инструкцију наставља се са следећом која следи иза endp!


Intel 8086 3

Декларација сегмената

  • Сви програми се састоје од једног или више сегмената.

  • У току извршења програма сегментни регистри указују на адресе одређених сегмената којих може бити највише 4.

  • Сегменти се дефинишу исказом

    imesegsegment {operandi}

    <iskazi>

    imesegends


Intel 8086 3

Декларација сегмената

  • Имена сегмената траба да буду јединствена.

  • Ако постоји још неки сегмент са истим именом онда се он сматра наставком претходног.

  • Када се декларише нови сегмент асемблер креира нови локациони бројач за тај сегмент са нултом иницијалном вредошћу.

  • Ако је сегмент наставак неког претходног онда се користи крајња вредност локационог бројача претходног сегмента.


Intel 8086 3

Декларација сегмената

CSEGsegment

movax,bx

ret

CSEGends

DSEGsegment

Item1byte0

Item2word0

DSEGends

CSEGsegment

movax,10

addax,Item1

ret

CSEGends

end


Intel 8086 3

Декларација сегмената

  • Када год наиђе на име сегмента, асемблер га замењује непосредном вредношћу која представља његову адресу.

  • Како није могуће напунити сегментни регистар непосредном вредношћу, то морамо да урадимо у више корака:

    movax,dseg

    movds,ax

    moves,ax


Intel 8086 3

Декларација сегмената

  • Сегменти се пуне у меморију у оном редоследу у коме се наводе у изворној датотеци.

  • У пређашњем примеру читав сегмент CSEG пуни се у меморију пре DSEG.

  • Коришћењем директиве .alpha нала-жемо пуњење сегмената у алфабетском поретку њихових имена уместо у редоследу појављивања.


Intel 8086 3

Декларација сегмената

  • Постоји 6 врста сегментних операнада.

    {READONLY}{align}{combine}{use}{‘class’}

  • Align се односи на тип поравнања сегмената.

  • Овај параметар узима једну од следећих вредности: byte, word, dword, para или page.

  • Сегменти ће се поравнавати на основу овог параметра. Како је параметар опциони подразумевана вредност је para (значи параграф – 16 бајтова).


Intel 8086 3

Декларација сегмената

seg1segment

seg1ends

seg2segmentbyte

seg2ends


Intel 8086 3

Декларација сегмената

seg1segment

seg1ends

seg2segmentword

seg2ends


Intel 8086 3

Декларација сегмената

seg1segment

seg1ends

seg2segmentdword

seg2ends


Intel 8086 3

Декларација сегмената

seg1segment

seg1ends

seg2segmentpara

seg2ends


Intel 8086 3

Декларација сегмената

  • Поравнање по параграфима је подразумевано и у већини случајева га треба користити уколико нема неког доброг разлога да буде другачије.

  • Најзад, могуће је користити поравнање по странама (256 бајтова) што је корисно у случају да имамо бафере података који захтевају простор који је умножак од 256B.


Intel 8086 3

Декларација сегмената

seg1segment

seg1ends

seg2segmentpage

seg2ends


Intel 8086 3

Декларација сегмената

  • Ако се изабере било које поравнање осим бајтовског, преводилац убацује потребан број бајтова како би се обавило тражено поравнање.

  • Сегментни регистри увек морају да показују на адресу параграфа.

  • Како онда процесор врши адресирање сегмената са различитим поравнањем?


Intel 8086 3

Декларација сегмената

  • Преводилац у том случају претпоставља да сегмент почиње од адресе претходног параграфа, али је вредност локационог бројача постављена на неки ненулти офсет.


Intel 8086 3

Декларација сегмената

  • Тип combine управља начином уписивања сегмената са истим именом у објектни фајл.

  • Могуће је специфицирати public, stack, common, memoryили at.

  • Мemory је синоним за public и постоји ради компатибилности па увек треба користити public.


Intel 8086 3

Декларација сегмената

  • Public иstack у основи раде исту ствар: врше конкатенацију сегмената са истим именом у један непрекидни сегмент.

  • Разлика је у начину иницијализације сегментног регистра магацина и регистарапоказивача магацина.

  • У принципу, сваки програм треба да има један сегмент типа stackдок остали треба да буду public.


Intel 8086 3

Декларација сегмената

  • Уколико се не специфицира combineтип преводилац неће вршити конкатенацију сегмената и тада је ефекат исти као да смо употребили тип private.

  • Примера ради, следеће две секвенце имају исти ефекат.


Intel 8086 3

Декларација сегмената

CSEGsegmentpublic

movax,0

movVAR1,ax

CSEGends

DSEGsegmentpublic

Iword?

DSEGends

CSEGsegmentpublic

movbx,ax

ret

CSEGends

DSEGsegmentpublic

Jword?

DSEGends

end


Intel 8086 3

Декларација сегмената

CSEGsegmentpublic

movax,0

movVAR1,ax

movbx,ax

ret

CSEGends

DSEGsegmentpublic

Iword?

Jword?

DSEGends

end


Intel 8086 3

Декларација сегмената

  • Тип class специфицира редослед сегемената који немају исто име.

  • Могуће вредности су:

    • ‘CODE’(за сегменте који садрже програмски код),

    • ‘DATA’(за сегменте који садрже податке) и

    • ‘STACK’(за сегменте који садрже магацин).


Intel 8086 3

Декларација сегмената

  • У општем случају, сегмент података представља сегмент података само ако регистар DS указује на њега.

  • Како асемблер зна који сегмент зашта служи, нарочито ако знамо да се садржај сегментних регистара може мењати динамички?

  • Директива assume пружа ове информације асемблеру.


Intel 8086 3

Декларација сегмената

assume {CS:seg}{DS:seg}{ES:seg}{SS:seg}

  • Бар један операнд мора да буде специфициран.

  • segје име сегмента или резервисана реч nothing.

  • Ако има више операнада они се одвајају зарезима.

    assumeDS:DSEG

    assumeCS:CSEG,DS:DSEG,ES:DSEG,SS:SSEG

    assumeCS:CSEG,DS:NOTHING


Intel 8086 3

Декларација сегмената

  • Ова директива не модификује садржај сегментних регистара, већ само казује асемблеру да претпостави да сегментни регистри указују на одређене сегменте.


Intel 8086 3

Декларација сегмената

DSEG1segmentpara public ‘DATA’

var1word?

DSEG1ends

DSEG2segmentpara public ‘DATA’

var2word?

DSEG2ends

CSEGsegmentparapublic ‘CODE’

assumeCS:CSEG,DS:DSEG1,ES:DSEG2

movax,seg DSEG1

movds,ax

movax,seg DSEG2

moves,ax

movvar1,0

movvar2,0

assumeDS:DSEG2

movax,seg DSEG2

movds,ax

movvar2,0

CSEGends

end


  • Login