170 likes | 335 Views
8086 INSTRUKSIESTEL. SPRONGE : JMP VOORWAARDELIKE SPRONGE: JZ, JA, JG ens LUSSE: LOOP PROSEDURES: CALL en RET ONDERBREKINGS. SPRONGE [Hoofstuk 6.1] Onvoorwaardelike spronge:. JMP LABL1; (* IP <= IP + (LABL1 - IP) *) Maksimum sprong vir 'n 'SHORT' JMP : +127 tot - 128
E N D
8086 INSTRUKSIESTEL SPRONGE : JMP VOORWAARDELIKE SPRONGE: JZ, JA, JG ens LUSSE: LOOP PROSEDURES: CALL en RET ONDERBREKINGS RS245-2003-Lesing 6
SPRONGE [Hoofstuk 6.1] Onvoorwaardelike spronge: JMP LABL1; (* IP <= IP + (LABL1 - IP) *) Maksimum sprong vir 'n 'SHORT' JMP : +127 tot - 128 JMP NEAR LABL1; (* IP <= LABL1 *) Spring na enige plek binne die segment. JMP FAR LABL1; (* IP <= OFFSET LABL1 CS <= SEGMENT LABL1 *) RS245-2003-Lesing 6
VOORWAARDELIKE SPRONGE NB: ALMAL "SHORT" VOORBEELDE: Toets "Zero flag" ZF =1 vir zero resultaat CMP AL,AH; JZ LABL1; (* JMP as ZF = 1 *) Toets "Sign flag" SF=1 vir negatiewe resultaat SUB AL,BL; JS LABL1; (* JMP as SF =1*) RS245-2003-Lesing 6
Watter een van hierdie twee getalle is die grootste: 10000000 of 01111111 ? MOV AL,128 MOV BL,127 CMP AL,BL JA LABL1; (* JMP Above: as AL > BL. Sprong sal in hierdie geval plaasvind *) CMP AL,BL; JG LABL1; (* JMP Greater: as AL > BL. Sprong vind nie plaas nie want jy sê vir die 8086 dit is 2's komplemente getalle. Dus 10000000 = -128 en 01111111 =127 *) RS245-2003-Lesing 6
Daar is 'n groot aantal voorwaardelike spronge en party het twee name, byvoorbeeld JE en JZ JNBE EN JA. Kyk self na tabel 6-1. JB "jump below" en JL "jump less" is net soos JA en JG bedoel vir getalle sonder teken en 2's komplemente getalle. (JECXZ is nie van toepassing op die 8086 nie) RS245-2003-Lesing 6
LOOP LOOP word gebruik om 'n groep instruksies te herhaal. Die aantal herhalings word deur CX bepaal. CX word aan die einde van die "LOOP" gedekrementeer. LOOP keer terug na die Etiket as CX ongelyk is aan zero. XOR AX,AX MOV CX,20H Etiket: ADD AL,[SI] INC SI LOOP Etiket (* Bereken die som van 20H getalle in die datasegment. Die getalle is by afsetadres [SI], [SI+1],……[SI+1F] *) Kyk self na LOOPE en LOOPNE. CX word ook in die REP MOVS ens as teller gebruik RS245-2003-Lesing 6
PROSEDURES: CALL en RET [Hoofstuk 6.3] 'n Groep instruksies wat 'n bepaalde taak moet verrig (byvoorbeeld om 'n karakter op die skerm te skryf) word dikwels in 'n Prosedure (Funksie) geplaas. Die prosedure se instruksies verskyn slegs een maal in die geheue. 'n CALL instruksie word gebruik om die prosedure uit te voer en die RET instruksie om terug te keer. Waarom kan 'n JMP instruksie nie gebruik word nie? RS245-2003-Lesing 6
Hoofprogram "Funksie" .......................................JMP .......................................JMP ........................................................................................................ Dit is nie geskik vir 'n funksie nie aangesien jy altyd na dieselfde plek in die program terugkeer - jy kan die "funksie" dus slegs van een plek in jou program "roep" (as jy nie bykomende kode wil skryf nie.) RS245-2003-Lesing 6
Kan funksie van enige plek in die program roep en dit keer terug na die regte plek. Die Call-instruksie plaas die afsetadres van Funksie in IP en PUSH die terugkeer adres op die STAPEL. Die RET-instruksie POP die terugkeeradres van die stapel in IP. Hoofprogram Funksie ....................................... RET ....................................... CALL .................................................... CALL ................................................. RS245-2003-Lesing 6
Daar is aanvaar dat die CALL in die vorige voorbeeld 'n prosedure in dieselfde segment geroep het - dus 'n NEAR CALL. Dit is ook moontlik om prosedures in 'n ander segment te roep met 'n FAR CALL. In die geval van 'n FAR CALL word beide die CS en die IP op die stapel bewaar en IP en CS gelaai met die segment en afset van die prosedure wat geroep word. Die prosedure word met 'n FAR RET afgesluit om die IP en CS registers te laai met die adres wat op die stapel bewaar is. In tutoriaal 2 moes ons seker maak dat Watcom 'n "small memory model" gebruik wat beteken dat slegs NEAR CALL's gegenereer word en ons "retn" in die MASM32 kon gebruik om terug te keer. RS245-2003-Lesing 6
ONDERBREKINGS (INTERRUPTS) [Hoofstuk 6.4] program Die 8086 maak voorsiening vir beide sagteware en hardeware onderbrekings. 'n Hardeware onderbreking kan (wanneer toegelaat) 'n program stop, 'n prosedure uitvoer en weer terugkeer na die onderbreekte program. 'n Sagteware INT-instruksie kan ook gebruik word om 'n onderbrekings- funksie te roep. ............................................................................................................................................................................................................................ onderbreking onderbrekings funksie ............................................................................IRET Elke keer as jy 'n sleutel op 'n rekenaar se sleutelbord druk, veroorsaak jy 'n onderbreking. RS245-2003-Lesing 6
ONDERBREKINGSTABEL Die 8086 maak van 'n tabel gebruik om die adresse van die onderbrekingsprosedures te stoor. Onderbrekings word genommer (van 0 tot 255). Aangesien die segment (2 grepe) en afset (2 grepe) van die prosedure bekend moet wees, is daar 4 grepe in die tabel vir elke onderbreking. Onderbreking 0 se adres word by geheueadres 0 gestoor. Onderbreking N se adres by geheueadres 4xN gestoor. RS245-2003-Lesing 6
Die instruksie INT N PUSH die IP en CS waardes op die stapel (soos in die geval van 'n FAR CALL) en laai dan IP en CS met die waardes in die tabel (by adres 4xN). Byvoorbeeld: INT 3 Die INT 3 instruksie lei tot die volgende: SP<= SP-2 [SS:SP]<=Flags ( INT stoor eers die vlaggies ) SP<= SP-2 [SS:SP]<=CS SP<=SP-2 [SS:SP]<=IP IP<=[0000:000C] (3*4 = C) CS<=[0000:000E] Die INT 3 onderbrekingsfunksie se eerste instruksie se adres moet dus in die tabel geplaas word by 0000C tot 000F. Aan die einde van die onderbrekingsfunksie word 'n IRET instruksie gebruik om terug te keer. IRET POP IP, CS en die vlaggies van die stapel. RS245-2003-Lesing 6
program ................................................................................ INT 3 ................................................................................ Die INT 3 instruksie is 'n enkelgreep instruksie en word normaalweg in ontfouters ("debuggers") benut. Die ontfouter plaas die INT 3 instruksie in die program wat ontfout word. Die INT 3 onderbrekingsfunksie kan dan byvoorbeeld die registers se waardes vertoon. onderbreking onderbrekings funksie ............................................................................IRET RS245-2003-Lesing 6
INT 1 Die INT 1 instruksie word outomaties na elke instruksie uitgevoer as die TRAP FLAG gestel is. Dit word deur ontfouters gebruik om "single stepping" te doen. LW dit is nie nodig om INT 1 instruksies in die program te plaas nie. Die TRAP FLAG word herstel sodra die INT 1 onderbreking begin. Waarom? program ........................................................................................................................ onderbreking onderbrekings funksie ............................................................................IRET RS245-2003-Lesing 6
INTO "Interrupt on overflow" veroorsaak 'n tipe 4 onderbreking as die "overflow" vlaggie gestel is. As die overflow vlaggie nie gestel is nie doen INTO niks nie. STOOR VAN VLAGGIES TYDENS ONDERBREKINGSDie vlaggie word gestoor aangesien hardeware onderbrekings op enige tydstip kan plaasvind en die toestand van die vlaggies na die onderbreking herstel moet word: CMP AX,BX JZ Iewers Indien 'n onderbreking net na die uitvoering van die CMP instruksie plaasvind en nie die toestand van die vlaggies herstel nie, gaan die JZ instruksie nie noodwendig korrek werk nie. RS245-2003-Lesing 6
Oefening: Skryf 'n funksie: char Bisomkeer(char); Die funksie onvang 'n greep en keer die greep om sodat die mins-belangrike bis die mees-belangrike bis word en omgekeerd: bv: 10110011 word 11001101 Soek na die kortste moontlike oplossing. Hierdie tipe funksie word in seinverwerking benut. RS245-2003-Lesing 6