140 likes | 293 Views
8086 INSTRUKSIESTEL. PUSH en POP (Vervolg) LEA,LDS,LES en LSS Stringe XLAT IN/OUT Segment override I/O Voorbeeld. PUSH en POP (Hoofstuk 4.2) PUSH AX : SP <= SP-2 [SS:SP]<=AX POP AX: AX <=[SS:SP] SP<=SP+2
E N D
8086 INSTRUKSIESTEL PUSH en POP (Vervolg) LEA,LDS,LES en LSS Stringe XLAT IN/OUT Segment override I/O Voorbeeld RS245-2003-Lesing 4
PUSH en POP (Hoofstuk 4.2) PUSH AX : SP <= SP-2 [SS:SP]<=AX POP AX: AX <=[SS:SP] SP<=SP+2 Let op: PUSHdekrementeereers die SP-register voordat die register (AX in hierdie geval) op die stapel geplaas word - en andersom vir POP Aan die begin van enige program moet waardes vir SS en SP toegeken word. Gestel jy wil die stapel in die geheue plaas by 10000H tot 11FFFH MOV AX,1000H MOV SS,AX MOV SP,2000H Die eerste PUSH dekrementeer SP na 1FFEH en skryf die data by SS:SP = 10000H+1FFEH en 10000H+1FFFH PUSHF en POPF ("push flags en pop flags" : kyk self) RS245-2003-Lesing 4
LEA, LDS, LES en LSS (Hoofstuk 4.3) Bostaande instruksies word gebruik om 'n adresse in registers te laai. LEA BX, Boodskap verrig dieselfde funksie as MOV BX, Offset Boodskap LEA kan effens meer komplekse forms aanneem, maar jy kan gewoonlik sonder hierdie instruksie klaarkom. LDS en LES is handig as jy beide 'n segment en 'n ander register met segment- en afsetadres wil laai. LDS BX, Boodskap Laai die afsetadres van Boodskap in BX en die segment in DS LES BX,Boodskap doen dieselfde maar laai die segment in ES RS245-2003-Lesing 4
STRINGE [Hoofstuk 4.4] Die string-instruksies laat jou toe om groot blokke data rond te skuif of te vergelyk. Voorbeelde: MOVSB ; ES:[DI] <= DS:[SI] Die greep by adres SI + DS*16 word geplaas in adres DI+ES*16 Die indekse word outomaties aangepas: DI <= DI+1 en SI <= SI+1 indien DF = 0 ("Direction Flag") DI <= DI-1 en SI <= SI-1 indien DF =1 Die adres word dus outomaties geïnkrementeer (of gedekrementeer) vir die daaropvolgende MOVSB RS245-2003-Lesing 4
Voorbeeld: CLD; (* CLEAR DF *) MOV SI,1000H; (* SI <= 1000H *) MOV DI,2000H; (* DI <= 2000H *) MOVSB; (* ES:[2000H] <= DS:[1000H] *) MOVSB; (* ES:[2001H] <= DS:[1001H] *) MOVSB; (* ES:[2002H] <= DS:[1002H] *) MOVSB; (* ens *) Dieselfde resultaat kan met behulp van die REP PREFIX bereik word RS245-2003-Lesing 4
Voorbeeld: CLD; (* CLEAR DF *) MOV SI,1000H; (* SI <= 1000H *) MOV DI,2000H; (* DI <= 2000H *) MOV CX,40H; (* CX <= 40H *) REP MOVSB (* ES:2000H tot 203FH <= DS:1000H tot 103FH *) CX word met een gedekrementeer vir elke herhaling van die MOVSB-instruksie totdat CX = 0. Sommige van die string-instruksies soos SCASB en CMPSB maak gebruik van beide die CX register en die zero-vlaggie. Kyk self na : LODSB, LODSW, STOSB, STOSW RS245-2003-Lesing 4
XLAT [HOOFSTUK 4.5] Die greep by adres AL+BX+DS*16 word in AL geplaas. Dit word gebruik vir opsoektabelle. Tabel Adres Data 0B0A0 0AH 0B0A1 12H 0B0A2 32H 0B0A3 53H ens Met BX= A0, DS=0B00 en AL=2 sal XLAT 32H in AL laai. Kyk self na XCHG RS245-2003-Lesing 4
IN en OUT [Ons kyk later in meer detail na I/O] IN en OUT instruksies word gebruik om data te lees van of te skryf na randapparaat (bv. die sleutelbord, seriepoort of gonser.) Die gonser word byvoorbeeld aangeskakel deur: in al,61H or al,03H out 61H,al …. en afgeskakel deur: in al,61H and al,0FCH out 61H,al Nota: Dit sal net 'n geluid maak as die frekwensie gestel is: Bv: mov al,0b6H out 43h,al mov al,90H out 42h,al mov al,0AH out 42h,al frekwensie ~ 1.19MHz/(0A90H) RS245-2003-Lesing 4
Let op die gebruik van die logiese funksies OR en AND. Die poort het 8 bisse waarvan ons die mins-belangrike twee bisse gelyk aan '1' moet stel om die gonser aan te skakel. Die ander bisse moet onveranderd gelaat word aangesien hulle niks met die gonser te doen het nie. Gestel die poort se bisse was 00111100 in al,61H al = 00111100 or al,03H al = 00111111 (omdat 03H=00000011) out 61H,al poort = 00111111 in al,61H al=00111111 and al,0FCH al=00111100 (omdat FCH=11111100) out 61H,al poort=00111100 RS245-2003-Lesing 4
SEGMENT OVERRIDE [Hoofstuk 4.6] Die segmentregisters word normaalweg met bepaalde afsetregisters geassosieer: CS IP SS SP (PUSH en POP) BP (MOV) DS BX,DI (MOV) SI (MOV en MOVS) ES DI (MOVS) In die geval van die MOV-instruksie kan ons 'n ander segmentregister forseer: BV MOV DS:[BP],CX Die woord in CX word geskryf in die geheue by adres BP + DS*16 (in plaas van BP + SS*16) RS245-2003-Lesing 4
Beeper.asm ; ««««««««««««««««««««««««««««««««««««««««««««««««««««« .MODEL small .8086 ;««««««««««««««««««««««««««««««««««««««««««««««««««««« .DATA ; «««««««««««««««««««««««««««««««««««««««««««««««««««« .CODE public BeepAan_ public BeepAf_ RS245-2003-Lesing 4
Beeper.asm (vervolg) BeepAan_ : ;stel gonser frekwensie en skakel aan push ax mov al,0b6H out 43h,al mov al,90H out 42h,al mov al,0AH out 42h,al in al,61H or al,03H out 61H,al pop ax ret 0 RS245-2003-Lesing 4
Beeper.asm ( vervolg ) BeepAf_ : ;skakel gonser af push ax in al,61H and al,0FCH out 61H,al pop ax ret 0 END RS245-2003-Lesing 4
Beeper.h extern void BeepAan(); extern void BeepAf(); Beepdemo.c #include <conio.h> //biblioteek vir getche #include <beeper.h> int main() { char kar; do { kar = getche(); //kry en vertoon sleutel wat gedruk is if (kar=='a') BeepAan(); else BeepAf(); } while (kar != 'x'); return 0; } RS245-2003-Lesing 4