intel 8086 3
Download
Skip this Video
Download Presentation
Архитектура и програмирање микропроцесора Intel 8086 ( 3 )

Loading in 2 Seconds...

play fullscreen
1 / 68

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


  • 77 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Архитектура и програмирање микропроцесора Intel 8086 ( 3 )' - ariel-tucker


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)

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

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

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

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

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

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

slide2
Инструкције за померање и ротирање
  • Инструкције за померање су shl/shr, 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-битни) док се изворним операндом специфи-цира број померања.
slide3

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

Инструкције за померање и ротирање
  • Ако је број померања 0 нема утицаја на маркере.
  • CF ће садржати MS бит који је последњи “испао” приликом померања.
  • OF је 1 ако се два MS бита разликују приликом једноструког померања, а ако број померања није 1 недефинисан је.
slide4
Инструкције за померање и ротирање
  • ZF и SF се постављају на основу резултата померања.
  • PF ће садржати 1 ако је паран број јединица у нижем бајту резултата.
  • AF је увек недефинисан.
slide5

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

Инструкције за померање и ротирање
  • Ако је број померања 0 нема утицаја на маркере.
  • CF ће садржати LS бит који је последњи “испао” приликом померања.
  • OF је 0 ако је број померања 1, а иначе је недефинисан.
  • ZF и SF се постављају на основу резултата померања.
  • PF ће садржати 1 ако је паран број јединица у нижем бајту резултата.
  • AF је увек недефинисан.
slide6

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

Инструкције за померање и ротирање
  • Ако је број померања 0 нема утицаја на маркере.
  • CF ће садржати LS бит који је последњи “испао” приликом померања.
  • Aко је број померања 1, OF је једнак биту знака пре померања, а иначе је недефинисан.
  • ZF и SF се постављају на основу резултата померања.
  • PF ће садржати 1 ако је паран број јединица у нижем бајту резултата.
  • AF је увек недефинисан.
slide7

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

Инструкције за померање и ротирање
  • Инструкције за ротирање rcl, rxr, rol и ror имају исту синтаксу као и оне за померање.
slide8
Инструкције за померање и ротирање
  • После ове инструкције CF садржи последњи MS бит.
  • Ако је број померања 1 OF се поставља ако се промени знак услед ротације а иначе је недефинисан.
  • Ова инструкција не утиче на ZF, SF, PF и AF.
slide9

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

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

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

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

test reg,reg

test reg,mem

test mem,reg

test reg,imm

test mem,imm

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

in ax/al,port

in ax/al,dx

out port,ax/al

out dx,ax/al

  • Port је вредност између 0 и 255.
slide13
Инструкције гранања
  • Инструкција безусловног скока је

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

slide14
Инструкције гранања
  • Интрасегментни скок је типа nearдок је интерсегментни скок типа far.
  • Код прва два интрасегментна скока вредност размештаја се додаје регистру IP.
  • Разлика је само у опсегу вредности и што се код 8-битног размештаја најпре врши његово знаковно проширење.
slide15
Инструкције гранања
  • Директни интерсегментни скок обавља се тако што се 32-битна адреса уписује у пар CS:IP.
  • Обично се уместо размештаја код ова три типа скока користе лабеле:

mov dx,378h

LoopForever: in al,dx

xor al,1

out dx,al

jmp LoopForever

slide16
Инструкције гранања
  • Индиректни типови скокова одвијају се тако што је циљна адреса у некој локацији чија се адреса наводи, или је у регистру.
slide17
Инструкције гранања
  • Међу инструкције гранања убрајамо и:
    • инструкцију за позив потпрограма call и
    • инструкцију за повратак из потпрограма ret.

Зашто?

call disp16 ;direktno intrasegmentno

call adrs32 ;direktno intersegmentno

call mem16 ;indirektno intrasegmentno

call reg16 ;indirektno intrasegmentno

call mem32 ;indirektno intersegmentno

slide18
Инструкције гранања
  • Инструкција call типа far ради следеће:
    • Шаље садржај регистра CS у магацин.
    • Шаље 16-битни офсет инструкције која следи иза позива у магацин.
    • Копира 32-битну ефективну адресу потпрог-рама у пар CS:IP.
    • Извршење се наставља од прве инструкције потпрограма.
slide19
Инструкције гранања
  • Инструкција call типа near ради следеће:
    • Шаље 16-битни офсет инструкције која следи иза позива у магацин.
    • Копира 16-битну ефективну адресу потпрог-рама у регистар IP.
    • Извршење се наставља од прве инструкције потпрограма.
slide20
Инструкције гранања
  • Инструкција 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

slide21
Инструкције гранања
  • Повратак се остварује читањем адресе повратка из магацина.
  • Повратак типа near чита 16-битну адресу из магацина и уписује је у регистар IP.
  • Повратак типа farчита 16-битни офсет и уписује га у IP а потом и 16-битну адресу сегмента коју уписује у CS.
  • Не треба мешати позиве и повратке near и far типа!
slide22
Инструкције гранања
  • Инструкцјије условног гранања у себи садрже услов на основу кога се врши гранање, уколико је он испуњен.
  • Ове инструкције тестирају један или више маркера са циљем да утврде да ли је услов задовољен.
slide23
Инструкције гранања

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

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

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

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

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

slide26
Инструкције гранања
  • Код процесора 8086 (па све до 80386) инструкције условног гранања су обима 2 бајта, где је други бајт размештај.
  • Ово пружа могућност скока у опсегу од 128 бајтова.
  • Да би превазлишли ово ограничење треба употребити следећи “трик”:
    • Употребити облик са супротним условом.
    • Таква инструкција треба да прескочи инструкцију безусловног скока на оригиналну циљну адресу.
slide27
Инструкције гранања
  • Примера ради, ако имамо инструкцију

jc target

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

jnc SkipJmp

jmp target

slide28
Инструкције гранања
  • Инструкција JCXZ (jump if CX is zero) врши гранање на циљну адресу ако регистар CX садржи нулу.
  • Ова инструкција не утиче на маркере.
  • Инструкција LOOP декрементира реги-стар CX и врши гранање на циљну адресу ако CX не садржи нулу.
  • Ова инструкција такође не утиче на маркере.
slide29
Инструкције гранања
  • Инструкција LOOPЕ/LOOPZ врши гранање на циљну адресу ако CX не садржи нулу a ZF=1.
  • Инструкција LOOPNЕ/LOOPNZ врши гранање на циљну адресу ако CX не садржи нулу a ZF=0.
  • Обе инструкције не утичу на маркере.
slide30
Инструкције за рад са стринговима
  • 8086 подржава 10 инструкција за рад са стринговима:
    • movs
    • loads
    • stos
    • scas
    • cmps
    • rep
    • repe
    • repz
    • repnz
    • repne
slide31
Инструкције за рад са стринговима
  • Овим инструкцијама може се манипулисати појединим елементима низова или се обрађују читави низови.
  • Обим операнада (елемената низова) је бајт или реч а специфицирање тог обима се једноставно обавља дода-вањем суфикса bили w на крају мнемоника.
slide32
Инструкције за рад са стринговима
  • Инструкције movsиcmps подразумевају да ES:DI садржи сегментну адресу одредишног низа.
  • Инструкција lods подразумева да DS:SI указује на изворни низ док је акумулатор одредиште.
  • Инструкције scasи stos подразумевају да ES:DI указује на одредишни низ а изворни операнд је у акумулатору.
slide33
Инструкције за рад са стринговима
  • Инструкција movsкопира један елемент низа (обима бајт или реч) из мемеоријске локације чија је адреса DS:SI у локацију са адресом у ES:DI.
  • По копирању се регистри SI и DI инкрементирају за 1 или 2, уколико је DF обрисан; у супротном се ови регистри декрементирају за исти износ.
slide34
Инструкције за рад са стринговима

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у зависности од обима елемента низа.
slide35
Инструкције за рад са стринговима
  • Инструкција 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;

slide36
Инструкције за рад са стринговима
  • Инструкција 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;

slide37
Инструкције за рад са стринговима
  • Инструкција 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;

slide38
Инструкције за рад са стринговима
  • Инструкција 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;

slide39
Инструкције за рад са стринговима
  • Саме по себи наведене инструкције не могу да обраде читав низ.
  • Њиховим комбиновањем са rep, repz, repe, repnzи repne префиксима постиже се примена одговарајуће операције на читав низ.
slide40
Инструкције за рад са стринговима
  • Ово комбиновање се врши на следећи начин:
    • За MOVS:

repmovs

    • За CMPS:

repecmps

repzcmps

repnecmps

repnzcmps

    • За SCAS:

repescas

repzscas

repnescas

repnzscas

    • За STOS:

repstos

slide41
Инструкције за рад са стринговима
  • Ови префикси се обично не користе уз lods.
  • Значење префикса је да се инструкција понавља CX пута (у случају cmpsнајвишеCX пута).
  • Уз то, потребно је да важи и услов уграђен у сам префикс (z/e или nz/ne)
slide42
Декларација процедура
  • За разлику од HLL-ова, нема стриктних правила о томе шта чини процедуру (овде у значењу било које врсте потпрограма).
  • Могуће је позвати процедуру са било које адресе у меоморији а прва ret инструкција на коју се наиђе извршиће повратак.
  • Међутим, коришћење ове чињенице често доводи до нечитког програма!
slide43
Декларација процедура
  • Стога су обезбеђени механизми за декларисање процедура.
  • Оснoвни механизам за декларацију процедура је:

imeproc proc {NEAR ili FAR}

<iskazi koji cine proceduru>

imeproc endp

slide44
Декларација процедура
  • Уколико се у процедури не наиђе на ниједну ret инструкцију наставља се са следећом која следи иза endp!
slide45
Декларација сегмената
  • Сви програми се састоје од једног или више сегмената.
  • У току извршења програма сегментни регистри указују на адресе одређених сегмената којих може бити највише 4.
  • Сегменти се дефинишу исказом

imeseg segment {operandi}

<iskazi>

imeseg ends

slide46
Декларација сегмената
  • Имена сегмената траба да буду јединствена.
  • Ако постоји још неки сегмент са истим именом онда се он сматра наставком претходног.
  • Када се декларише нови сегмент асемблер креира нови локациони бројач за тај сегмент са нултом иницијалном вредошћу.
  • Ако је сегмент наставак неког претходног онда се користи крајња вредност локационог бројача претходног сегмента.
slide47
Декларација сегмената

CSEG segment

mov ax,bx

ret

CSEG ends

DSEG segment

Item1 byte 0

Item2 word 0

DSEG ends

CSEG segment

mov ax,10

add ax,Item1

ret

CSEG ends

end

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

mov ax,dseg

mov ds,ax

mov es,ax

slide49
Декларација сегмената
  • Сегменти се пуне у меморију у оном редоследу у коме се наводе у изворној датотеци.
  • У пређашњем примеру читав сегмент CSEG пуни се у меморију пре DSEG.
  • Коришћењем директиве .alpha нала-жемо пуњење сегмената у алфабетском поретку њихових имена уместо у редоследу појављивања.
slide50
Декларација сегмената
  • Постоји 6 врста сегментних операнада.

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

  • Align се односи на тип поравнања сегмената.
  • Овај параметар узима једну од следећих вредности: byte, word, dword, para или page.
  • Сегменти ће се поравнавати на основу овог параметра. Како је параметар опциони подразумевана вредност је para (значи параграф – 16 бајтова).
slide51
Декларација сегмената

seg1 segment

seg1 ends

seg2 segment byte

seg2 ends

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

seg1 segment

seg1 ends

seg2 segment word

seg2 ends

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

seg1 segment

seg1 ends

seg2 segment dword

seg2 ends

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

seg1 segment

seg1 ends

seg2 segment para

seg2 ends

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

seg1 segment

seg1 ends

seg2 segment page

seg2 ends

slide57
Декларација сегмената
  • Ако се изабере било које поравнање осим бајтовског, преводилац убацује потребан број бајтова како би се обавило тражено поравнање.
  • Сегментни регистри увек морају да показују на адресу параграфа.
  • Како онда процесор врши адресирање сегмената са различитим поравнањем?
slide58
Декларација сегмената
  • Преводилац у том случају претпоставља да сегмент почиње од адресе претходног параграфа, али је вредност локационог бројача постављена на неки ненулти офсет.
slide59
Декларација сегмената
  • Тип combine управља начином уписивања сегмената са истим именом у објектни фајл.
  • Могуће је специфицирати public, stack, common, memoryили at.
  • Мemory је синоним за public и постоји ради компатибилности па увек треба користити public.
slide60
Декларација сегмената
  • Public иstack у основи раде исту ствар: врше конкатенацију сегмената са истим именом у један непрекидни сегмент.
  • Разлика је у начину иницијализације сегментног регистра магацина и регистарапоказивача магацина.
  • У принципу, сваки програм треба да има један сегмент типа stackдок остали треба да буду public.
slide61
Декларација сегмената
  • Уколико се не специфицира combineтип преводилац неће вршити конкатенацију сегмената и тада је ефекат исти као да смо употребили тип private.
  • Примера ради, следеће две секвенце имају исти ефекат.
slide62
Декларација сегмената

CSEG segment public

mov ax,0

mov VAR1,ax

CSEG ends

DSEG segment public

I word ?

DSEG ends

CSEG segment public

mov bx,ax

ret

CSEG ends

DSEG segment public

J word ?

DSEG ends

end

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

CSEG segment public

mov ax,0

mov VAR1,ax

mov bx,ax

ret

CSEG ends

DSEG segment public

I word ?

J word ?

DSEG ends

end

slide64
Декларација сегмената
  • Тип class специфицира редослед сегемената који немају исто име.
  • Могуће вредности су:
    • ‘CODE’(за сегменте који садрже програмски код),
    • ‘DATA’(за сегменте који садрже податке) и
    • ‘STACK’(за сегменте који садрже магацин).
slide65
Декларација сегмената
  • У општем случају, сегмент података представља сегмент података само ако регистар DS указује на њега.
  • Како асемблер зна који сегмент зашта служи, нарочито ако знамо да се садржај сегментних регистара може мењати динамички?
  • Директива assume пружа ове информације асемблеру.
slide66
Декларација сегмената

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

  • Бар један операнд мора да буде специфициран.
  • segје име сегмента или резервисана реч nothing.
  • Ако има више операнада они се одвајају зарезима.

assume DS:DSEG

assume CS:CSEG,DS:DSEG,ES:DSEG,SS:SSEG

assume CS:CSEG,DS:NOTHING

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

DSEG1 segment para public ‘DATA’

var1 word ?

DSEG1 ends

DSEG2 segment para public ‘DATA’

var2 word ?

DSEG2 ends

CSEG segment para public ‘CODE’

assume CS:CSEG,DS:DSEG1,ES:DSEG2

mov ax,seg DSEG1

mov ds,ax

mov ax,seg DSEG2

mov es,ax

mov var1,0

mov var2,0

assume DS:DSEG2

mov ax,seg DSEG2

mov ds,ax

mov var2,0

CSEG ends

end

ad