Ovillkorliga övergångar. Grunderna i programmering av MP-enheter (föreläsning) Styröverföringskommandon

  • 10.01.2024

Tillsammans med medel för aritmetiska beräkningar har miockså medel för logisk datakonvertering. Med logiskt menar vi sådana datatransformationer, som är baserade på regler för formell logik.

Formell logik fungerar på nivån av sanna och falska påståenden. För en mikroprocessor betyder detta vanligtvis 1 respektive 0. Datorn är infödd i språket nollor och ettor, men den minsta dataenheten som maskininstruktioner fungerar på är byten. Men på systemnivå är det ofta nödvändigt att kunna arbeta på en extremt låg nivå – bitnivån.

Ris. 29. Verktyg för logisk databehandling


Medlen för logisk datatransformation inkluderar logiska kommandon och logiska operationer. Operanden av en assemblerinstruktion kan generellt vara ett uttryck, som i sin tur är en kombination av operatorer och operander. Bland dessa operatorer kan det också finnas operatorer som implementerar logiska operationer på uttrycksobjekt.

Innan vi undersöker dessa verktyg i detalj, låt oss överväga vad själva logiska data är och vilka operationer som utförs på den.

Logisk data

Den teoretiska grunden för logisk databehandling är formell logik. Det finns flera logiksystem. En av de mest kända är propositionskalkyl. Ett uttalande är vilket som helst uttalande som kan sägas till antingen Sann, eller falsk.

Propositionskalkyl är en uppsättning regler som används för att fastställa sanningen eller falskheten i en kombination av påståenden.

Propositionskalkyl är mycket harmoniskt kombinerat med principerna för datordrift och de grundläggande metoderna för att programmera den. Alla datorhårdvarukomponenter är byggda på logiska chips. Systemet för att representera information i en dator på den lägsta nivån bygger på begreppet en bit. Lite, med bara två tillstånd (0 (falskt) och 1 (sant)), passar naturligt in i propositionskalkylen.

Enligt teorin kan följande logiska operationer utföras på satser (på bitar).


1. Negation (logisk INTE) - en logisk operation på en operand vars resultat är inversen av den ursprungliga operanden.

Denna operation kännetecknas unikt av följande sanningstabell (tabell 12).

Tabell 12. Sanningstabell för logisk negation

2. Logiskt tillägg (logiskt inklusive ELLER) - en logisk operation på två operander vars resultat är sant (1) om en eller båda operanderna är sanna (1), och falskt (0) om båda operanderna är falska (0).

Denna operation beskrivs med hjälp av följande sanningstabell (tabell 13).

Tabell 13. Sanningstabell för logiskt inkluderande ELLER

3. Logisk multiplikation (logisk OCH) - en logisk operation på två operander som utvärderas till sann (1) endast om båda operanderna utvärderas till sann (1). I alla andra fall är värdet på operationen falskt (0).

Denna operation beskrivs med hjälp av följande sanningstabell (tabell 14).

Tabell 14. Sanningstabell för logiskt OCH

4. Logiskt exklusivt tillägg (logiskt exklusivt ELLER) - en logisk operation på två operander vars resultat är sant (1) om endast en av de två operanderna är sann (1), och falskt (0) om båda operanderna är falska (0) eller "sanning" (1). Denna operation beskrivs med hjälp av följande sanningstabell (tabell 15).

Tabell 15. Sanningstabell för logiskt exklusivt ELLER

Miinnehåller fem instruktioner som stödjer dessa operationer. Dessa instruktioner utför logiska operationer på operandernas bitar. Måtten på operanderna måste naturligtvis vara desamma. Till exempel, om storleken på operanderna är ett ord (16 bitar), utförs den logiska operationen först på nollbitarna i operanderna, och dess resultat skrivs i stället för bit 0 i resultatet. Sedan upprepar kommandot sekventiellt dessa åtgärder på alla bitar från den första till den femtonde.

Logiska kommandon

Mihar följande uppsättning kommandon som stöder arbete med logiska data:

1) och operand_1, operand_2 – logisk multiplikationsoperation. Kommandot utför en bitvis logisk OCH-operation (konjunktion) på bitarna i operanderna operand_1 och operand_2. Resultatet skrivs till operand_1;

2) og operand_1, operand_2 – logisk additionsoperation. Kommandot utför en bitvis logisk ELLER-operation (disjunktion) på bitarna i operanderna operand_1 och operand_2. Resultatet skrivs till operand_1;

3) hog operand_1, operand_2 – logisk exklusiv additionsoperation. Instruktionen utför en bitvis logisk exklusiv ELLER-operation på bitarna i operanderna operand_1 och operand_2. Resultatet skrivs i stället för operanden;

4) testa operand_1, operand_2 – "kontrollera" operation (med logisk multiplikation). Kommandot utför en bitvis logisk AND-operation på bitarna i operanderna operand_1 och operand_2. Tillståndet för operanderna förblir detsamma, endast flaggorna zf, sf och pf ändras, vilket gör det möjligt att analysera tillståndet för individuella bitar av operanden utan att ändra deras tillstånd;

5) inte operand – logisk negationsoperation. Kommandot utför en bitvis inversion (ersätter värdet med det motsatta) av varje bit i operanden. Resultatet skrivs i stället för operanden.

För att förstå vilken roll logiska instruktioner har i miär det mycket viktigt att förstå omfattningen av deras tillämpning och typiska tekniker för att använda dem i programmering.

Det är möjligt att använda logiska kommandon tilldelning enskilda bitar i operanden i syfte att ställa in, återställa, invertera eller helt enkelt kontrollera efter ett visst värde.

För att organisera sådant arbete med bitar spelar operand_2 vanligtvis rollen som en mask. Med hjälp av de bitar som är inställda i 1 bit av denna mask, bestäms de operand_1-bitar som behövs för en specifik operation. Låt oss visa vilka logiska kommandon som kan användas för detta ändamål:

1) för att sätta vissa bitar till 1, använd kommandot og operand_1, operand_2.

I denna instruktion måste operand_2, som fungerar som en mask, innehålla en bit i stället för de bitar som ska sättas till 1 i operand_1;

2) för att återställa vissa bitar till 0, använd kommandot och operand_1, operand_2.

I denna instruktion måste operand_2, som fungerar som en mask, innehålla noll bitar istället för de bitar som ska sättas till 0 i operand_1;

3) kommandot hog operand_1, operand_2 tillämpas:

a) för att ta reda på vilka bitar i operand_1 och operand som är olika;

b) att invertera tillståndet för de specificerade bitarna i operand_1.

När du kör hog-kommandot måste bitarna i masken som intresserar oss (operand_2) vara en, resten måste vara noll;

För att kontrollera statusen för de angivna bitarna, använd kommandot test operand_1, operand_2 (check operand_1).

De kontrollerade bitarna av operand_1 i masken (operand_2) måste ha värdet ett. Funktionen för testkommandot liknar algoritmen för kommandot och, men den ändrar inte värdet på operand_1. Resultatet av kommandot är att ställa in värdet på nollflaggan zf:

1) om zf = 0, så resulterade den logiska multiplikationen i ett nollresultat, dvs en enhetsbit av masken, som inte matchade motsvarande en bit av operanden;

2) om zf = 1, så resulterade den logiska multiplikationen i ett resultat som inte är noll, dvs. åtminstone ett den ena biten av masken matchar motsvarande en bit av operand_1.

För att reagera på resultatet av testkommandot är det tillrådligt att använda hoppkommandot jnz etikett (Jump if Not Zero) - hopp om nollflaggan zf inte är noll, eller ett kommando med motsatt åtgärd - jz etikett (Jump om noll) - hoppa om nollflaggan zf = 0.

De följande två kommandona söker efter den första biten i operanden inställd på 1. Du kan söka från början eller slutet av operanden:

1) bsf operand_1, operand_2 (Bit Scanning Forward) – skannar bitar framåt. Instruktionen skannar bitarna av operand_2 från minst signifikant till mest signifikant (från bit 0 till mest signifikant bit) och letar efter den första biten som är satt till 1. Om en hittas, skrivs numret på denna bit in i operand_1 som ett heltalsvärde. Om alla bitar av operand_2 är 0, så sätts nollflaggan zf till 1, annars återställs zf-flaggan till 0;

2) bsr operand_1, operand_2 (Bit Scanning Reset) – skannar bitar i omvänd ordning. Instruktionen letar efter (avsöker) bitarna i operand_2 från mest signifikant till minst signifikant (från mest signifikant bit till bit 0) och letar efter den första biten satt till 1. Om en hittas skrivs numret på denna bit in i operand_1 som en heltalsvärde. Det är viktigt att positionen för den första biten till vänster fortfarande räknas i förhållande till bit 0. Om alla bitar i operand_2 är lika med 0, sätts nollflaggan zf till 1, annars återställs zf-flaggan till 0 .

I de senaste modellerna av Intel-mikroprocessorer har flera fler kommandon dykt upp i gruppen logiska kommandon som tillåter åtkomst till en specifik bit av operanden. Operanden kan finnas antingen i minnet eller i ett allmänt register. Bitpositionen specificeras av bitens offset relativt den minst signifikanta biten i operanden. Offsetvärdet kan anges antingen som ett direkt värde eller ingå i ett allmänt register. Du kan använda resultaten av kommandona bsr och bsf som offsetvärde. Alla instruktioner tilldelar värdet på den valda biten till CE-flaggan

1) bt-operand, bitoffset (bittest) – kontrollera biten. Kommandot överför bitvärdet till cf-flaggan;

2) bts operand, bitoffset (Bit Test and Set) – kontrollera och ställa in biten. Instruktionen överför bitvärdet till CF-flaggan och sätter sedan biten som ska testas till 1;

3) btr operationell, bitoffset (Bit Test and Reset) – kontroll och återställning av biten. Instruktionen överför värdet av en bit till CF-flaggan och sätter sedan denna bit till 0;

4) btc-operand, bitoffset (bittest och konvertera) – kontrollera och invertera biten. Instruktionen överför värdet på en bit till cf-flaggan och inverterar sedan värdet på den biten.

Skiftkommandon

Instruktionerna i denna grupp ger också manipulation av enskilda bitar av operanderna, men på ett annat sätt än de logiska instruktionerna som diskuterats ovan.

Alla skiftinstruktioner flyttar bitar i operandfältet till vänster eller höger beroende på opkoden. Alla skiftinstruktioner har samma struktur - polisoperand, shift_counter.

Antal skiftade bitar – shift_counter –är placerad i stället för den andra operanden och kan specificeras på två sätt:

1) statiskt, vilket innebär att specificera ett fast värde med hjälp av en omedelbar operand;

2) dynamiskt, vilket innebär att lagra skifträknarvärdet i cl-registret innan skiftinstruktionen exekveras.

Baserat på storleken på cl-registret är det tydligt att skifträknarens värde kan variera från 0 till 255. Men i själva verket är detta inte helt sant. För optimeringsändamål accepterar mikroprocessorn endast värdet fem minst signifikanta bitar räknare, dvs värdet varierar från 0 till 31.

Alla skiftkommandon sätter bärflaggan jfr.

När bitar skiftas bortom operanden, träffar de först bärflaggan och sätter den lika med värdet på nästa bit som hamnar utanför operanden. Var denna bit går härnäst beror på typen av skiftinstruktion och programalgoritmen.

Baserat på driftsprincipen kan skiftkommandon delas in i två typer:

1) linjära skiftkommandon;

2) cykliska växlingskommandon.

Linjära skiftkommandon

Kommandon av denna typ inkluderar kommandon som utför ett skift enligt följande algoritm:

1) nästa "pushade" bit sätter CF-flaggan;

2) biten som införs i operanden från den andra änden har värdet 0;

3) när nästa bit skiftas, går den in i CF-flaggan, och värdet på den föregående skiftade biten går förlorat! Linjära skiftkommandon är indelade i två undertyper:

1) logiska linjära skiftkommandon;

2) aritmetiska linjära skiftkommandon.

Logiska linjära skiftkommandon inkluderar följande:

1) shl operand, shift_counter (Shift Logical Left) – logisk växling till vänster. Innehållet i operanden skiftas åt vänster med antalet bitar som bestäms av shift_count-värdet. Till höger (i positionen för den minst signifikanta biten) matas nollor;

2) shr operand, shift_counter (Shift Logical Right) – logisk växling till höger. Innehållet i operanden skiftas åt höger med antalet bitar som bestäms av shift_count-värdet. Till vänster (i positionen för den mest signifikanta teckenbiten) matas nollor in.

Figur 30 visar hur dessa kommandon fungerar.

Ris. 30. Funktionsschema för linjära logiska skiftkommandon


Aritmetiska linjära skiftinstruktioner skiljer sig från logiska skiftinstruktioner genom att de verkar på ett speciellt sätt på operandens teckenbit.

1) sal operand, shift_counter (Shift Arithmetic Left) – aritmetisk förskjutning till vänster. Innehållet i operanden skiftas åt vänster med antalet bitar som bestäms av shift_count-värdet. Till höger (i positionen för den minst signifikanta biten) finns nollor. Sal kommandot bevarar inte tecken, men sätter flagga med/vid teckenbyte ytterligare en infällbar bit. Annars är kommandot sal helt likt kommandot shl;

2) sar operand, shift_counter (Skift Aritmetic Right) – aritmetiskt skift till höger. Innehållet i operanden förskjuts åt höger med antalet bitar som bestäms av värdet shift_counter. Till vänster skrivs nollor in i operanden. Kommandot sar bevarar tecknet och återställer det efter att ha flyttat varje nästa bit.

Figur 31 visar hur linjära aritmetiska skiftinstruktioner fungerar.


Ris. 31. Funktionsschema för linjära aritmetiska skiftkommandon

Rotera kommandon

Rotate shift-kommandon är kommandon som lagrar värdena för de bitar som skiftas. Det finns två typer av rotationskommandon:

1) enkla cykliska växlingskommandon;

2) cykliska växlingskommandon via bärflaggan jfr.

Till lagen enkel cyklisk skift inkluderar:

1) rol operand, shift_counter (Rotera vänster) – cyklisk växling åt vänster. Innehållet i operanden flyttas åt vänster med antalet bitar som bestäms av operanden shift_counter. Vänsterskiftade bitar skrivs till samma operand till höger;

2) gog operand, shift_counter (rotera höger) – cyklisk växling till höger. Innehållet i operanden förskjuts åt höger med antalet bitar som bestäms av operanden shift_counter. Högerskiftade bitar skrivs till samma operand till vänster.

Ris. 32. Funktionsschema för enkla cykliska växlingskommandon


Som framgår av figur 32 utför enkla cykliska skiftinstruktioner en användbar åtgärd under sin funktion, nämligen: den cykliskt skiftade biten skjuts inte bara in i operanden från den andra änden, utan samtidigt blir dess värde värdet av CE flagga

Rotera kommandon via bärflagga CF skiljer sig från enkla cykliska skiftkommandon genom att biten som skiftas inte omedelbart går till operanden från sin andra ände, utan skrivs först till bärflaggan CE Endast nästa exekvering av denna skiftinstruktion (förutsatt att den exekveras i en slinga) resulterar i att den tidigare skiftade biten placeras i den andra änden av operanden(Fig. 33).

Till cykliska växlingskommandon via bärflagga följande är relaterade:

1) rcl-operand, shift_counter (Rotera genom Carry Left) – cyklisk växling till vänster genom carry.

Innehållet i operanden flyttas åt vänster med antalet bitar som bestäms av operanden shift_counter. De skiftade bitarna blir växelvis värdet på bärflaggan, jfr.

2) rcg-operand, shift_counter (Rotate through Carry Right) – cyklisk växling till höger genom carry.

Innehållet i operanden förskjuts åt höger med antalet bitar som bestäms av operanden shift_counter. De skiftade bitarna blir växelvis värdet på bärflaggan CF.

Ris. 33. Cyklisk växlingskommandon via bärflagga CF


Från figur 33 är det tydligt att när man växlar genom bärflaggan uppträder ett mellanliggande element, med vars hjälp i synnerhet det är möjligt att ersätta cykliskt skiftade bitar, i synnerhet, missanpassning bitsekvenser.

Med felmatchning av en bitsekvens i det följande menar vi en åtgärd som gör att vi på något sätt kan lokalisera och extrahera de nödvändiga avsnitten av denna sekvens och skriva dem till en annan plats.

Ytterligare skiftkommandon

Kommandosystemet för de senaste Intel-mikroprocessormodellerna, som börjar med i80386, innehåller ytterligare skiftkommandon som utökar de möjligheter som vi diskuterade tidigare. Dessa är skiftkommandon Dubbel precision: 1) shld operand_1, operand_2, shift_counter – dubbel precision vänsterväxling. Kommandot shld utför en ersättning genom att flytta bitarna i operand_1 åt vänster, fylla dess bitar till höger med värdena för bitarna förskjutna från operand_2 enligt diagrammet i fig. 34. Antalet bitar som ska skiftas bestäms av värdet shift_counter, operand_2ändras inte.


Ris. 34. Schema för shld-kommandot


2) shrd operand_1, operand_2, shift_counter – högerväxling med dubbel precision. Instruktionen utför ersättningen genom att skifta bitarna i operand_1 åt höger, fylla dess bitar till vänster med värdena för bitarna förskjutna från operand_2 enligt diagrammet i figur 35. Antalet skiftade bitar bestäms av värdet shift_counter, som kan ligga i intervallet 0...31. Detta värde kan anges som en omedelbar operand eller ingå i cl-registret. Menande operand_2ändras inte.

Ris. 35. Schema för shrd-kommandot


Som vi noterade utför kommandona shld och shrd skiftningar på upp till 32 bitar, men på grund av särdragen med att specificera operanderna och operationsalgoritmen kan dessa kommandon användas för att arbeta med fält upp till 64 bitar långa.

2. Kontrollöverföringskommandon

Vi mötte några av lagen som utgör linjär avsnitt av programmet. Var och en av dem utför vanligtvis några åtgärder för att konvertera eller överföra data, varefter mikroprocessorn överför kontrollen till nästa kommando. Men väldigt få program fungerar på ett så konsekvent sätt. Det finns vanligtvis punkter i ett program där ett beslut måste tas om vilket kommando som ska utföras härnäst. Denna lösning kan vara:

1) ovillkorlig - vid denna tidpunkt är det nödvändigt att överföra kontrollen inte till nästa kommando, utan till ett annat, som ligger på ett visst avstånd från det aktuella kommandot;

2) villkorlig - Beslutet om vilket kommando som kommer att utföras härnäst görs baserat på analysen av vissa villkor eller data.

Ett program är en sekvens av kommandon och data som upptar en viss mängd RAM-utrymme. Detta minnesutrymme kan antingen vara sammanhängande eller bestå av flera fragment.

Mikroprocessorn vet vilken programinstruktion som ska exekveras härnäst av innehållet i ett par register cs:(e)ip:

1) cs – segmentkodregister, som innehåller den fysiska (bas)adressen för det aktuella kodsegmentet;

2) eip/ip – instruktionspekarregister, som innehåller ett värde som representerar minnesoffset för nästa instruktion som ska exekveras relativt början av det aktuella kodsegmentet.

Vilket specifikt register som kommer att användas beror på om adresseringsläget är inställt på use16 eller use32. Om användning 16 anges används ip, om use32 används eip.

Sålunda ändrar styröverföringsinstruktioner innehållet i cs- och eip/ip-registren, som ett resultat av vilket mikroprocessorn väljer för exekvering inte nästa programkommando i ordningen, utan ett kommando i någon annan sektion av programmet. Transportören inuti mikroprocessorn återställs.

Baserat på operationsprincipen kan mikroprocessorkommandon som säkerställer organisationen av övergångar i programmet delas in i 3 grupper:

1. Kommandon för ovillkorlig överföring av kontroll:

1) ovillkorligt hoppkommando;

2) kommando att anropa en procedur och återvända från en procedur;

3) kommando för att anropa programvaruavbrott och återgå från programavbrott.

2. Villkorlig överföring av kontrollkommandon:

1) hoppkommandon baserat på resultatet av sidjämförelsekommandot;

2) övergångskommandon baserade på tillståndet för en viss flagga;

3) kommandon för att navigera genom innehållet i ecx/cx-registret.

3. Cykelkontrollkommandon:

1) kommando för att organisera en cykel med en räknare ecx/cx;

2) ett kommando för att organisera en cykel med en ecx/cx-räknare med möjlighet att tidigt lämna cykeln under ett ytterligare villkor.

Ovillkorliga hopp

Den tidigare diskussionen har avslöjat några detaljer om övergångsmekanismen. Hoppinstruktioner modifierar eip/ip-instruktionspekarregistret och eventuellt cs-kodsegmentregistret. Vad exakt som behöver ändras beror på:

1) på typen av operand i det ovillkorliga hoppkommandot (nära eller långt);

2) från indikeringen före hoppadressen (i hoppkommandot) modifierare; i detta fall kan själva hoppadressen placeras antingen direkt i kommandot (direkt hopp), eller i ett register eller minnescell (indirekt hopp).

Modifierare kan ta följande värden:

1) near ptr – direkt övergång till en etikett inom det aktuella kodsegmentet. Endast eip/ip-registret modifieras (beroende på den specificerade typen av kodsegment use16 eller use32) baserat på adressen (etiketten) som anges i kommandot eller ett uttryck som använder värdeextraktionstecknet - $;

2) far ptr – direkt övergång till en etikett i ett annat kodsegment. Hoppadressen anges som en omedelbar operand eller adress (etikett) och består av en 16-bitars väljare och en 16/32-bitars offset, som laddas in i cs- respektive ip/eip-registren;

3) ord ptr – indirekt övergång till en etikett inom det aktuella kodsegmentet. Endast eip/ip modifieras (genom offsetvärdet från minnet på adressen som anges i kommandot, eller från registret). Offsetstorlek 16 eller 32 bitar;

4) dword ptr – indirekt övergång till en etikett i ett annat kodsegment. Båda registren – cs och eip/ip – modifieras (med ett värde från minnet - och endast från minnet, från ett register). Det första ordet/dordet i denna adress representerar förskjutningen och laddas in i ip/eip; det andra/tredje ordet laddas in i cs. jmp ovillkorligt hoppkommando

Syntaxen för det ovillkorliga hoppkommandot är jmp [modifier] jump_address - ett ovillkorligt hopp utan att lagra information om returpunkten.

Hoppadress är antingen en etikettadress eller adressen till minnesområdet där hopppekaren finns.

Totalt innehåller miflera instruktionskoder för jmp ovillkorliga hoppmaskin.

Deras skillnader bestäms av övergångsavståndet och metoden för att specificera måladressen. Räckviddövergången bestäms av platsen för operanden transition_address. Denna adress kan finnas i det aktuella kodsegmentet eller i något annat segment. I det första fallet kallas övergången intrasegmental, eller älskade, på sekunden - intersegmentell, eller avlägsen Ett hopp inom segmentet förutsätter att endast innehållet i eip/ip-registret ändras.

Det finns tre alternativ för användning av kommandot jmp inom segmentet:

1) rakt kort;

2) rak;

3) indirekt.


Förfaranden

Assembly language har flera verktyg som löser problemet med att duplicera delar av programkoden. Dessa inkluderar:

1) mekanism för procedurer;

2) makrosamlare;

3) avbrottsmekanism.

Proceduren, ofta kallad subrutin - detta är den grundläggande funktionella enheten för nedbrytning (uppdelning i flera delar) för någon uppgift. En procedur är en grupp av kommandon för att lösa en specifik deluppgift och har möjlighet att erhålla kontroll från punkten att anropa en uppgift på högre nivå och återföra kontrollen till denna punkt.

I det enklaste fallet kan ett program bestå av en procedur. Med andra ord kan en procedur definieras som en korrekt formaterad uppsättning kommandon, som, när de väl har beskrivits, kan anropas, om nödvändigt, var som helst i programmet.

För att beskriva en sekvens av kommandon som en procedur använder assemblerspråk två direktiv: PROC och ENDP.

Syntaxen för att beskriva proceduren är som följer (fig. 36).


Ris. 36. Syntax för att beskriva en procedur i ett program


Från figur 36 kan man se att i procedurhuvudet (PROC-direktivet) krävs endast procedurnamnet. Bland det stora antalet operander i PROC-direktivet förtjänar [avstånd] särskilt omnämnande. Detta attribut kan ta värden nära eller långt och kännetecknar möjligheten att anropa en procedur från ett annat kodsegment. Som standard är [distance]-attributet inställt på nära.

Proceduren kan placeras var som helst i programmet, men på ett sådant sätt att kontrollen inte faller på den av misstag. Om en procedur helt enkelt infogas i den allmänna kommandoströmmen, kommer mikroprocessorn att uppfatta procedurkommandona som en del av detta flöde och kommer följaktligen att utföra procedurkommandona.

Villkorliga hopp

Mikroprocessorn har 18 villkorliga hoppinstruktioner. Dessa kommandon låter dig kontrollera:

1) förhållandet mellan signerade operander ("mer – mindre");

2) förhållandet mellan osignerade operander ("ovan - nedan");

3) tillstånd för aritmetiska flaggor ZF, SF, CF, OF, PF (men inte AF).

De villkorliga hoppkommandona har samma syntax:

jcc transition_label

Som du kan se börjar mnemonkoden för alla kommandon med "j" - från ordet hoppa(studsa), henne - definierar det specifika tillståndet som analyseras av kommandot.

Angående operanden transition_label, då kan denna etikett endast placeras inom det aktuella kodsegmentet; intersegmentöverföring av kontroll i villkorliga övergångar är inte tillåten. I detta avseende försvinner frågan om modifieraren, som fanns i syntaxen för de ovillkorliga hoppkommandona. I tidiga mikroprocessormodeller (i8086, i80186 och i80286) kunde villkorliga hoppinstruktioner bara göra korta hopp - ett avstånd på -128 till +127 byte från instruktionen efter den villkorliga hoppinstruktionen. Från och med mikroprocessormodellen 80386 tas denna begränsning bort, men, som du kan se, endast inom det aktuella kodsegmentet.

För att kunna fatta ett beslut om var kontrollen ska överföras med ett villkorligt hoppkommando måste först ett villkor genereras på grundval av vilket beslutet att överföra kontrollen kommer att tas.

Källorna till ett sådant tillstånd kan vara:

1) varje kommando som ändrar tillståndet för aritmetiska flaggor;

2) kommandosidan för jämförelse, som jämför värdena för två operander;

3) status för ecx/cx-registret.


kommando för cmp jämförelse

Kommandot compare page har en intressant funktionsprincip. Det är absolut samma som subtraktionskommandot - suboperand, operand_2.

Sidkommandot, liksom underkommandot, subtraherar operander och sätter flaggor. Det enda det inte gör är att skriva resultatet av subtraktionen i stället för den första operanden.

Syntaxen för sidkommandot är page operand_1, operand_2 (compare) – jämför två operander och sätter flaggor baserat på jämförelseresultaten.

Flaggor som ställs in av sidkommandot kan analyseras med hjälp av speciella villkorliga grenkommandon. Innan vi tittar på dem, låt oss ägna lite uppmärksamhet åt minnena för dessa villkorliga hoppkommandon (tabell 16). Om du förstår notationen när du skapar namnen på villkorliga hoppkommandon (elementet i namnet på kommandot jcc, angett av oss) kommer det att göra det lättare att memorera dem och ytterligare praktisk användning.

Tabell 16. Betydelse av förkortningar i jcc-kommandonamnet
Tabell 17. Lista över villkorliga hoppkommandon för kommandosidan operand_1, operand_2

Bli inte förvånad över det faktum att samma flaggvärden motsvarar flera olika mnemoniska koder för villkorliga hoppkommandon (de är separerade från varandra med ett snedstreck i Tabell 17). Skillnaden i namn beror på mikroprocessordesigners önskan att göra det lättare att använda villkorliga hoppinstruktioner i kombination med vissa grupper av instruktioner. Därför speglar olika namn snarare olika funktionella inriktningar. Men det faktum att dessa kommandon svarar på samma flaggor gör dem absolut likvärdiga och lika i programmet. Därför är de i Tabell 17 inte grupperade efter namn, utan efter flaggvärdena (villkor) som de reagerar på.


Villkorliga greninstruktioner och flaggor

Mnemoniska notationen för vissa villkorliga hoppkommandon återspeglar namnet på flaggan de arbetar på och har följande struktur: tecknet "j" kommer först. (Hoppa,övergång), den andra är antingen flaggbeteckningen eller negationssymbolen "n", följt av flaggans namn. Denna lagstruktur speglar dess syfte. Om det inte finns något "n"-tecken, kontrolleras flaggans tillstånd, om det är lika med 1, görs en övergång till hoppetiketten. Om tecknet "n" finns, kontrolleras flaggans tillstånd för likhet 0, och om det lyckas görs ett hopp till hoppetiketten.

Kommandomnemoniska koder, flaggnamn och övergångsvillkor anges i Tabell 18. Dessa kommandon kan användas efter alla kommandon som ändrar de angivna flaggorna.

Tabell 18. Villkorliga hoppkommandon och flaggor

Om du tittar noga på tabellerna 17 och 18 kan du se att många av de villkorliga hoppkommandona i dem är likvärdiga, eftersom båda är baserade på analysen av samma flaggor.


Villkorliga hoppinstruktioner och ecx/cx-registret

Mikroprocessorns arkitektur involverar den specifika användningen av många register. Till exempel används EAX/AX/AL-registret som en ackumulator, och BP- och SP-registren används för att arbeta med stacken. ESH/CX-registret har också ett specifikt funktionssyfte: det utför rollen disken i loopkontrollkommandon och när man arbetar med teckensträngar. Det är möjligt att funktionellt sett skulle det villkorliga hoppkommandot som hör samman med ecx/cx-registret vara mer korrekt klassificerat som denna grupp av kommandon.

Syntaxen för detta villkorliga grenkommando är:

1) jcxz jump_label (Hoppa om ex är noll) – hoppa om cx är noll;

2) jecxz jump_label (Jump Equal exx Zero) – hoppa om exx är noll.

Dessa kommandon är mycket praktiska att använda när du organiserar en loop och när du arbetar med teckensträngar.

Det bör noteras att det finns en begränsning i kommandot jcxz/jecxz. Till skillnad från andra instruktioner för överföring av villkorlig kontroll kan jcxz/jecxz-instruktionen endast adressera korta hopp - vid -128 byte eller +127 byte från nästa instruktion.

Organisera cykler

Cykeln är, som du vet, en viktig algoritmisk struktur, utan användningen som förmodligen inte ett enda program kan göra. Du kan organisera cyklisk exekvering av en viss del av programmet, till exempel genom att använda villkorliga överföringskommandon eller det ovillkorliga hoppkommandot jmp. Med denna typ av cykelorganisation utförs alla operationer relaterade till dess organisation manuellt. Men med tanke på vikten av ett sådant algoritmiskt element som en cykel, introducerade mikroprocessorutvecklarna en grupp med tre kommandon i kommandosystemet för att underlätta programmeringen av cykler. Dessa kommandon använder också ecx/cx-registret som cykelräknare.

Låt oss ge en kort beskrivning av dessa kommandon: 1) loop jump_label (loop) – upprepa cykeln. Kommandot låter dig organisera loopar liknande för loopar på högnivåspråk med automatisk minskning av loopräknaren. Teamets uppgift är att göra följande:

b) jämföra ESX/CX-registret med noll: om (ECX/CX) = 0, så överförs styrningen till nästa kommando efter slingan;

2) loope/loopz transition_label

Kommandona loope och loopz är absoluta synonymer. Arbetet med kommandona är att utföra följande åtgärder:

a) minskning av ESH/CX-registret;

c) analys av tillståndet för nollflaggan ZF om (ECX/CX) = 0 eller XF = 0, kontrollen överförs till nästa kommando efter slingan.

3) loopne/loopnz transition_label

Kommandona loopne och loopnz är också absoluta synonymer. Arbetet med kommandona är att utföra följande åtgärder:

a) minskning av ESH/CX-registret;

b) jämföra ESX/CX-registret med noll;

c) analys av tillståndet för nollflaggan ZF: om (ECX/CX) = 0 eller ZF = 1, överförs kontrollen till nästa kommando efter slingan.

Kommandona loope/loopz och loopne/loopnz är omvända i sin funktionsprincip. De utökar handlingen för loop-kommandot genom att dessutom analysera zf-flaggan, vilket gör det möjligt att organisera ett tidigt utträde ur loopen, genom att använda denna flagga som en indikator.

Nackdelen med loop-, loope/loopz- och loopne/loopnz-kommandona är att de bara implementerar korta hopp (från -128 till +127 byte). För att arbeta med långa loopar måste du använda villkorliga grenkommandon och kommandot jmp, så försök att bemästra båda metoderna för att organisera loopar.

Grunderna i programmering av MP-enheter (föreläsning)

FÖRELÄSNINGSPLAN

1. Klassificering av mikroprocessorkommandon

2.Typer av adressering

3. Struktur och kommandoformat för MP KR580VM80

1. Klassificering av mikroprocessorkommandon

Som redan nämnts är den grundläggande fördelen med MP programmerbarhet. Detta innebär att genom att applicera kommandon på MP-ingången är det möjligt att säkerställa önskad sekvens av operationer, d.v.s. implementering av en specifik algoritm. Algoritmen för problemet som ska lösas kan vara hur komplex som helst, det är bara nödvändigt att denna algoritm delas upp i steg i enlighet med MP:s kommandosystem. Därför är kommandosystemet viktigt att inte endast utifrån vad MP kan göra, men också hur algoritmen exekveras. Närvaron eller frånvaron av något kommando eller grupp av kommandon kan avsevärt påverka valet av MP för en viss applikation.

Klassificeringen av MP-kommandon presenteras i figur 8.

Baserat på antalet minnesceller som krävs för att rymma ett kommando, särskiljs kommandon på ett, två eller tre ord långa. Instruktioner som är två eller tre ord långa kräver två eller tre minnesåtkomstcykler för att hämtas.

I många fall, särskilt när man jämför MPs med liknande arkitekturer, är det användbart att klassificera kommandon i enlighet med MP:s arkitektoniska egenskaper.

Ur funktionssynpunkt är teamen indelade i tre stora grupper: överföring, hantering och databehandling. Låt oss i detalj överväga de viktigaste kommandona som används i MP, med hjälp av klassificeringen enligt funktionella egenskaper. Namnen på kommandona kommer att betecknas med ryska ord som indikerar innebörden av de operationer som utförs.

Dataöverföringskommandon tillhandahålla enkel överföring av information utan att utföra några bearbetningsoperationer. Kommandon i denna grupp är uppdelade i kommandon relaterade till minnesåtkomst, registeråtkomstkommandon och in-/utdatakommandon.

Kommandon relaterade till minnesåtkomst inkluderar:

KOM IHÅG(WRITE), genom vilken innehållet i registret skickas till minnescellen.

Kommandon relaterade till överföring av en byte eller ord måste ange numret på ett specifikt register, adressen till minnescellen och, om nödvändigt, numret på lagringsmodulen.

Kommandon associerade med åtkomst till register måste ange numret på informationskällan och numret på resultatregistret. Denna undergrupp av dataöverföringskommandon inkluderar kommandona:

LADDA NER DIREKT, där konstanten som anges i kommandokoden skrivs till registret;

FRAM, genom vilken innehållet i ett register skickas till ett annat.

I/O-kommandon inkluderar:

STIGA PÅ, genom vilken innehållet i inmatningsenheten skickas till MP:ns interna register;

SLUTSATS, där innehållet i det interna registret hos MP (vanligtvis en ackumulator) skickas till utenheten.

Kontrollkommandon , ofta kallade övergångskommandon, låter dig utföra olika åtgärder i enlighet med värdet av externa signaler eller villkor som genereras inom systemet.Alla kontrollkommandon är uppdelade i ovillkorliga och villkorade övergångskommandon.

Ovillkorliga hoppkommandon inkluderar:

Ovillkorligt hopp(BP), enligt vilken innehållet i adressfältet för BP-kommandot skrivs till programräknaren, dvs. tillhandahåller en övergång i programmet till den adress som anges i kommandot;

OVILLKORLIG ÖVERFÖRING MED ÅTERBETALNING(övergång till en subrutin), enligt vilken nytt innehåll skrivs till programräknaren (adressen till subrutinens första kommando), men till skillnad från BP-kommandot sparas programräknarens tillstånd och vissa andra register i minnet . När en subrutin exekveras på dess sista RETURN-kommando, återställs innehållet i programräknaren och alla register.

Villkorliga hoppinstruktioner kontrollerar tillståndet för en registerbit, flaggvippa eller annan parameter. Resultatet av kontrollen avgör om övergången kommer att utföras eller inte. Vanligtvis utförs övergången om resultatet av kontrollen matchar det villkor som anges i kommandot. Denna undergrupp av kontrollkommandon inkluderar:

VILLKORLIGT HOPP(UP) efter adress. Koden för UP-kommandot måste ange det tillstånd som kontrolleras, för vilket MT använder ett värde på noll eller icke-noll på resultatet, ett positivt eller negativt tecken på resultatet, närvaro eller frånvaro av bärighet signaler, spill etc. När villkoret är uppfyllt skrivs adressräknarens innehåll till programräknaren UE-kommandofält, d.v.s. ger en övergång i programmet till den adress som anges i kommandot. Om villkoret inte är uppfyllt, överförs kontrollen till nästa programkommando;

VILLKORLIG ÖVERGÅNG MED RETUR, vilket skiljer sig från kommandot UNCONDITIONAL JUMP WITH RETURN genom att övergången till subrutinen endast sker när det angivna villkoret är uppfyllt.

Vanligtvis innehåller MP-kommandosystemet flera hjälpkommandon som låter dig styra tillståndet för register eller triggers som påverkar exekveringen av villkorliga övergångar, till exempel: SET FLAG, RESET FLAG, SET BATTERY HIGH BIT, RESET BATTERY HIGH BIT, etc. .

Databearbetningskommandon delas in i aritmetiska och logiska. Aritmetiska inkluderar:

VIKA IHOP innehållet i två register eller ett register och en minnescell;

SUBTRAHERA från innehållet i en minnescell eller ett register, innehållet i ett register;

ÖKA MED 1(INKREMENT) innehållet i en minnescell eller ett register (stackpekare, indexregister, ackumulator);

MINSKA MED 1(DECREMENT) innehållet i en minnescell eller ett register;

LÄGG TILL MED UTFÖR, genom vilken tillägg utförs med hänsyn till tillståndet för överföringstriggern. Detta gör det enkelt att organisera bearbetningen av stora antal;

AVDRAG REDOVISNING LÅNET;

FLYTTA innehållet i en minnescell eller ett register (vanligtvis en bit).

Undergruppen av logiska kommandon inkluderar följande kommandon:

OCH(LOGISK MULTIPLERING), genom vilken konjunktionsoperationen utförs mellan innehållet i två register eller en minnescell och ett register;

ELLER(LOGISK ADDITION), genom vilken en disjunktionsoperation utförs mellan innehållet i två register eller en minnescell och ett register;

INVALIDITET, som utför en bitvis jämförelse av innehållet i två register eller en minnescell och ett register;

INVERSION innehållet i en minnescell eller ett register.

2.Typer av adressering

En av de viktigaste arkitektoniska egenskaperna hos MP är listan över möjliga metoder för att komma åt minne eller typer av adressering. MP:s adresseringsförmåga är betydande ur två synpunkter.

För det första kräver en stor mängd minne en stor adresslängd, eftersom en n-bitars adress tillåter åtkomst till minne med en kapacitet på 2n ord. Typiska 8-bitars MP-ord gör det möjligt att direkt komma åt endast 256 minnesceller, vilket uppenbarligen inte räcker. Om vi ​​tar hänsyn till att åtkomst till minne är den vanligaste operationen, är det uppenbart att effektiviteten av att använda MP till stor del bestäms av metoderna för att adressera en stor volym minne med en liten bitkapacitet på MP.

För det andra, för att underlätta programmeringen, är det önskvärt att ha ett enkelt system för att generera dataadresser när man arbetar med arrayer, tabeller och pekare. Låt oss titta på sätt att lösa dessa problem.

Om adressfältet för kommandot är begränsat och otillräckligt för att direkt komma åt någon minnescell, är minnet i sådana fall uppdelat i sidor, där 2n minnesceller betraktas som en sida.

För att matcha adressfältet för ett kommando med små bitar med minne med stor kapacitet (för att lösa problemet med "sida") används olika typer av adressering i MP:

Direkt adressering till den aktuella sidan . Med denna adressering är programräknaren uppdelad i två fält: bitarna av hög ordning anger sidnumret och bitarna med låg ordning anger adressen till cellen på sidan. Kommandots adressfält innehåller adressen till cellen på sidan, och sidadressen måste ställas in på något annat sätt, till exempel med ett speciellt kommando.

Direktadressering med sidregister. MP måste ha ett programmatiskt tillgängligt sidregister laddat med ett speciellt kommando. Detta register lägger till flera bitar till adressfältet för instruktionen, vilket är nödvändigt för att adressera allt minne.

Direktadressering med dubbla ord. För att öka längden på adressfältet för ett kommando tilldelas ett extra ord för adressen (och vid behov två).

Adressering i förhållande till programräknaren. Instruktionsadressfältet behandlas som ett signerat heltal, som läggs till innehållet i programräknaren för att bilda exekveringsadressen. Denna relativa adresseringsmetod skapar en flytande sida och gör det lättare att flytta runt program i minnet.

Adressering i förhållande till indexregister. Exekveringsadressen bildas genom att summera innehållet i indexregistret och adressfältet för kommandot, betraktat som ett signerat heltal. Indexregistret är laddat med specialkommandon.

Indirekt adressering . När indirekt adressering används anger kommandots adressfält adressen på den aktuella sidan där den verkställande adressen är lagrad. I det här fallet krävs ytterligare en bit i kommandofältet - ett tecken på indirekt adressering. Exekutivadressen kan inte lagras i en minnescell, utan i ett allmänt register. I detta fall kallas indirekt adressering för registeradressering.

3. Struktur och kommandoformat för MP KR580VM80

MP-kommandosystemet i KR580VM80-serien innehåller kommandon i tre format: enkelbyte, dubbelbyte och trebyte.

Innehållet i den första byten anger kommandoformat, operationskod, typ av adressering och register eller registerpar, om de är inblandade i operationen. Det är dock omöjligt att specificera de specifika bitarna som tilldelas de tre första av de angivna komponenterna i kommandot, eftersom de kan placeras i alla bitar av kommandot. Men trots detta kommer vi att anta att de är kodade som ett fält, vilket kallas operationskodfältet. Varianter av format för den första byten av kommandot visas i figur 9.

Om register är involverade i operationen kan en eller två av dem anges i den första byten av kommandot. I det här fallet tilldelas ganska specifika bitar till registernumren i kommandofältet: de tre lågordningens bitar (b2 – b0) kodar numret på källregistret som innehåller operanden, och de tre mittersta (b5 – b3) – numret på destinationsregistret som resultatet av operationen skickas till. I de fall då båda eller ett av dessa register inte är involverade i utförandet av operationen används motsvarande bitar för operationskoden.

Följande registerkodning accepteras:

000 – register B, 100 – register H,

001 – register C, 101 – register L,

010 – register D, 110 – minnescell,

011 – register E, 111 – batteri A.

Kod 100 är ett tecken på indirekt minnesadressering med hjälp av en 16-bitars adress som finns i H- och L-registren. Beroende på platsen för denna kod i kommandot, nås motsvarande minnescell antingen för en operand eller för att skriva resultaten av operationen.

Ett antal MP-kommandon tillhandahåller bearbetning eller överföring av nummer med dubbel längd. I dessa fall kombineras par av register B och C, D och E, eller H och L till 16-bitars register numrerade 00, 01 respektive 10. Antalet registerpar i kommandon tilldelas bitarna b2 och b1 (källregister), b5 och b4 (destinationsregister), och bitarna b0 och b3 används för att indikera operationskoden.

Dubbelbyte-kommandon i MP inkluderar kommandon med direktadressering och ingångs-/utgångskommandon. Följaktligen innehåller den andra byten i kommandot för denna grupp en 8-bitars operand eller en 8-bitars adress för en in- eller utgångsenhet.

I instruktioner med tre byte innehåller den andra och tredje byten 16-bitars adresser (i direktadresseringsinstruktioner) eller 16-bitars operander (i instruktioner för att ladda registerpar och stackpekare).

Efter att varje ALU-operation har utförts genereras fem tecken, vars värden kan påverka exekveringen av efterföljande informationsbearbetning och villkorsstyrda överföringskommandon. Man bör dock komma ihåg att olika kommandon har olika effekter på individuella tecken.

För att underlätta att spara och återställa MP:s tillstånd under avbrott och övergångar till subrutiner, lagras alla specificerade egenskaper i ett speciellt register - egenskapsregistret. Placeringen av tecken i registerbitarna visas i tabellen.

där S är "tecken"-attributet (tar värdet av den mest signifikanta biten

resultat);

Z – tecken på nollresultat;

AC är ett tecken på extra överföring (om det finns överföring

mellan byte-tetrader, då AC=1, annars AC=0;

P – ett tecken på paritet för resultatet (om antalet ettor i byten

resultatet är jämnt, då P=1, annars P=0);

C – ett tecken på överföring eller lån (om, när man utför kommandon,

När det skett en övergång från en högre rang eller ett lån till en senior-

Den högsta siffran är C=1, annars C=0).

Notera: För logiska multiplikationskommandon tar det extra bärtecknet AC värdet av den fjärde biten av resultatet.

Det kompletta kommandosystemet för MP-serien KR580VM80 finns i bilagan till läroboken "Mikroprocessorer och mikroprocessorsystem". Där, för varje kommando, anges hur, efter dess exekvering, värdet för varje attribut ändras: det ställs in i enlighet med resultatet av operationen (+), ändras inte (–), återställs till noll (0) ) eller ställ in på ett (1).

I allmänhet bör kommandot innehålla följande information:

–operationskod som anger den operation som MP måste utföra;

–adresser till två operander (adder, subtrahends, etc.). Om någon av operanderna är en konstant, kan värdet på själva operanden anges i kommandot istället för dess adress. Denna omständighet måste dock återspeglas i operationskoden så att MP använder lämplig del av kommandot för sitt avsedda syfte;

– adress till minnescellen i vilken resultatet av operationen ska placeras;

-adress för nästa kommando.

De där. kommandot är vanligtvis fyra adresser, men denna kommandostruktur leder till ett längre kommandoformat, vilket i sin tur är förknippat med en mer komplex bearbetningsprocess och processorstruktur. I MP-teknik är därför adresslösa och unicast-kommandon mest utbredda, vilket gör det möjligt att bygga en enkel processor, men när man utför komplexa operationer används olika kommandoformat.

580-seriens MP-instruktionssystem har enkelbyte, dubbelbyte och tre-byte instruktioner.

Information om hur kommandot som ska adresseras finns i opkoden för den första byten av kommandot.

För att påskynda beräkningarna lagras vissa operander i RON-blocket. Instruktioner som fungerar på dessa operander använder förkortade adresskoder (registeradressering).

Dessa kommandon låter dig eliminera den relativt långa cykeln för åtkomst till RAM och därigenom avsevärt öka operationshastigheten. På grund av den begränsade kapaciteten hos RON och när man arbetar med en stor mängd data, används andra adresseringsmetoder som tillåter åtkomst till operander som finns i minnet utanför MP. Det vanligaste är registerindirekt adressering, som använder ett HL-registerpar.

I gruppen av kontrollöverföringskommandon finns det fyra typer av kommandon: ovillkorliga grenar, villkorliga grenar, loopar och avbrott .

Ovillkorliga hoppkommandon. Inkluderar tre mnemoniska koder: JMP (ovillkorligt hopp), CALL (subrutinanrop) och RET (återgång från subrutin).

JMP-kommandot låter dig hoppa till valfri punkt i programmet, som finns både i det aktuella programsegmentet och i ett annat segment. När man hoppar inom det aktuella programsegmentet används de tre första JMP-instruktionsformaten.

Det första formatet ger en övergång till en godtycklig punkt i programmet inom det aktuella programsegmentet, för vilken en 16-bitars offset läggs till IP-innehållet i tvås komplementkod, vars mest signifikanta bit är signerad. Det andra, förkortade formatet låter dig hoppa till en punkt i programmet som inte är mer än -128-f-127 adresser från JMP-instruktionen. Slutligen laddar det tredje formatet instruktionspekaren med ett 16-bitars nummer, som finns på exekutivadressen EA, bestämt av postbyten. Denna övergång kallas indirekt eftersom indirekt adressering används.

För att implementera ett ovillkorligt hopp till en programpunkt belägen utanför det aktuella programsegmentet när en omladdning av CS-segmentregistret krävs, används de fjärde och femte JMP-instruktionsformaten.

Det fjärde formatet definierar en direkt intersegmentövergång, i vilken den andra och tredje byten i formatet indikerar den relativa adressen för övergångspunkten, och den fjärde och femte byten indikerar det nya CS-värdet. Det femte formatet, med hjälp av en postbyte, låter dig bestämma den verkställande adressen EA, där den relativa adressen för övergångspunkten finns (i minnesbyte med adresser EA, EA+1), och det nya CS-värdet (i minnesbyte EA+2, EA+3).

Kommandot CALL låter dig anropa en subrutin som finns antingen i det aktuella programsegmentet eller i ett annat minnesområde. Den har samma format som JMP-kommandot, förutom att den är kortare. Till skillnad från JMP-kommandot av liknande format, skriver CALL-kommandot, innan IP- eller IP- och CS-värden ändras, automatiskt de aktuella värdena för dessa register till stacken, vilket säkerställer att returpunkten från subrutinen kommer ihåg.

För att återvända från en subrutin, använd RET-kommandot, som överför kontrollen till returadressen som trycks in i stacken när det föregående CALL-kommandot utförs. När man återvänder från subrutiner som finns i det aktuella programsegmentet används de två första formaten av RET-instruktionen, och det andra formatet skiljer sig från det första genom att en konstant skriven i instruktionens 2:a och 3:e byte läggs till innehållet i instruktionen. stackpekaren. Detta tillåter, samtidigt med retur från subrutinen, att återställa parametrarna som skrivits till stacken under exekvering av denna subrutin och som inte används i framtiden.

För intersegmentretur används de tredje och fjärde RET-formaten, som tillhandahåller återhämtning av innehållet i både instruktionspekaren och programsegmentet.

Villkorliga hoppkommandon.Överför kontroll beroende på resultatet av tidigare operationer. Det finns tre typer av villkorliga hopp som används för att upprätta relationer mellan tecken med tecken, tal utan tecken och godtyckliga tal. I de två första varianterna väljs olika kommandomnemoniska koder för samma relationer mellan nummer, eftersom olika flaggvärden motsvarar samma relationer mellan signerade och osignerade nummer.

I de mnemoniska koderna för villkorliga hoppkommandon, när man jämför signerade siffror, används bokstaven för att indikera "större än"-tillståndet G (Större- mer), och för att beteckna - "mindre" bokstav L (mindre- mindre). För liknande förhållanden, när man jämför osignerade siffror, används bokstäver respektive A (ovan- ovan) och Nedan- under). Jämställdhetsvillkoret betecknas med bokstaven E (Lika- är lika), och underlåtenhet att uppfylla något villkor - genom bokstaven N(Inte- Inte). Det bör noteras att det är tillåtet att använda två olika mnemoniska koder för varje kommando; till exempel är mnemonkoderna JL och JNGF likvärdiga, eftersom villkoren "mindre än" och "inte större än eller lika med" är identiska.

En komplett lista över kommandomnemoniska koder, villkor som kontrolleras, såväl som motsvarande booleska kombinationer av flaggor och deras värden ges i tabellen. 1.4.

Tabell 1.4

Kommando mnemonisk kod Skick Betydelsen av flaggorna
För signerade nummer
JL/JNGE Mindre/inte mer än eller lika med SF + OF = l
JNL/JGE Inte mindre än/större än eller lika med SF + OF = 0
JG/JNLE Mer än/inte mindre än eller lika med (SF + OF) V ZF = 0
JNG/JLE Inte större än/mindre än eller lika med För osignerade tal (SF + OF) V ZF = l
JB/JNAE Mindre/inte mer än eller lika med CF=1
JNB/JAE Inte mindre än/större än eller lika med CF=0
JA/JNBE Mer CF V ZF = 0
JNA/JBE Inget mer För andra uppgifter CF V ZF = 1
JE/JZ Lika/noll ZF = 1
JNE/JNZ Inte lika/noll ZF = 0
JS Med minus SF = 1
JNS På plussidan SF = 0
JO Svämma över OF = l
JNO Genom frånvaro av spill OF = 0
JP/JPE Med jämn paritet PF = 1
JNP/JPO Med udda paritet PF = 0

Alla villkorliga hoppinstruktioner har samma två-byte-format, vars första byte anger operationskoden (OPC), och den andra är en 8-bitars offset, som behandlas som ett signerat nummer och därför tillåter adressändringar i intervallet från -128 till +127. Om en mer avlägsen (”långt”) övergång krävs när ett villkor är uppfyllt, används ett ytterligare ovillkorligt övergångskommando.

Exekveringstiden för var och en av de villkorliga hoppinstruktionerna indikeras för två fall: 1) villkoret är uppfyllt och kontrollen överförs faktiskt i enlighet med offseten, 2) villkoret är inte uppfyllt, så kontrollen överförs till nästa instruktion.

Lag för att organisera cykler. Introducerad i CPU för bekvämligheten att utföra beräkningscykler. Dessa inkluderar följande mnemoniska koder: LOOP (loop tills (CX) är inte lika med 0), LOOPNZ/LOOPNE (loop till noll/inte lika med), LOOPZ/LOOPE (loop till noll/lika med) och JCXZ (hoppa på noll i SH). Vart och ett av dessa kommandon har ett tvåbyteformat, vars andra byte specificerar den 8-bitars offset som används för att arrangera hoppet. Denna förskjutning behandlas som ett tecken med tecken och förlängs med tecken till 16 bitar innan hoppadressen beräknas.

Genom att använda loopkommandon tillsammans med kommandon för att manipulera strängelement kan du skapa ganska komplexa strängkonverteringsprogram. Låt oss överväga ett exempel på att komponera ett program för att konvertera en sträng av data skrivna i det hexadecimala talsystemet till någon kod för vilken konverteringstabellen finns i minnet från startadressen som anges i BX, som krävs för att använda kommandot tabellkonvertering för XLAT koder. Låt oss vidare anta att källsträngen innehåller 80 element och ligger i minnet från den relativa startadressen 100, och att resultatsträngen ska placeras från den relativa adressen 200. Programmet som omvandlar källsträngen till resultatsträngen, med värdet för riktningsflaggan DF=0, kommer att ha formen:

MOVSI ,100
MOV DI ,200
MOV CX, 80

XLAT-tabellkonverteringskommandot som beskrivs i 1.2 används här.

Avbryt kommandon. Innehåller tre mnemonics: INT (avbrott), INTO (avbrott vid spill) och IRET (avbrottsretur).

Avbryt kommando INT kl v=1 har ett tvåbyteformat, vars andra byte innehåller ett 8-bitars nummer som definierar typen (typ) eller avbrottsnivå. Med INT-kommando typ Processorn fortsätter med att exekvera avbrottsserviceprogrammet för den specificerade nivån, och de åtgärder som är nödvändiga för att säkerställa en återgång till avbrottspunkten utförs automatiskt. Dessa åtgärder är följande: innehållet i F-flaggaregistret skrivs till stacken (PUSHF), IF- och TF-flaggorna återställs, de aktuella värdena för CS-registret och IP-instruktionspekaren skrivs till stacken.

För att bestämma startadressen för serviceprogrammet enligt värdet typ Avbrottsnivåtabellen används. För var och en av de 256 avbrottsnivåerna i denna tabell tilldelas fyra byte: de första två byten bestämmer värdet på IP-instruktionspekaren, den andra - värdet på CS-segmentregistret. Dessa fyra bytes definierar startadresserna för serviceprogram (par av CS, IP-värden), som först måste skrivas in i minnesceller vid absoluta adresser 0-3FFH. Tabelladress som motsvarar den som anges i INT-kommandot typ avbrottsnivån bestäms i CPU:n enligt följande. Efter att ha lagrat de aktuella värdena för CS och GR i stacken, utförs laddning: CS = typ x 4 + 2 och IP = typ x 4. Nya CS- och IP-värden hämtade från adressceller respektive typ x 4 + 2 Och typ x 4, fastställa startadressen för det nödvändiga underhållsprogrammet.

INT-avbrottskommandot som diskuterades ovan när fältvärdet är v=0 har ett single-byte-format, dvs det kräver ingen speciell indikering av avbrottsnivån. Detta kommando uppfattas automatiskt av processorn som ett nivå 3-avbrott. (typ=3) och används ofta i program som en kontrollpunkt.

Kommandot INTO-spillavbrott orsakar en övergång till att betjäna det fjärde nivåavbrottet (typ = 4) i det fall då värdet på överflödesflaggan AV = 1. INTO-kommandot används vanligtvis efter signerade aritmetiska kommandon. Vanligtvis är de första få avbrottsnivåerna (upp till 32) reserverade för att behandla ett antal specifika situationer, såsom ett försök att dividera med noll, spill och liknande.

En egenhet med att bearbeta avbrott av reserverade nivåer är att processorn fortsätter att betjäna dem oavsett värdet på avbrottsaktiveringsflaggan IF.

En-byte IRET-instruktionen placeras i slutet av varje avbrottsservicerutin och tillhandahåller avbrottsretur. Med detta kommando hämtar processorn värdet på IP-instruktionspekaren och CS-programsegmentet från stacken, och återställer även det tidigare innehållet i F-flaggaregistret (som med POPF-kommandot). Vid behov kan innehållet i de återstående CPU-registren som motsvarar det avbrutna programmet lagras i stacken när man flyttar till serviceprogrammet och sedan återställas när man återvänder från det med hjälp av stacksåtkomstinstruktioner.

Med indirekt adress

PCHL – hoppadressen lagras i HL-registerparet. När det körs (HL) → PC.

Villkorliga hoppkommandon

Jcon @, där con är ett villkorsminne från det engelska ordet condition.

Det har tidigare noterats att tillståndet för bitarna (flaggorna) i RgP (F) används som ett övergångsvillkor. Mnemoniken som motsvarar dessa tillstånd presenteras i fig. 6.18.

Till exempel: JC 8BFE – när C=1 går till adress 8BFE, när C=0 exekveras nästa kommando på adressen.

Kommandon för att ringa PP och återvända

Tidigare noterades att returadressen automatiskt lagras på stacken, d.v.s. (PC) ® stack.

Ovillkorliga kommandon

CALL @ – subrutinsamtal;

RET – retur från subrutin.

Villkorliga kommandon

Ccon @ – subrutinsamtal;

Rcon – retur från subrutin.

Kommandonas verkan liknar verkan av de villkorliga hoppkommandona, dvs. om villkoret är sant, ring eller återvänd. Om inte, exekveras följande kommandon.

Andra kontrollkommandon

RST n, där n = 0,1,...,7 – omstart enligt avbrottsvektor n.

När detta kommando exekveras överförs kontrollen till subrutinen som servar detta avbrott. Under exekveringen av RST-instruktionen lagras innehållet i PC-programräknaren i stacken, och adressen för motsvarande avbrottsvektor skrivs till PC:n.

Denna adress är inställd enligt följande. RST-kommandot har strukturen 11NN N111, dvs. en byte. Trebitars NNN-kombinationen specificeras av värdet n (n = 0...7). Värdet 0000 0000 00NN N000 matas in i PC-kommandoträknaren, som fungerar som adressen till motsvarande avbrottsvektor.

Genom att sätta ett visst värde på n kan du alltså generera adressen till en av de 8 avbrottsvektorerna. Dessa adresser är belägna i zonen från 0000H till 0038H i adressutrymmet och går igenom 8 byte, d.v.s. De första 64 minnescellerna är reserverade för dem (var och en av de 8 vektorerna tilldelas 8 byte). I dessa zoner (8 byte vardera) skrivs endast kommandon för att hoppa till motsvarande subrutiner (hanterare), som finns i andra minnesområden.

Avbrytande subrutiner (som vanliga subrutiner) måste sluta med RET-kommandot. Under exekveringen av detta kommando väljs adressen till huvudprogramkommandot före vilket avbrottet inträffade från stacken och överförs till adressregistret PA, och värdet ökat med 1 matas in i programräknaren.

EI – avbrottsaktivering. Detta kommando placeras i början av programdelen där avbrott är aktiverat. Med detta kommando sätts avbrottsaktiveringen i MP-styrenheten till tillstånd 1.

DI – avbryta avbrott. Detta kommando placeras i slutet av programdelen där avbrottet aktiverades och återställer utlösaren till tillstånd 0.

NOP är ett "tomt" kommando. Hoppar över 4 takter. Endast PC-byten.

HLT – stopp. Får programexekveringen att stoppa och gå in i stoppat tillstånd. MP kopplas bort från den externa adress- och databussen (d.v.s. deras buffertar går in i tillstånd Z). WAIT-utgången (väntar) är inställd på nivå 1. Detta tillstånd kan avbrytas av MP-startsignaler eller genom att placera det i avbrottstillstånd.

SJÄLVTESTFRÅGOR

1. Vilka enheter behövs för att skapa en enkel mikrodator?

2. Lista 5 alternativ för mikrodatorstrukturer.

3. Använda ett mellanliggande gränssnitt.

4. Vad omfattar begreppet "PU-kontroller"?

5. Lista egenskaperna hos I8080-processorn.

6. Dataregister. Deras syfte.

7. Signera register. Vilka attribut lagras i dessa register?

8. Beskriv principen för dubbelriktat datautbyte mellan internt och externt SD.

9. Vilka register kan en programmerare använda?

10. Ge ett blockschema över en mikrodator baserad på MP KR580VM80.

11. Vilka cykler består en maskincykel av?

12. Lista dataformaten för MP KR580VM80.

13. Lista kommandoformaten för MP KR580VM80.

14. Vilka adresseringsmetoder används i MP KR580VM80?

15. Vilka grupper kan MP KR580VM80-lagen delas in i?

16. Enkelbyteöverföringar. Ge exempel på kommandon från denna grupp.

17. Dubbelbyteöverföringar. Ge exempel på kommandon från denna grupp.

18. Vilka batterifunktioner känner du till?

19. Operationer i RON och minne. Vilka operationer omfattar de?

20. Lista kontrollkommandona.

KONTROLLUPPGIFTER

1. Svarsbladen ska innehålla gruppnummer, elevens efternamn och numret på hans alternativ.

2. Frågenummer väljs av eleven i enlighet med dennes två sista siffror i betygsboken. I Tabell 6.1 är n-1 den näst sista siffran i numret och n är den sista siffran. Cellerna i tabellen innehåller antalet frågor som ett skriftligt svar måste ges.

Frågenummer Tabell 6.1

a n a n-1
1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18
3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17
2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18
3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18
1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17
3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16
1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19
4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19
1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19
3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19

Den ovillkorliga övergångsoperationen (BP) hänvisar till operationerna för ovillkorlig överföring av kontroll och består av följande. I början av operationen sänds innehållet i CC, som indikerar kommandot som följer efter BP (returadress), till P1 AU om programmet tillhandahåller en retur; detta låter dig spara returadressen genom att ytterligare överföra innehållet i P1 (till exempel genom 3G-operationen) till minnet. För att göra detta måste de första kommandona i den programdel till vilken övergången görs innehålla en motsvarande operation. I nästa steg av operationen läses innehållet i 1-14 bitar, som är övergångsadressen, från RAM- eller ROM-cellen med adressen specificerad i BP-kommandot i SchK. Vid denna adress görs sedan en begäran till ROM-minnet för kommandot till vilket övergången görs.

Skiftdrift

I skiftformatet (FSD) är operationerna "Aritmetiskt skift höger (vänster)" och "Logiskt skift höger (vänster)" kodade. När de exekveras utförs åtgärder på numret som finns i AC. Attributen i kommandot är specificerade: växlingens riktning (5 r), typerna av skift (8,9 r) och deras antal (1-4 r). Under operationen skiftas bitarna i registret P2, resultatet registreras i registren P2 och РСм, och skiftet till höger utförs med 3 bitar samtidigt, skiftet till vänster är 1 bit. Värdet på den 5:e biten lika med "1" bestämmer förskjutningen till vänster, lika med "0" - till höger.

Verksamheten är cyklisk. Antalet växlingscykler räknas av cykelräknaren (CC). Innan den cykliska delen av operationen utförs skickas innehållet i 1-5 bitar av kommandot som innehåller en konstant och ett skifttecken till mitten. Därefter skickas innehållet i P2 till RSM. Själva skiftet utförs på grund av den "sned" kopieringen av innehållet i registren P2 och Pcm till P2' respektive Pcm'. Sedan skrivs resultatet av skiftet från PCm' och P2' till SM1 och SM2 om till P2 och PSM. Slutförandet av operationen indikeras av värdet SchT =0.

Beroende på typ av skift (L eller A) skiftas antingen alla 16 bitar (L) eller endast 15 bitar (mantissa) utan tecken (A). När A skiftar till höger fylls de lediga bitarna av hög ordning med ett tecken, och när de flyttas till vänster fylls de lediga bitarna av låg ordning med nollor. Under en logisk förskjutning till höger eller vänster fylls de lediga bitarna med nollor.

Du kan också programmera ändra skiftkonstanten.

32 Interaktion mellan noder och element i blockschemat för CB-processorn vid utförande av villkorliga hoppoperationer.

Villkorliga hoppoperationer



Utförandet av operationen börjar med att kontrollera genomförbarheten av övergångsvillkoret genom att jämföra värdet på resultatattributet för den föregående operationen med "mask"-koden i kommandot. Om villkoret är uppfyllt sker övergången till utförande av kommandot, vars adress är i adressoperanddelen av PFU-formatet. Om övergångsvillkoret inte är uppfyllt, exekveras kommandot efter kommandot "Villkorligt hopp" i programmet.

Kommandot "Conditional Jump" (JJ) upptar två intilliggande ROM-celler. Den första cellen innehåller kommandot, den andra cellen innehåller hoppadressen. Ett villkorligt hopp bestäms av en kombination i kommandots 7-9 bitar, villkoret för att placera returadressen bestäms av den 6:e biten.

När villkoret är uppfyllt skrivs övergångsadressen in i programräknaren, därför kommer koden för nästa kommando att läsas från cellen med denna adress. Returadressen anges i P1 om den 6:e biten är lika med 0 och i Pcm om värdet på denna bit är lika med ett.

Om övergångsvillkoret inte är uppfyllt, väljs nästa instruktion från cellen med adresskoden i+2. I detta fall matas den specificerade koden (returadressen) in i P1 oavsett värdet på den 6:e biten i kommandot. Det senare bestäms av SV-processorns operationsalgoritm vid dechiffrering av UE-operationskoden.

Inmatning av returadressen på PCM beror på att utgången till kodbussen från AC endast har det specificerade registret.

En egenhet med exekveringen av NC-operationen är att om det finns kod 111 eller 000 i "mask"-bitarna i kommandot, degenererar den villkorliga övergången till en ovillkorlig eller en operation för att skicka till basregistren. I dessa fall är hoppadresserna eller sändningsadressen till basregistren innehållet i adressoperanddelen av instruktionen (AOC).

När du utför operationen att skicka till BR:n skickas innehållet i AOC till en eller flera BR:er samtidigt, beroende på innehållet i kommandots 15-17 bitar. Returadressen skickas i detta fall inte till P1 och RSM.



Att utföra en NC-operation som en TCU-operation kan användas i avbrott för att hoppa till avbrytande program. För att göra detta, i den 5:e biten av kommandot, ställs attributet för en programmerad övergång (PNT) in. I detta fall läses kommandot in i processorn från ROM via en avbrottssignal (ISR). I detta fall genereras ROM-åtkomstadressen (avbrottsadressen) av processoravbrottskretsen.

En egenhet med operationen i detta fall är att returadressen för avbrott inte är adressen till kommandot som följer kommandot i FUP-format, utan adressen till kommandot innan avbrottet inträffade. NPP-signalen behandlas enligt följande. Baserat på denna signal genererar processorns avbrottskrets en avbrottsadress (APr), lika med adressen för den första cellen i hoppinstruktionen i FUP(i)-formatet. Denna adress överförs till minnet genom omkopplaren och ROM-adressregistret. Avbrottsadresserna väljs på ett sådant sätt att adressen för den första cellen i kommandot (i) är jämn och adressen för den andra cellen (i+1) är udda. Den andra adressen erhålls genom att ändra (i hårdvara) den minst signifikanta siffran utan deltagande av CC från noll till ett. I processen att läsa ett kommando från ROM och utföra det, lagras innehållet i SchK (K+1) i AC-registret P1 och innehållet i den andra cellen i kommandot (i+1), som är adressen för övergången till kommandot med adress j, skrivs in i SchK. En begäran görs till ROM angående det nya innehållet i CC. Således lagras adressen för nästa instruktion vid tidpunkten för avbrottet (K+1) i registret Pl. Efter att avbrottet har bearbetats används denna adress för att återgå till det avbrutna programmet.

33 Interaktion mellan noder och element i blockschemat för SV-processorn vid utförande av processor- och systemkontrolloperationer.