Salt (informàtica)

De la Viquipèdia, l'enciclopèdia lliure
Aquesta imatge mostra com implementar la branca BEQ d'una manera més pedagògica.

Un salt és una instrucció d'un programa informàtic que pot fer que un ordinador comenci a executar una seqüència d'instruccions diferent i, per tant, es desviï del seu comportament predeterminat d'executar instruccions en ordre. Branch (o ramificació, ramificat ) també pot referir-se a l'acte de canviar l'execució a una seqüència d'instruccions diferent com a resultat d'executar una instrucció de branca. Les instruccions de branca s'utilitzen per implementar el flux de control en bucles de programa i condicionals (és a dir, executant una seqüència particular d'instruccions només si es compleixen determinades condicions).[1]

Una instrucció de ramificació pot ser una ramificació incondicional, que sempre resulta en ramificació, o una ramificació condicional, que pot o no provocar ramificacions depenent d'alguna condició. A més, depenent de com especifica l'adreça de la nova seqüència d'instruccions (l'adreça "destinació"), una instrucció de branca generalment es classifica com a directa, indirecta o relativa, és a dir, que la instrucció conté l'adreça de destinació, o especifica on és la destinació. s'ha de trobar una adreça (per exemple, un registre o una ubicació de memòria), o especifica la diferència entre les adreces actuals i les de destinació.[2]

Implementació[modifica]

Les instruccions de branca poden alterar el contingut del comptador de programa (o PC) de la CPU (o el punter d'instruccions en els microprocessadors Intel). El PC manté l'adreça de memòria de la següent instrucció de màquina que s'ha d'obtenir i executar. Per tant, una branca, si s'executa, fa que la CPU executi codi des d'una nova adreça de memòria, canviant la lògica del programa segons l'algorisme planificat pel programador.[3]

Un tipus de branca a nivell de màquina és la instrucció de salt. Aquests poden o no fer que l'ordinador es carregui o es modifiqui amb algun valor nou i diferent diferent del que hauria estat habitualment (s'incrementa més enllà de la instrucció actual per apuntar a la següent instrucció). Els salts solen tenir formes incondicionals i condicionals on aquests últims es poden fer o no (el PC es modifica o no) depenent d'alguna condició.

El segon tipus de branca a nivell de màquina és la instrucció de crida que s'utilitza per implementar subrutines. Igual que les instruccions de salt, les crides poden o no modificar el PC segons els codis de condició, però, a més, es desa una adreça de retorn en un lloc segur de la memòria (normalment en una estructura de dades resident a la memòria anomenada pila). Un cop finalitzada la subrutina, aquesta adreça de retorn es restaura al PC i, per tant, l'execució del programa es reprèn amb la instrucció que segueix la instrucció de crida.

El tercer tipus de branca a nivell de màquina és la instrucció de retorn. Això "extreu" una adreça de retorn de la pila i la carrega al registre de l'ordinador, retornant així el control a la rutina de crides. Les instruccions de retorn també es poden executar condicionalment. Aquesta descripció correspon a la pràctica ordinària; tanmateix, el programador de la màquina té poders considerables per manipular l'adreça de retorn a la pila i, per tant, redirigir l'execució del programa de moltes maneres diferents.[4]

Segons el processador, les instruccions de salt i crida poden alterar el contingut del registre de l'ordinador de diferents maneres. Es pot carregar una adreça absoluta, o el contingut actual de l'ordinador pot tenir algun valor (o desplaçament) afegit o restat del seu valor actual, fent que l'adreça de destinació sigui relativa al lloc actual del programa. La font del valor de desplaçament pot variar, com ara un valor immediat incrustat a la instrucció, o el contingut d'un registre de processador o una ubicació de memòria, o el contingut d'alguna ubicació afegit a un valor d'índex.

El terme branca també es pot utilitzar quan es fa referència a programes en llenguatges de programació d'alt nivell. En aquestes branques solen prendre la forma de sentències condicionals de diverses formes que encapsulen la seqüència d'instruccions que s'executarà si es compleixen les condicions. Les instruccions de branca incondicional com ara GOTO s'utilitzen per saltar incondicionalment a una seqüència d'instruccions diferent. Si l'algorisme requereix una branca condicional, la crida de subrutina GOTO (o GOSUB) va precedida per una instrucció IF-THEN que especifica la(s) condició(es). Tots els llenguatges d'alt nivell admeten algorismes que poden reutilitzar el codi com a bucle, una estructura de control que repeteix una seqüència d'instruccions fins que es compleix alguna condició que fa que el bucle finalitzi. Els bucles també es consideren instruccions de branca. A nivell de màquina, els bucles s'implementen com a salts condicionals ordinaris que redirigeixen l'execució al codi repetit.

A les CPU amb registres de senyalització, una instrucció anterior estableix una condició al registre de senyalització. La instrucció anterior pot ser aritmètica o una instrucció lògica. Sovint està a prop de la branca, encara que no necessàriament la instrucció immediatament anterior a la branca. A continuació, la condició emmagatzemada s'utilitza en una branca com ara jump if overflow-flag set. Aquesta informació temporal s'emmagatzema sovint en un registre de bandera, però també es pot localitzar en un altre lloc. El disseny d'un registre de bandera és senzill en ordinadors més lents i senzills. En ordinadors ràpids, un registre de bandera pot posar un coll d'ampolla en la velocitat, perquè les instruccions que d'altra manera podrien funcionar en paral·lel (en diverses unitats d'execució) necessiten establir els bits de bandera en una seqüència particular.


Referències[modifica]

  1. Busbee, Kenneth Leroy «Branching Statements» (en anglès). Rebus Press, 15-12-2018.
  2. «Branch Instruction in Computer Organization - javatpoint» (en anglès). [Consulta: 28 novembre 2023].
  3. «Branching instructions in 8085 microprocessor» (en anglès americà), 27-04-2018. [Consulta: 28 novembre 2023].
  4. «What's the primary difference between branch instruction and branch with link instruction? ARM?» (en anglès). [Consulta: 28 novembre 2023].