Què fa el PCI a l'assemblea?
L'habilitat de controlar el flux del programa és un dels aspectes més fonamentals i fonamentals de la programació del llenguatge de muntatge. Sense ell, els microcontroladors simplement executarien seqüencialment les instruccions en la seva memòria fins que van sortir corrent. Escriure un programa no proporcional d'aquesta manera seria extremadament difícil si no ho fos impossible .
Controlar el flux del programa vol dir que invoquem al microcontrolador que salti des d' una adreça en codi a una altra - es refereix a com a S' està ramificantThe role of the transaction, in present tense . Això es pot fer amb tres mètodes diferents:
- Expropiació condicional
- Salts
- Cridant subrutina
Expropiació condicional Us permet provar una condició (p. ex. Si una mica és establert o un registre és igual a un valor particular) i branca a una nova localització si la condició és certa. Si no ho és, el microcontrolador continuarà amb les següents instruccions.
Salta és una forma de Brashing Incondicional . Redirigeix el flux del programa independentment de les condicions. Saltar us permet simplement salta a una nova adreça a la memòria del programa.
Cridant subrutina és una altra forma de Brashing Incondicional . Funciona de manera similar a Salta en el que fa que el microcontrolador salti a una nova adreça a la memòria del programa. No obstant això, el microcontrolador recordarà l'adreça de la trucada subrutina que es va fer, i en arribar al final de la subrutina, tornarà a l' instrucció immediatament seguint la crida subrutina.
En aquest tutorial, mirarem específicament Expropiació condicional , així que anomenat mentre crea múltiples camins a través d' un programa.
S' estan establint les banderes en el registre d' estat
La majoria de les instruccions d' ocupació de la branca condicional basades en banderes en la Registre d' estat . Com vam veure En episodis anteriors de Bron/Broen... Els indicadors s' estableixen automàticament en el registre d' estat després de realitzar qualsevol operació. D'aquesta manera, les instruccions condicionals de branca es poden col·locar sovint en un programa sense altres instruccions que admetin.
No obstant això, a vegades una condició s'ha de provar en un registre que no va ser afectada per l'operació anterior. En aquest cas, tenim algunes instruccions a la nostra disposició, que es mostren a sota.
El que realment fa aquesta instrucció és restar el segon registre des del primer per establir les banderes en el registre de l' estat. No obstant això, cpunit description in lists Deixa el registre sense modificar. Usant els indicadors del registre d' estat podem determinar quin registre és més gran o si tenen el mateix valor.
En l'exemple anterior, la Bandera de tasca Es posarà al registre de l' estat després del comparador, ja que estem essencialment computant 0x01 - 0x02 . A causa d'això podem concloure que el segon operand és més gran que el primer.
Alternativament, a la següent comprovació si dos casos són iguals en el valor.
Després de la primera comparació, la Bandera de tasca S' establirà, indicant que el primer número és més petit que el segon.
En la segona comparació, tot i que els primers bytes dels dos nombres són iguals, el Bandera de tasca Encara s' establirà, indicant- lo correctament 0xA02 és més gran que 0xA01 . Si la cpunit description in lists Les instruccions s' han usat en comptes d' això, el registre d' estat indicaria incorrectament que els dos números són iguals.
En l' exemple anterior el Bandera zero S' establirà, indicant r16 és igual a la constant en comparació.
Finalment, la tst Les instruccions es poden usar en un sol registre per comprovar si és negatiu o zero. tst establirà les dues coses Signa i Bandera negativa si s' estableix un petit 7 del registre, o bé s' estableix Bandera zero si el registre és zero. tst Sempre netejarà la Bandera del complement a dosName .
ldi r16, 0x80; carrega r16 amb 0x80 tst r16; prova r16
A dalt, la Signa i Bandera negativa S'instal·larà des de 7 de 0x80 és 1.
Expropiació condicional
Una vegada s' estableixen els indicadors en el registre d' estat, hi ha una varietat de Expropiació condicional instruccions que poden controlar el flux del programa.
La sintaxi d' una instrucció d' branca és simplement
etiqueta de la branca
Si la condició especificada per la instrucció d' branca està satisfet, saltarà a l' adreça marcada per l' etiqueta. D'altra banda, continuarà a la següent instrucció.
Per exemple, el codi següent compararà r16 i r17 i branca a lblunit description in lists Si són iguals.
Algunes instruccions de la branca condicional poden semblar redundant, però això només és perquè hi ha una sense signe i Signat Versió. Per exemple. brshCity name (optional, probably does not need a translation) - branca si és igual o superior , s' usa amb valors sense signe
Podeu notar que hi ha instruccions per comprovar si hi ha un registre. més gran o igual a un altre registre, i les instruccions corresponents per comprovar si un registre és menys que Un altre registre. No obstant això, no hi ha cap menys o igual Les comparacions. Això és perquè no els necessiten. Menys o igual es pot comprovar simplement intercanviant l' ordre dels operands amb una instrucció més gran o igual. Per exemple
No seré l'ús de les instruccions de dalt com les seves descripcions ho fan prou evident. En comptes d'això, veurem com crear estructures familiars des d'alt nivell de programació usant branques condicionals.
Mentregacle
A dalt, el bucle comprovarà si r16 és més petit que 100 Al principi de cada iteració. Si no ho és, executarà el codi que hi hagi al bucle, després torna a saltar al principi i comparar de nou. Si r16 és més gran o igual que 100 , el bucle es trencarà i el programa saltarà al següent etiqueta.
Això és equivalent al codi C següent, suposant r16 es desa a la variable x .
Doe BucleCity name (optional, probably does not need a translation)
Noteu que en una Doe BucleCity name (optional, probably does not need a translation) No necessitem un rjmp Les instruccions. La branca condicional s' utilitza per repetir el bucle, i el programa continua a la següent instrucció quan no es coneix la condició.
Això és equivalent al codi C següent, suposant r16 es desa a la variable x .
Per bucle
En aquest exemple, el nostre Per bucle L' índex està desat en r16 i s' ha inicialitzat a 0 . r16 es compara amb un nombre de 11 i es trencarà del bucle quan sigui igual. Noteu que aquesta és la nostra manera de comprovar si r16 és més petit o igual que 10 .
Això és equivalent al codi C següent, suposant r16 es desa a la variable x .
per(i = 0; i <= 10; i++)
{
...
}
Branxejant "Skip"
A més de les instruccions de la branca condicional, les quals es ramificaran a una etiqueta quan una condició sigui certa, també hi ha algunes instruccions que simplement "skip" una instrucció si hi ha una condició establerta. Es mostren a la taula de sota.
La sbrc i sbrsunit description in lists Us permet "skip" les següents instruccions si s' estableix una mica en un registre general de treball o sense netejar. Per exemple, el següent crearà un bucle que s' executarà fins a una mica de 3 r0unit description in lists Està establert.
Artículos Relacionados:
- Què hi ha al PCI a l'arquitectura de l'ordinador?
- Quina és la diferència entre el PCI i el recompte d' instruccions mentre avalua l'actuació d'un ordinador?
- Com calcular el PCI efectiu d'un ordinador?
- Quina és la part d'un PC?
- Processador -