Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "Архитектура и програмирање микропроцесора Intel 8086 (3)"— Presentation transcript:

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

2 Инструкције за померање и ротирање
Инструкције за померање су 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-битни) док се изворним операндом специфи-цира број померања.

3 Инструкције за померање и ротирање
Сл. 1. Ефекат инструкција shl и sal. Ако је број померања 0 нема утицаја на маркере. CF ће садржати MS бит који је последњи “испао” приликом померања. OF је 1 ако се два MS бита разликују приликом једноструког померања, а ако број померања није 1 недефинисан је.

4 Инструкције за померање и ротирање
ZF и SF се постављају на основу резултата померања. PF ће садржати 1 ако је паран број јединица у нижем бајту резултата. AF је увек недефинисан.

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

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

7 Инструкције за померање и ротирање
Инструкције за ротирање rcl, rxr, rol и ror имају исту синтаксу као и оне за померање. Сл. 4. Ефекат инструкције rcl.

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

9 Инструкције за померање и ротирање
Сл. 5. Ефекат инструкције rcr. Утицај на маркере је аналоган претходној инструкцији.

10 Инструкције за померање и ротирање
Сл. 6. Ефекат инструкција rol и ror. Утицај на маркере код rol идентичан је као код rcl, односно утицај ror је као код rcr.

11 Инструкције за померање и ротирање
Уз инструкције које манипулишу битовима (логичке, померања, ...) поменимо и инструкцију test. test reg,reg test reg,mem test mem,reg test reg,imm test mem,imm Ова инструкција обавља AND операцију над битовима својих операнада не смештајући резултат нигде али постављајући одговарајуће вредности маркера.

12 У/И инструкције 8086 подржава две У/И инструкције: in ax/al,port
in ax/al,dx out port,ax/al out dx,ax/al Port је вредност између 0 и 255.

13 Инструкције гранања Инструкција безусловног скока је
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

14 Инструкције гранања Интрасегментни скок је типа near док је интерсегментни скок типа far. Код прва два интрасегментна скока вредност размештаја се додаје регистру IP. Разлика је само у опсегу вредности и што се код 8-битног размештаја најпре врши његово знаковно проширење.

15 Инструкције гранања Директни интерсегментни скок обавља се тако што се 32-битна адреса уписује у пар CS:IP. Обично се уместо размештаја код ова три типа скока користе лабеле: mov dx,378h LoopForever: in al,dx xor al,1 out dx,al jmp LoopForever

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

17 Инструкције гранања call disp16 ;direktno intrasegmentno
Међу инструкције гранања убрајамо и: инструкцију за позив потпрограма call и инструкцију за повратак из потпрограма ret. Зашто? call disp16 ;direktno intrasegmentno call adrs32 ;direktno intersegmentno call mem16 ;indirektno intrasegmentno call reg16 ;indirektno intrasegmentno call mem32 ;indirektno intersegmentno

18 Инструкције гранања Инструкција call типа far ради следеће:
Шаље садржај регистра CS у магацин. Шаље 16-битни офсет инструкције која следи иза позива у магацин. Копира 32-битну ефективну адресу потпрог-рама у пар CS:IP. Извршење се наставља од прве инструкције потпрограма.

19 Инструкције гранања Инструкција call типа near ради следеће:
Шаље 16-битни офсет инструкције која следи иза позива у магацин. Копира 16-битну ефективну адресу потпрог-рама у регистар IP. Извршење се наставља од прве инструкције потпрограма.

20 Инструкције гранања Инструкција 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

21 Инструкције гранања Повратак се остварује читањем адресе повратка из магацина. Повратак типа near чита 16-битну адресу из магацина и уписује је у регистар IP. Повратак типа far чита 16-битни офсет и уписује га у IP а потом и 16-битну адресу сегмента коју уписује у CS. Не треба мешати позиве и повратке near и far типа!

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

23 Инструкције гранања Табела 1. Jcc инструкције које тестирају маркере.
Инструкција Опис Услов Алијаси Супротна JC Jump if carry CF=1 JB, JNAE JNC Jump if no carry CF=0 JNB, JAE JZ Jump if zero ZF=1 JE JNZ Jump if not zero ZF=0 JNE JS Jump if sign SF=1 JNS Jump if no sign SF=0 JO Jump if overflow OF=1 JNO Jump if no overflow OF=0 JP Jump if parity PF=1 JPE JNP Jump if parity even JPO Jump if no parity PF=0 Jump if parity odd

24 Инструкције гранања Табела 2. Jcc инструкције за неозначено поређење.
Инструкција Опис Услов Алијаси Супротна Jump if above (>) CF=0, ZF=0 JNBE JNA Jump if not below or equal (not <=) JA JBE JAE Jump if above or equal (>=) CF=0 JNC, JNB JNAE JNB Jump if not below (not <) JNC, JAE JB Jump if below (<) CF=1 JC, JNAE Jump if not above or equal (not >=) JC, JB Jump if below or equal (<=) CF=1 or ZF=1 Jump if not above (not >) JE Jump if equal (=) ZF=1 JZ JNE Jump if not equal (≠) ZF=0 JNZ

25 Инструкције гранања Табела 3. Jcc инструкције за означено поређење.
Инструкција Опис Услов Алијаси Супротна JG Jump if greater (>) SF=OF or ZF=0 JNLE JNG Jump if not less tjan or equal (not <=) JLE JGE Jump if greater than or equal (>=) SF=OF JNL Jump if not less than (not <) JL Jump if less than (<) SF≠OF JNGE Jump if not greater than or equal (not >=) Jump if less than or equal (<=) SF≠OF or ZF=1 Jump if not greater then (not >) JE Jump if equal (=) ZF=1 JZ JNE Jump if not equal (≠) ZF=0 JNZ

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

27 Инструкције гранања Примера ради, ако имамо инструкцију jc target
можемо је конвертовати у дужи облик помоћу следеће секвенце: jnc SkipJmp jmp target

28 Инструкције гранања Инструкција JCXZ (jump if CX is zero) врши гранање на циљну адресу ако регистар CX садржи нулу. Ова инструкција не утиче на маркере. Инструкција LOOP декрементира реги-стар CX и врши гранање на циљну адресу ако CX не садржи нулу. Ова инструкција такође не утиче на маркере.

29 Инструкције гранања Инструкција LOOPЕ/LOOPZ врши гранање на циљну адресу ако CX не садржи нулу a ZF=1. Инструкција LOOPNЕ/LOOPNZ врши гранање на циљну адресу ако CX не садржи нулу a ZF=0. Обе инструкције не утичу на маркере.

30 Инструкције за рад са стринговима
8086 подржава 10 инструкција за рад са стринговима: movs loads stos scas cmps rep repe repz repnz repne

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

32 Инструкције за рад са стринговима
Инструкције movs и cmps подразумевају да ES:DI садржи сегментну адресу одредишног низа. Инструкција lods подразумева да DS:SI указује на изворни низ док је акумулатор одредиште. Инструкције scas и stos подразумевају да ES:DI указује на одредишни низ а изворни операнд је у акумулатору.

33 Инструкције за рад са стринговима
Инструкција movs копира један елемент низа (обима бајт или реч) из мемеоријске локације чија је адреса DS:SI у локацију са адресом у ES:DI. По копирању се регистри SI и DI инкрементирају за 1 или 2, уколико је DF обрисан; у супротном се ови регистри декрементирају за исти износ.

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

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

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

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

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

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

40 Инструкције за рад са стринговима
Ово комбиновање се врши на следећи начин: За MOVS: rep movs За CMPS: repe cmps repz cmps repne cmps repnz cmps За SCAS: repe scas repz scas repne scas repnz scas За STOS: rep stos

41 Инструкције за рад са стринговима
Ови префикси се обично не користе уз lods. Значење префикса је да се инструкција понавља CX пута (у случају cmps највише CX пута). Уз то, потребно је да важи и услов уграђен у сам префикс (z/e или nz/ne)

42 Декларација процедура
За разлику од HLL-ова, нема стриктних правила о томе шта чини процедуру (овде у значењу било које врсте потпрограма). Могуће је позвати процедуру са било које адресе у меоморији а прва ret инструкција на коју се наиђе извршиће повратак. Међутим, коришћење ове чињенице често доводи до нечитког програма!

43 Декларација процедура
Стога су обезбеђени механизми за декларисање процедура. Оснoвни механизам за декларацију процедура је: imeproc proc {NEAR ili FAR} <iskazi koji cine proceduru> imeproc endp

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

45 Декларација сегмената
Сви програми се састоје од једног или више сегмената. У току извршења програма сегментни регистри указују на адресе одређених сегмената којих може бити највише 4. Сегменти се дефинишу исказом imeseg segment {operandi} <iskazi> imeseg ends

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

47 Декларација сегмената
CSEG segment mov ax,bx ret CSEG ends DSEG segment Item1 byte 0 Item2 word 0 DSEG ends mov ax,10 add ax,Item1 end

48 Декларација сегмената
Када год наиђе на име сегмента, асемблер га замењује непосредном вредношћу која представља његову адресу. Како није могуће напунити сегментни регистар непосредном вредношћу, то морамо да урадимо у више корака: mov ax,dseg mov ds,ax mov es,ax

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

50 Декларација сегмената
Постоји 6 врста сегментних операнада. {READONLY}{align}{combine}{use}{‘class’} Align се односи на тип поравнања сегмената. Овај параметар узима једну од следећих вредности: byte, word, dword, para или page. Сегменти ће се поравнавати на основу овог параметра. Како је параметар опциони подразумевана вредност је para (значи параграф – 16 бајтова).

51 Декларација сегмената
seg1 segment seg1 ends seg2 segment byte seg2 ends

52 Декларација сегмената
seg1 segment seg1 ends seg2 segment word seg2 ends

53 Декларација сегмената
seg1 segment seg1 ends seg2 segment dword seg2 ends

54 Декларација сегмената
seg1 segment seg1 ends seg2 segment para seg2 ends

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

56 Декларација сегмената
seg1 segment seg1 ends seg2 segment page seg2 ends

57 Декларација сегмената
Ако се изабере било које поравнање осим бајтовског, преводилац убацује потребан број бајтова како би се обавило тражено поравнање. Сегментни регистри увек морају да показују на адресу параграфа. Како онда процесор врши адресирање сегмената са различитим поравнањем?

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

59 Декларација сегмената
Тип combine управља начином уписивања сегмената са истим именом у објектни фајл. Могуће је специфицирати public, stack, common, memory или at. Мemory је синоним за public и постоји ради компатибилности па увек треба користити public.

60 Декларација сегмената
Public и stack у основи раде исту ствар: врше конкатенацију сегмената са истим именом у један непрекидни сегмент. Разлика је у начину иницијализације сегментног регистра магацина и регистара показивача магацина. У принципу, сваки програм треба да има један сегмент типа stack док остали треба да буду public.

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

62 Декларација сегмената
CSEG segment public mov ax,0 mov VAR1,ax CSEG ends DSEG segment public I word ? DSEG ends mov bx,ax ret J word ? end

63 Декларација сегмената
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

64 Декларација сегмената
Тип class специфицира редослед сегемената који немају исто име. Могуће вредности су: ‘CODE’ (за сегменте који садрже програмски код), ‘DATA’ (за сегменте који садрже податке) и ‘STACK’ (за сегменте који садрже магацин).

65 Декларација сегмената
У општем случају, сегмент података представља сегмент података само ако регистар DS указује на њега. Како асемблер зна који сегмент зашта служи, нарочито ако знамо да се садржај сегментних регистара може мењати динамички? Директива assume пружа ове информације асемблеру.

66 Декларација сегмената
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

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

68 Декларација сегмената
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 CSEG ends end


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

Similar presentations


Ads by Google