Departament de Microelectrònica i Sistemes Electrònics
AVR i FONAMENTS DE COMPUTADORS
Enginyeria en Informàtica (ETSE)
registres
Els registres són petits espais de memòria que emmagatzemen informació. En estar situats prop de la UAL, fet que agilitza els càlculs, els processadors els fan servir com a emmagatzemadors temporals d'informació. Degut a això són font i destí dels operands i, a diferència d'altres espais de memòria, es fan servir en les instruccions ensamblador com a contenidors de valors. Per exemple, la instrucció
add R16, R17
realitza l'operació [R16] <-- [R16] + [R17]. És a dir, posa en el registre R16 el resultat de sumar els continguts dels registres R16 i R17. El primer registre sempre és el regsitre destí.
En els microcontroladors ATmega els registres són de 8 bits. Un registre pot emmagatzemar valors, de 0 a 255, que poden significar nombres, positius o negatius, caràcters en format ASCII o bits amb significats determinats.
L'arquitectura RISC dels ATmega empra 32 registres, anomenats R0 a R31. Donat que alguns d'ells tenen funcions diferents cal anar en compta quan s'usen:
- Només els 16 darrers registres, de R16 a R31 poden ser emprats en totes les instruccions. Exemple:
mov R16, R17
ldi R16, 0x20;Posa a R17 el contingut de R16; Operació entre registres
;Posa a R16 el valor 0b00100000 = 32- Com a regla general, els primers 16 registres (de R0 a R15) no es poden emprar en instruccions amb immediats (valors constants, no registres) ni en instruccions bit a bit. Així, la instrucció següent no és permesa en aquest cas.
ldi R15, 0x20
; no vàlida amb R15 - Hi ha 6 registres que actúen per parelles: X=R26:R27, Y=R28:R29 i Z=R30:R31. Són registres apuntadors que poden adreçar tot l'espai de memòria (de 0 a 2^16-1). El registre Z també s'usa per adreçar dintre la memòria de programa.
Els registres dobles es divideixen en el byte alt i el byte baix: XH:XL, YH:YL, ZH:ZL. Donat l'ampla de bus de 8 bits, la major part d'accions amb els registres dobles s'ha de fer a partir dels seus dos bytes. Per exemple, la inicialització del stack es pot realitzar de la següent forma:
ldi YH, HIGH(RAMEND)
ldi YL, LOW(RAMEND)
out SPH, YH
out SPL, YL; el stack s'inicia al final de la memòria, RAMEND
; inicialització stack
- L'accés amb aquests registres apuntadors es fa amb instruccions específiques de càrrega i guarda, LD, ST, que permeten l'increment/decrement de l'apuntador en la mateixa instrucció. Exemples:
ld R16, X
st Y+, R16
ld R16, -Z; carrega a R16 el contingut de l'adreça X
; guarda a l'adreça Y el contingut de R16 i després incrementa l'apuntador
; decrementa l'apuntador i després carrega a R16 el contingut de l'adreça Z- La lectura de la memòria de programa només es pot fer amb el regsitre Z, i la instrucció que ho permet és LPM. La dada llegida es copia en el registre R0. Exemple:
ldi ZH, HIGH(2*adreça)
ldi ZL, LOW(2*adreça)
lpm
adiw ZL, 1
lpm
...; es carrega el byte alt de l'adreça a accedir en ZH
; es carrega el byte baix de l'adreça a accedir en ZL
; es llegeix l'adreça Z
; s'incrementa Z per apuntar a la propera adreça
; es fa una nova lectura
...Nota: S'ha d'anar en compta en el càlcul de l'adreça. Degut a què el programa està organitzat en paraules (de 16 bits), l'adreça de l'apuntador Z pot adreçar el byte baix o alt de l'adreça. Efectivament només pot adreçar 32Kbytes de programa. Per això el càlcul de l'apuntador es fa multiplicant per 2 l'adreça. ...una mica rar!
La instrucció ADIW permet realitzar la suma d'una constant a una paraula. Va bé per executar, en una sóla instrucció l'increment d'adreça. El registre on es suma es fa sobre el byte baix. La constant està limitada a un màxim de 63.
- El programa de memòria pot contenir taules. La directiva que permet insertar de forma fàcil taules de bytes és .DB, i .DW si el què es vol és treballar amb paraules. Exemples:
.DB 38, 155
.DW 64000, 0xA040
.DB "Text."; dos bytes
; dues paraules
; llista de bytesEl programa leds mostra una aplicació de lectura de dades de memòria.