Архитектура и програмирање микропроцесора intel 8086 ( 3 )
DESCRIPTION
Архитектура и програмирање микропроцесора Intel 8086 ( 3 ). Инструкције за померање и ротирање У/И инструкције Инструкције гранања Инструкције за рад са стринговима Декларација процедура Декларација сегмената. Инструкције за померање и ротирање. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/1.jpg)
Архитектура и програмирање
микропроцесора Intel 8086 (3)
Инструкције за померање и ротирање У/И инструкције Инструкције гранања Инструкције за рад са стринговима Декларација процедура Декларација сегмената
![Page 2: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/2.jpg)
Инструкције за померање и ротирање Инструкције за померање су shl/sаl, shr
и sar.shl/sal/shr/sar reg,1shl/sal/shr/sar mem,1shl/sal/shr/sar reg,clshl/sal/shr/sar mem,cl
Одредишни операнд је онај чији се садржај помера (8-, 16- или 32-битни) док се изворним операндом специфи-цира број померања.
![Page 3: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/3.jpg)
Инструкције за померање и ротирање
Ако је број померања 0 нема утицаја на маркере.
CF ће садржати MS бит који је последњи “испао” приликом померања.
OF је 1 ако се два MS бита разликују приликом једноструког померања, а ако број померања није 1 недефинисан је.
Сл. 1. Ефекат инструкција shl и sal.
![Page 4: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/4.jpg)
Инструкције за померање и ротирање
ZF и SF се постављају на основу резултата померања.
PF ће садржати 1 ако је паран број јединица у нижем бајту резултата.
AF је увек недефинисан.
![Page 5: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/5.jpg)
Инструкције за померање и ротирање
Ако је број померања 0 нема утицаја на маркере. CF ће садржати LS бит који је последњи “испао”
приликом померања. OF је 0 ако је број померања 1, а иначе је недефинисан. ZF и SF се постављају на основу резултата померања. PF ће садржати 1 ако је паран број јединица у нижем
бајту резултата. AF је увек недефинисан.
Сл. 2. Ефекат инструкције sar.
![Page 6: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/6.jpg)
Инструкције за померање и ротирање
Ако је број померања 0 нема утицаја на маркере. CF ће садржати LS бит који је последњи “испао”
приликом померања. Aко је број померања 1, OF је једнак биту знака пре
померања, а иначе је недефинисан. ZF и SF се постављају на основу резултата померања. PF ће садржати 1 ако је паран број јединица у нижем
бајту резултата. AF је увек недефинисан.
Сл. 3. Ефекат инструкције shr.
![Page 7: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/7.jpg)
Инструкције за померање и ротирање Инструкције за ротирање rcl, rxr, rol и
ror имају исту синтаксу као и оне за померање.
Сл. 4. Ефекат инструкције rcl.
![Page 8: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/8.jpg)
Инструкције за померање и ротирање После ове инструкције CF садржи
последњи MS бит. Ако је број померања 1 OF се
поставља ако се промени знак услед ротације а иначе је недефинисан.
Ова инструкција не утиче на ZF, SF, PF и AF.
![Page 9: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/9.jpg)
Инструкције за померање и ротирање
Утицај на маркере је аналоган претходној инструкцији.
Сл. 5. Ефекат инструкције rcr.
![Page 10: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/10.jpg)
Инструкције за померање и ротирање
Утицај на маркере код rol идентичан је као код rcl, односно утицај ror је као код rcr.
Сл. 6. Ефекат инструкција rol и ror.
![Page 11: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/11.jpg)
Инструкције за померање и ротирање Уз инструкције које манипулишу
битовима (логичке, померања, ...) поменимо и инструкцију test.
test reg,regtest reg,memtest mem,regtest reg,immtest mem,imm
![Page 12: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/12.jpg)
Инструкције за померање и ротирање Ова инструкција обавља AND операцију
над битовима својих операнада не смештајући резултат нигде али постављајући одговарајуће вредности маркера.
![Page 13: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/13.jpg)
У/И инструкције 8086 подржава две У/И инструкције:
in ax/al,portin ax/al,dxout port,ax/alout dx,ax/al
Port је вредност између 0 и 255.
![Page 14: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/14.jpg)
Инструкције гранања Инструкција безусловног скока је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
![Page 15: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/15.jpg)
Инструкције гранања Интрасегментни скок је типа near док је
интерсегментни скок типа far. Код прва два интрасегментна скока
вредност размештаја се додаје регистру IP.
Разлика је само у опсегу вредности и што се код 8-битног размештаја најпре врши његово знаковно проширење.
![Page 16: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/16.jpg)
Инструкције гранања Директни интерсегментни скок обавља
се тако што се 32-битна адреса уписује у пар CS:IP.
Обично се уместо размештаја код ова три типа скока користе лабеле:
mov dx,378hLoopForever: in al,dx
xor al,1out dx,aljmp LoopForever
![Page 17: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/17.jpg)
Инструкције гранања Индиректни типови скокова одвијају се
тако што је циљна адреса у некој локацији чија се адреса наводи, или је у регистру.
![Page 18: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/18.jpg)
Инструкције гранања Међу инструкције гранања убрајамо и:
инструкцију за позив потпрограма call и инструкцију за повратак из потпрограма ret.
Зашто?
call disp16 ;direktno intrasegmentnocall adrs32 ;direktno intersegmentnocall mem16 ;indirektno intrasegmentnocall reg16 ;indirektno intrasegmentnocall mem32 ;indirektno intersegmentno
![Page 19: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/19.jpg)
Инструкције гранања Инструкција call типа far ради следеће:
Шаље садржај регистра CS у магацин. Шаље 16-битни офсет инструкције која
следи иза позива у магацин. Копира 32-битну ефективну адресу потпрог-
рама у пар CS:IP. Извршење се наставља од прве инструкције
потпрограма.
![Page 20: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/20.jpg)
Инструкције гранања Инструкција call типа near ради
следеће: Шаље 16-битни офсет инструкције која
следи иза позива у магацин. Копира 16-битну ефективну адресу потпрог-
рама у регистар IP. Извршење се наставља од прве инструкције
потпрограма.
![Page 21: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/21.jpg)
Инструкције гранања Инструкција ret врши повратак у
позивајући програм:ret ;near ili far povratak
retn ;near povratakretf ;far povratakret disp ;near ili far povratak i popretn disp ;near povratak i popretf disp ;far povratak i pop
![Page 22: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/22.jpg)
Инструкције гранања Повратак се остварује читањем адресе
повратка из магацина. Повратак типа near чита 16-битну
адресу из магацина и уписује је у регистар IP.
Повратак типа far чита 16-битни офсет и уписује га у IP а потом и 16-битну адресу сегмента коју уписује у CS.
Не треба мешати позиве и повратке near и far типа!
![Page 23: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/23.jpg)
Инструкције гранања Инструкције условног гранања у себи
садрже услов на основу кога се врши гранање, уколико је он испуњен.
Ове инструкције тестирају један или више маркера са циљем да утврде да ли је услов задовољен.
![Page 24: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/24.jpg)
Инструкције гранања
Инструкција Опис Услов Алијаси Супротна
JC Jump if carry CF=1 JB, JNAE JNC
JNC Jump if no carry CF=0 JNB, JAE JC
JZ Jump if zero ZF=1 JE JNZ
JNZ Jump if not zero ZF=0 JNE JZ
JS Jump if sign SF=1 JNS
JNS Jump if no sign SF=0 JS
JO Jump if overflow OF=1 JNO
JNO Jump if no overflow OF=0 JO
JP Jump if parity PF=1 JPE JNP
JPE Jump if parity even PF=1 JP JPO
JNP Jump if no parity PF=0 JPO JP
JPO Jump if parity odd PF=0 JNP JPE
Табела 1. Jcc инструкције које тестирају маркере.
![Page 25: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/25.jpg)
Инструкције гранања
Инструкција Опис Услов Алијаси Супротна
JА Jump if above (>) CF=0, ZF=0 JNBE JNA
JNBE Jump if not below or equal (not <=)
CF=0, ZF=0 JA JBE
JAE Jump if above or equal (>=) CF=0 JNC, JNB JNAE
JNB Jump if not below (not <) CF=0 JNC, JAE JB
JB Jump if below (<) CF=1 JC, JNAE JNB
JNAE Jump if not above or equal (not >=)
CF=1 JC, JB JAE
JBE Jump if below or equal (<=) CF=1 or ZF=1
JNA JNBE
JNA Jump if not above (not >) CF=1 or ZF=1
JBE JA
JE Jump if equal (=) ZF=1 JZ JNE
JNE Jump if not equal (≠) ZF=0 JNZ JE
Табела 2. Jcc инструкције за неозначено поређење.
![Page 26: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/26.jpg)
Инструкције гранања
Инструкција Опис Услов Алијаси Супротна
JG Jump if greater (>) SF=OF or ZF=0
JNLE JNG
JNLE Jump if not less tjan or equal (not <=)
SF=OF or ZF=0
JG JLE
JGE Jump if greater than or equal (>=) SF=OF JNL JGE
JNL Jump if not less than (not <) SF=OF JGE JL
JL Jump if less than (<) SF≠OF JNGE JNL
JNGE Jump if not greater than or equal (not >=)
SF≠OF JL JGE
JLE Jump if less than or equal (<=) SF≠OF or ZF=1
JNG JNLE
JNG Jump if not greater then (not >) SF≠OF or ZF=1
JLE JG
JE Jump if equal (=) ZF=1 JZ JNE
JNE Jump if not equal (≠) ZF=0 JNZ JE
Табела 3. Jcc инструкције за означено поређење.
![Page 27: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/27.jpg)
Инструкције гранања Код процесора 8086 (па све до 80386)
инструкције условног гранања су обима 2 бајта, где је други бајт размештај.
Ово пружа могућност скока у опсегу од 128 бајтова.
Да би превазлишли ово ограничење треба употребити следећи “трик”: Употребити облик са супротним условом. Таква инструкција треба да прескочи
инструкцију безусловног скока на оригиналну циљну адресу.
![Page 28: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/28.jpg)
Инструкције гранања Примера ради, ако имамо инструкцију
jc target
можемо је конвертовати у дужи облик помоћу следеће секвенце:
jnc SkipJmp
jmp target
![Page 29: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/29.jpg)
Инструкције гранања Инструкција JCXZ (jump if CX is zero)
врши гранање на циљну адресу ако регистар CX садржи нулу.
Ова инструкција не утиче на маркере. Инструкција LOOP декрементира реги-
стар CX и врши гранање на циљну адресу ако CX не садржи нулу.
Ова инструкција такође не утиче на маркере.
![Page 30: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/30.jpg)
Инструкције гранања Инструкција LOOPЕ/LOOPZ врши
гранање на циљну адресу ако CX не садржи нулу a ZF=1.
Инструкција LOOPNЕ/LOOPNZ врши гранање на циљну адресу ако CX не садржи нулу a ZF=0.
Обе инструкције не утичу на маркере.
![Page 31: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/31.jpg)
Инструкције за рад са стринговима 8086 подржава 10 инструкција за рад
са стринговима: movs loads stos scas cmps rep repe repz repnz repne
![Page 32: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/32.jpg)
Инструкције за рад са стринговима Овим инструкцијама може се
манипулисати појединим елементима низова или се обрађују читави низови.
Обим операнада (елемената низова) је бајт или реч а специфицирање тог обима се једноставно обавља дода-вањем суфикса b или w на крају мнемоника.
![Page 33: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/33.jpg)
Инструкције за рад са стринговима Инструкције movs и cmps подразумевају
да ES:DI садржи сегментну адресу одредишног низа.
Инструкција lods подразумева да DS:SI указује на изворни низ док је акумулатор одредиште.
Инструкције scas и stos подразумевају да ES:DI указује на одредишни низ а изворни операнд је у акумулатору.
![Page 34: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/34.jpg)
Инструкције за рад са стринговима Инструкција movs копира један елемент
низа (обима бајт или реч) из мемеоријске локације чија је адреса DS:SI у локацију са адресом у ES:DI.
По копирању се регистри SI и DI инкрементирају за 1 или 2, уколико је DF обрисан; у супротном се ови регистри декрементирају за исти износ.
![Page 35: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/35.jpg)
Инструкције за рад са стринговимаmovs{b,w}:es:[di]:=ds:[si]
if DF=0 thensi:=si+size;di:=di+size;
elsesi:=si-size;di:=di-size;
endif; size=1 или 2 у зависности од обима
елемента низа.
![Page 36: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/36.jpg)
Инструкције за рад са стринговима Инструкција cmps пореди бајт или реч
на локацији DS:SI са оним на локацији ES:DI и на основу тога поставља маркере.
После поређења се регистри SI и DI инкрементирају или декрементирају за 1 или 2.
![Page 37: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/37.jpg)
Инструкције за рад са стринговима cmps{b,w}: cmp ds:[si],es:[di]
if DF=0 thensi:=si+size;di:=di+size;
elsesi:=si-size;di:=di-size;
endif;
![Page 38: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/38.jpg)
Инструкције за рад са стринговима Инструкција 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;
![Page 39: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/39.jpg)
Инструкције за рад са стринговима Инструкција stos смешта садржај
акумулатора у локацију адресирану са ES:DI.
После копирања се регистaр DI инкрементира или декрементира за 1 или 2.
![Page 40: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/40.jpg)
Инструкције за рад са стринговимаstos{b,w}:es:[di]:=ax/al
if DF=0 thendi:=di+size;
elsedi:=di-size;
endif;
![Page 41: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/41.jpg)
Инструкције за рад са стринговима Инструкција 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;
![Page 42: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/42.jpg)
Инструкције за рад са стринговима Саме по себи наведене инструкције не
могу да обраде читав низ. Њиховим комбиновањем са rep, repz, repe, repnz и repne префиксима постиже се примена одговарајуће операције на читав низ.
![Page 43: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/43.jpg)
Инструкције за рад са стринговима Ово комбиновање се врши на следећи
начин: За MOVS:
rep movs За CMPS:
repe cmpsrepz cmpsrepne cmpsrepnz cmps
![Page 44: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/44.jpg)
Инструкције за рад са стринговима
За SCAS:
repe scasrepz scasrepne scasrepnz scas
За STOS:
rep stos
![Page 45: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/45.jpg)
Инструкције за рад са стринговима Ови префикси се обично не користе уз lods.
Значење префикса је да се инструкција понавља CX пута (у случају cmps највише CX пута).
Уз то, потребно је да важи и услов уграђен у сам префикс (z/e или nz/ne)
![Page 46: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/46.jpg)
Декларација процедура За разлику од HLL-ова, нема стриктних
правила о томе шта чини процедуру (овде у значењу било које врсте потпрограма).
Могуће је позвати процедуру са било које адресе у меоморији а прва ret инструкција на коју се наиђе извршиће повратак.
Међутим, коришћење ове чињенице често доводи до нечитког програма!
![Page 47: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/47.jpg)
Декларација процедура Стога су обезбеђени механизми за
декларисање процедура. Оснoвни механизам за декларацију
процедура је:imeproc proc{NEAR ili FAR}
<iskazi koji cine proceduru>
imeproc endp
![Page 48: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/48.jpg)
Декларација процедура Уколико се у процедури не наиђе на
ниједну ret инструкцију наставља се са следећом која следи иза endp!
![Page 49: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/49.jpg)
Декларација сегмената Сви програми се састоје од једног или
више сегмената. У току извршења програма сегментни
регистри указују на адресе одређених сегмената којих може бити највише 4.
Сегменти се дефинишу исказомimeseg segment {operandi}
<iskazi>imeseg ends
![Page 50: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/50.jpg)
Декларација сегмената Имена сегмената траба да буду
јединствена. Ако постоји још неки сегмент са
истим именом онда се он сматра наставком претходног.
![Page 51: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/51.jpg)
Декларација сегмената Када се декларише нови сегмент
асемблер креира нови локациони бројач за тај сегмент са нултом иницијалном вредошћу.
Ако је сегмент наставак неког претходног онда се користи крајња вредност локационог бројача претходног сегмента.
![Page 52: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/52.jpg)
Декларација сегменатаCSEG segment
mov ax,bxret
CSEG ends
DSEG segmentItem1 byte 0Item2 word 0DSEG ends
CSEG segmentmov ax,10add ax,Item1ret
CSEG endsend
![Page 53: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/53.jpg)
Декларација сегмената Када год наиђе на име сегмента,
асемблер га замењује непосредном вредношћу која представља његову адресу.
Како није могуће напунити сегментни регистар непосредном вредношћу, то морамо да урадимо у више корака:
mov ax,dsegmov ds,axmov es,ax
![Page 54: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/54.jpg)
Декларација сегмената Сегменти се пуне у меморију у оном
редоследу у коме се наводе у изворној датотеци.
У пређашњем примеру читав сегмент CSEG пуни се у меморију пре DSEG.
Коришћењем директиве .alpha нала-жемо пуњење сегмената у алфабетском поретку њихових имена уместо у редоследу појављивања.
![Page 55: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/55.jpg)
Декларација сегмената Постоји 6 врста сегментних операнада.
{READONLY}{align}{combine}{use}{‘class’} Align се односи на тип поравнања
сегмената. Овај параметар узима једну од
следећих вредности: byte, word, dword, para или page.
Сегменти ће се поравнавати на основу овог параметра. Како је параметар опциони подразумевана вредност је para (значи параграф – 16 бајтова).
![Page 56: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/56.jpg)
Декларација сегменатаseg1 segment
…seg1 ends
seg2 segment byte…
seg2 ends
![Page 57: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/57.jpg)
Декларација сегменатаseg1 segment
…seg1 ends
seg2 segment word…
seg2 ends
![Page 58: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/58.jpg)
Декларација сегменатаseg1 segment
…seg1 ends
seg2 segment dword…
seg2 ends
![Page 59: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/59.jpg)
Декларација сегменатаseg1 segment
…seg1 ends
seg2 segment para…
seg2 ends
![Page 60: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/60.jpg)
Декларација сегмената Поравнање по параграфима је
подразумевано и у већини случајева га треба користити уколико нема неког доброг разлога да буде другачије.
Најзад, могуће је користити поравнање по странама (256 бајтова) што је корисно у случају да имамо бафере података који захтевају простор који је умножак од 256B.
![Page 61: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/61.jpg)
Декларација сегменатаseg1 segment
…seg1 ends
seg2 segment page…
seg2 ends
![Page 62: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/62.jpg)
Декларација сегмената Ако се изабере било које поравнање
осим бајтовског, преводилац убацује потребан број бајтова како би се обавило тражено поравнање.
Сегментни регистри увек морају да показују на адресу параграфа.
Како онда процесор врши адресирање сегмената са различитим поравнањем?
![Page 63: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/63.jpg)
Декларација сегмената Преводилац у том случају претпоставља да
сегмент почиње од адресе претходног параграфа, али је вредност локационог бројача постављена на неки ненулти офсет.
![Page 64: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/64.jpg)
Декларација сегмената Тип combine управља начином
уписивања сегмената са истим именом у објектни фајл.
Могуће је специфицирати public, stack, common, memory или at.
Мemory је синоним за public и постоји ради компатибилности па увек треба користити public.
![Page 65: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/65.jpg)
Декларација сегмената Public и stack у основи раде исту
ствар: врше конкатенацију сегмената са истим именом у један непрекидни сегмент.
Разлика је у начину иницијализације сегментног регистра магацина и регистара показивача магацина.
У принципу, сваки програм треба да има један сегмент типа stack док остали треба да буду public.
![Page 66: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/66.jpg)
Декларација сегмената Уколико се не специфицира combine
тип преводилац неће вршити конкатенацију сегмената и тада је ефекат исти као да смо употребили тип private.
Примера ради, следеће две секвенце имају исти ефекат.
![Page 67: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/67.jpg)
Декларација сегменатаCSEG segment public
mov ax,0mov VAR1,ax
CSEG endsDSEG segment publicI word ?DSEG endsCSEG segment public
mov bx,axret
CSEG endsDSEG segment publicJ word ?DSEG ends
end
![Page 68: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/68.jpg)
Декларација сегменатаCSEG segment public
mov ax,0mov VAR1,axmov bx,axret
CSEG endsDSEG segment publicI word ?J word ?DSEG ends
end
![Page 69: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/69.jpg)
Декларација сегмената Тип class специфицира редослед
сегемената који немају исто име. Могуће вредности су:
‘CODE’ (за сегменте који садрже програмски код),
‘DATA’ (за сегменте који садрже податке) и ‘STACK’ (за сегменте који садрже магацин).
![Page 70: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/70.jpg)
Декларација сегмената У општем случају, сегмент података
представља сегмент података само ако регистар DS указује на њега.
Како асемблер зна који сегмент зашта служи, нарочито ако знамо да се садржај сегментних регистара може мењати динамички?
Директива assume пружа ове информације асемблеру.
![Page 71: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/71.jpg)
Декларација сегменатаassume {CS:seg}{DS:seg}{ES:seg}{SS:seg}
Бар један операнд мора да буде специфициран.
seg је име сегмента или резервисана реч nothing.
Ако има више операнада они се одвајају зарезима.assume DS:DSEGassume CS:CSEG,DS:DSEG,ES:DSEG,SS:SSEGassume CS:CSEG,DS:NOTHING
![Page 72: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/72.jpg)
Декларација сегмената Ова директива не модификује садржај
сегментних регистара, већ само казује асемблеру да претпостави да сегментни регистри указују на одређене сегменте.
![Page 73: Архитектура и програмирање микропроцесора Intel 8086 ( 3 )](https://reader035.vdocuments.mx/reader035/viewer/2022062801/568143e7550346895db06d78/html5/thumbnails/73.jpg)
Декларација сегменатаDSEG1 segment para public ‘DATA’var1 word ?DSEG1 endsDSEG2 segment para public ‘DATA’var2 word ?DSEG2 endsCSEG segment para public ‘CODE’
assume CS:CSEG,DS:DSEG1,ES:DSEG2mov ax,seg DSEG1mov ds,axmov ax,seg DSEG2mov es,axmov var1,0mov var2,0…assume DS:DSEG2mov ax,seg DSEG2mov ds,axmov var2,0…
CSEG endsend