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

Preview:

DESCRIPTION

Архитектура и програмирање микропроцесора Intel 8086 (2). Декларисање променљивих Инструкције за пренос података Инструкције за конверзију Аритметичке инструкције Логичке инструкције. Декларисање променљивих. У оквиру сегмента података могу се декларисати скаларне и структурне променљиве. - PowerPoint PPT Presentation

Citation preview

Архитектура и програмирање

микропроцесора Intel 8086 (2)

Декларисање променљивих Инструкције за пренос података Инструкције за конверзију Аритметичке инструкције Логичке инструкције

Декларисање променљивих У оквиру сегмента података могу се

декларисати скаларне и структурне променљиве.

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

Приликом декларације може се (али и не мора) задати иницијална вредност променљиве.

Декларисање променљивих За декларисање променљивих обима

бајт могу се употребити асемблерске директиве db, или byte и sbyte.

imepr db ?

лабеладиректива недефинисана

иницијална вредност

Декларисање променљивих db је директива која се користила у

старијим верзијама асемблера (пре МАСМ 6.x).

У новијим верзијама могу се користити byte и sbyte за декларисање неозначених и означених података обима једног бајта.

Декларисање променљивих Када су декларисане, променљиве се

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

Декларисање променљивихdsegsegmenti db ?j byte ?k sbyte ?dsegends

…mov i,0mov j,245mov k,-5mov al,imov j,al

DOS иницијализује ове променљиве на 0 али не можемо да се ослонимо на то!

Декларисање променљивихdsegsegmenti db 0j byte 255k sbyte -1dsegends

Водите рачуна да асемблер не проверава тип податка већ само обим!

Декларисање променљивих За декларисање променљивих обима

речи (16-битне) могу се употребити асемблерске директиве dw, или word и sword.

rec dw ?neoznr word ?oznrec sword ?inic0 word 0inicM1 sword -1iniBig word 65535iniOfs dw rec

Декларисање променљивих За декларисање променљивих обима

дупле речи (32-битне) могу се употребити асемблерске директиве dd, или dword и sdword.

За декларисање низова употребићемо

imeniza osnovitip n dup (?)

лабела која представља име низа тип (обим)

елемента низа

број елеменат

а низа

дуплицирање елеменат у заградама n

пута

иницијална вредност

Декларисање променљивих Код декларисања вишедимензионалних

низова морамо водити рачуна да се елементи тих низова смештају у линеаран низ меморијских локација.

Постоје два начина смештања column-order (FORTRAN, BASIC) row-order (Pascal, C, …)

Инструкције за пренос података Инструкције за пренос података су mov, xchg, lea, lds, les, push, pop, lahf, sahf …

Инструкција mov има неколико облика:mov reg,regmov mem,regmov reg,memmov mem,immmov reg,immmov segreg,mem16

mov segreg,reg16

mov mem16,segregmov reg16,segreg

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

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

У свим варијантама операнди морају бити истог обима.

Не утиче на маркере!

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

својим операндима. xchg reg,memxchg reg,reg

Не утиче на маркере!

Инструкције за пренос података Инструкцијe lds и les служе за

пуњење пара 16-битног регистра опште намене и сегментног регистра (DS или ES).

lds reg16,mem32

les reg16,mem32

Не утиче на маркере!

Инструкције за пренос података Инструкција lea има облик

lеа reg16,mem Пуни 16-битни регистар ефективном

адресом меморијске локације. Не утиче на маркере!

Инструкције за пренос података Инструкције push и pop служе за упис и

читање из магацинама обликpush reg16

pop reg16

push serregpop segreg ;osim CSpush mem ; 16-bitnepop mem ; 16-bitne

Не утиче на маркере!

Инструкције за пренос података Инструкције lahf и sahf служе за

пуњење регистра AH нижим бајтом статусног регистра, односно за копирање регистра AH у нижи бајт статусног регистра.

lahfsahf

Инструкције за конверзију Инструкције за конверзију су cbw, cwd и xlat.

Инструкција cbw врши знаковно проширење 8-битне вредности из AL у 16-битну вредност у AX.

Инструкција cwd врши знаковно проширење 16-битне вредности из AX у 32-битну вредност у DX:AX.

Инструкције за конверзију Инструкцијa xlat преводи вредност у

AL на основу табеле у меморији чија је базна адреса у регистру BX:

temp:=al+bxal:=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.

Аритметичке инструкције Синтакса инструкцијe inc је:

inc reginc meminc reg16

Ова инструкција увећава свој операнд за један и осим CF утиче на исти начин на маркере као и

add operand,1

Аритметичке инструкције Инструкције AAA и DAA служе за ASCII и

децимално подешавање код BCD аритметике. У првом случају ради се заправо о

непакованом формату BCD бројева, а у другом о пакованом.

if ((al and 0Fh)> 9 or (AF=1)) thenal:=al+6ah:=ah+1AF:=1CF:=1

elseAF:=0CF:=0

endifal:=al and 0Fh

Аритметичке инструкцијеif ((al and 0Fh)> 9 or (AF=1)) then

al:=al+6AF:=1

endifif ((al and 0Fh)> 9 or (CF=1)) then

al:=al+60hCF:=1

endif

Аритметичке инструкције Инструкције за одузимање sub, sbb, dec,

aas и das имају слични синтаксу као и њихови аналогони за сабирање.

Наравно ради се о одузимању, одузимању са позајмицом, смањењу за 1 и подешавањима код одузимања.

Аритметичке инструкцијеif ((al and 0Fh)> 9 or (AF=1)) then

al:=al-6ah:=ah-1AF:=1CF:=1

elseAF:=0CF:=0

endifal:=al and 0Fh

Аритметичке инструкцијеif ((al and 0Fh)> 9 or (AF=1)) then

al:=al-6AF:=1

endifif ((al and 0Fh)> 9 or (CF=1)) then

al:=al-60hCF:=1

endif

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

cmp reg,regcmp reg,memcmp mem,reg cmp reg,immcmp mem,imm

Ова инструкција одузима од одредишног изворни операнд, резултат не смешта нигде, а на основу резултатат поставља ZF, SF, OF и CF.

Аритметичке инструкције Инструкција за негацију има синтаксу:

neg dest; dest:=0-dest Ова инструкција утиче на AF, SF, PF и

ZF. Ако је операнд био нула његов знак се

не мења али се поставља CF. Негација најмаљег негативног броја не мења операнд али поставља OF.

Аритметичке инструкције Инструкција mul служи за неозначено а

imul за означено множење.mul regmul memimulregimulmem

Ако је операнд 8-битан онда се извршаваax:=al*operand8

Ако је операнд 16-битан извршава сеdx:ax:=ax*operand16

Аритметичке инструкције Вредности маркера AF, PF, SF, ZF нису

дефинисане после ових инструкција. Инструкција aam служи за ASCII

подешавање после множења. Она подразумева да су помножена два 8-битна броја и да је резултат у ax.

ah:=ax div 10al:=ax mod 10

Аритметичке инструкције Синтакса инструкција за дељење div,

idiv и aad слична је онима за множење. Код 8-битног дељења дели се ax 8-

битним операндом после чега је количник у al а остатак у ah.

Код 16-битног дељења дели се dx:ax 16-битним операндом после чега је количник у ax а остатак у dx.

Инструкција аad обављаal:=ah*10+alah:=0

Логичке инструкцијеand/or/xor reg,regand/or/xor mem,regand/or/xor reg,memand/or/xor reg,immand/or/xor mem,imm

not regnot mem

Логичке инструкције Инструкција not не утиче на маркере,

док остале утичу тако што бришу CF и OF, ZF постављају на основу резултата, SF на основу бита највеће тежине резултата а AF је недефинисан.