350 likes | 462 Views
Архитектура и програмирање микропроцесора Intel 8086 (2). Декларисање променљивих Инструкције за пренос података Инструкције за конверзију Аритметичке инструкције Логичке инструкције. Декларисање променљивих. У оквиру сегмента података могу се декларисати скаларне и структурне променљиве.
E N D
Архитектура и програмирање микропроцесора Intel 8086 (2) Декларисање променљивих Инструкције за пренос података Инструкције за конверзију Аритметичке инструкције Логичке инструкције
Декларисање променљивих • У оквиру сегмента података могу се декларисати скаларне и структурне променљиве. • Касније у програму се може приступати тим променљивама на основу њихових симболичких имена датих у декларацији у облику лабела. • Приликом декларације може се (али и не мора) задати иницијална вредност променљиве.
лабела недефинисана иницијална вредност директива Декларисање променљивих • За декларисање променљивих обима бајт могу се употребити асемблерске директиве db, или byteи sbyte. imepr db ?
Декларисање променљивих • dbје директива која се користила у старијим верзијама асемблера (пре МАСМ 6.x). • У новијим верзијама могу се користити byteи sbyteза декларисање неозначених и означених података обима једног бајта.
Декларисање променљивих • Када су декларисане, променљиве се могу користити у програму навођењем њиховог имена а асемблер то име аутоматски замењује одговарајућим офсетом у односу на почетак сегмента података.
DOS иницијализује ове променљиве на 0 али не можемо да се ослонимо на то! Декларисање променљивих dseg segment i db ? j byte ? k sbyte ? dseg ends … mov i,0 mov j,245 mov k,-5 mov al,i mov j,al
Декларисање променљивих dseg segment i db 0 j byte 255 k sbyte -1 dseg ends • Водите рачуна да асемблер не проверава тип податка већ само обим!
Декларисање променљивих • За декларисање променљивих обима речи (16-битне) могу се употребити асемблерске директиве dw, или wordи sword. rec dw ? neoznr word ? oznrec sword ? inic0 word 0 inicM1 sword -1 iniBig word 65535 iniOfs dw rec
иницијална вредност лабелакоја представља име низа дуплицирање елеменат у заградама n пута тип (обим) елемента низа број елемената низа Декларисање променљивих • За декларисање променљивих обима дупле речи (32-битне) могу се употребити асемблерске директиве dd, или dwordи sdword. • За декларисање низова употребићемо imenizaosnovitipn dup (?)
Декларисање променљивих • Код декларисања вишедимензионалних низова морамо водити рачуна да се елементи тих низова смештају у линеаран низ меморијских локација. • Постоје два начина смештања • column-order (FORTRAN, BASIC) • row-order (Pascal, C, …)
Инструкције за пренос података • Инструкције за пренос података су mov, xchg, lea, lds, les, push, pop, lahf, sahf … • Инструкција mov има неколико облика: mov reg,reg mov mem,reg mov reg,mem mov mem,imm mov reg,imm mov segreg,mem16 mov segreg,reg16 mov mem16,segreg mov reg16,segreg
Инструкције за пренос података • Инструкцијом movне може се копирати садржај из једне у другу меморијску локацију нити напунити сегментни регистар непосредном вредношћу. • У свим варијантама операнди морају бити истог обима. • Не утиче на маркере!
Инструкције за пренос података • Инструкција xchgмења вредности својим операндима. xchg reg,mem xchg reg,reg • Не утиче на маркере!
Инструкције за пренос података • Инструкцијelds иles служе за пуњење пара 16-битног регистра опште намене и сегментног регистра (DS или ES). lds reg16,mem32 les reg16,mem32 • Не утиче на маркере!
Инструкције за пренос података • Инструкција lea има облик lеа reg16,mem • Пуни 16-битни регистар ефективном адресом меморијске локације. • Не утиче на маркере!
Инструкције за пренос података • Инструкције push иpopслуже за упис и читање из магацинама облик push reg16 pop reg16 push serreg pop segreg ;osim CS push mem ; 16-bitne pop mem ; 16-bitne • Не утиче на маркере!
Инструкције за пренос података • Инструкције lahf иsahfслуже за пуњење регистра AH нижим бајтом статусног регистра, односно за копирање регистра AH у нижи бајт статусног регистра. lahf sahf
Инструкције за конверзију • Инструкције за конверзију су cbw, cwd и xlat. • Инструкција cbw врши знаковно проширење 8-битне вредности из AL у 16-битну вредност у AX. • Инструкција cwd врши знаковно проширење 16-битне вредности из AX у 32-битну вредност у DX:AX.
Инструкције за конверзију • Инструкцијa xlatпреводи вредност у AL на основу табеле у меморијичија је базна адреса у регистру BX: temp:=al+bx al:=ds:[temp] • Инструкције из ове групе немају експлицитних операнада и не утичу на маркере.
Аритметичке инструкције • Инструкције за сабирање: add, adc, inc, aaa, daa. • Инструкције за одузимање: sub, sbb, dec, aas, das. • Инструкција за поређење cmp. • Инструкција за промену знака neg. • Инструкције за множење: mul, imul, aam. • Инструкције за дељење: div, idiv, aad.
Аритметичке инструкције • Синтакса инструкција add и adc слична је синтакси mov инструкције осим што није могуће сабирање са сегментним регистром. • Инструкција adc врши сабирање са преносом. • Обе инструкције утичу на исти начин на маркере и то на ОF, CF, SF, ZF, AF и PF.
Аритметичке инструкције • Синтакса инструкцијeinc је: inc reg inc mem inc reg16 • Ова инструкција увећава свој операнд за један и осим CF утиче на исти начин на маркере као и addoperand,1
Аритметичке инструкције • Инструкције AAA и DAA служе за ASCII и децимално подешавање код BCD аритметике. • У првом случају ради се заправо о непакованом формату BCDбројева, а у другом о пакованом.
Аритметичке инструкције if ((al and 0Fh)> 9 or (AF=1)) then al:=al+6 ah:=ah+1 AF:=1 CF:=1 else AF:=0 CF:=0 endif al:=al and 0Fh
Аритметичке инструкције if ((al and 0Fh)> 9 or (AF=1)) then al:=al+6 AF:=1 endif if ((al >9Fh)or (CF=1)) then al:=al+60h CF:=1 endif
Аритметичке инструкције • Инструкције за одузимање sub, sbb, dec, aas и das имају слични синтаксу као и њихови аналогони за сабирање. • Наравно ради се о одузимању, одузимању са позајмицом, смањењу за 1 и подешавањима код одузимања.
Аритметичке инструкције if ((al and 0Fh)> 9 or (AF=1)) then al:=al-6 ah:=ah-1 AF:=1 CF:=1 else AF:=0 CF:=0 endif al:=al and 0Fh
Аритметичке инструкције if ((al and 0Fh)> 9 or (AF=1)) then al:=al-6 AF:=1 endif if ((al >9Fh) or (CF=1)) then al:=al-60h CF:=1 endif
Аритметичке инструкције • Инструкција за поређење има синтаксу: cmpreg,reg cmpreg,mem cmpmem,reg cmpreg,imm cmpmem,imm • Ова инструкција одузима од одредишног изворни операнд, резултат не смешта нигде, а на основу резултатат поставља ZF, SF, OF и CF.
Аритметичке инструкције • Инструкција за негацију има синтаксу: neg dest; dest:=0-dest • Ова инструкција утиче на AF, SF, PF и ZF. • Ако је операнд био нула његов знак се не мења али се поставља CF. Негација најмањег негативног броја не мења операнд али поставља OF.
Аритметичке инструкције • Инструкција mulслужи за неозначено а imul за означено множење. mul reg mul mem imul reg imul mem • Ако је операнд 8-битан онда се извршава ax:=al*operand8 • Ако је операнд 16-битан извршава се dx:ax:=ax*operand16
Аритметичке инструкције • Вредности маркера AF, PF, SF, ZF нису дефинисане после ових инструкција. • Инструкција aam служи за ASCII подешавање после множења. Она подразумева да су помножена два 8-битна броја и да је резултату ax. ah:=ax div 10 al:=ax mod 10
Аритметичке инструкције • Синтакса инструкција за дељење div, idiv и aad слична је онима за множење. • Код 8-битног дељења дели се ax 8-битним операндом после чега је количник у al а остатак у ah. • Код 16-битног дељења дели се dx:ax16-битним операндом после чега је количник у ax а остатак у dx. • Инструкција аad обавља al:=ah*10+al ah:=0
Логичке инструкције and/or/xor reg,reg and/or/xor mem,reg and/or/xor reg,mem and/or/xor reg,imm and/or/xor mem,imm not reg not mem
Логичке инструкције • Инструкција not не утиче на маркере, док остале утичу тако што бришу CFи OF, ZF постављају на основу резултата, SF на основу бита највеће тежине резултата а AF је недефинисан.