Unidad II Programación en C

Cap.2– Programación en C vs. Ensamblador
Presentación
Cap. 1. Introducción a los
Microcontroladores
Escuela Superior de Cómputo – IPN.
Departamento de Posgrado
Dr. Julio Cesar Sosa Savedra
[email protected]
www.desid.escom.ipn.mx
Cap.2– Programación en C vs. Ensamblador
Índice
1.1 Introducción y definición de un microcontrolador
1.2 Estructura básica de un microcontrolador
1.3 Características de la Arquitectura
1.3.1 Arquitectura RISC
1.3.2 Arquitectura Harvard
1.3.3 Segmentación (pipeline)
1.4 Familias y subfamilias de microcontroladores
1.4.1 Memoria de programa
1.4.2 Memoria de datos
1.4.3 Recursos periféricos
1.5 Modelo de programación
1.6 Conjunto de instrucciones
1.7 Modos de direccionamiento
1.8 Ambiente de desarrollo de programación
Cap.2– Programación en C vs. Ensamblador
1.7 Modos de direccionamiento
Los dsPIC disponen de 5 modos de
direccionamiento
Los DSC disponen de 4 modos de
direccionamiento de la memoria de datos:
1. Direccionamiento inmediato.
2. Direccionamiento directo
3. Direccionamiento directo por registro
4. Direccionamiento indirecto por registro
Cap.2– Programación en C vs. Ensamblador
1.7.1 Inmediato
INMEDIATO
El operando que maneja la instrucción es un
valor literal constante predefinido.
Esta contenido en el formato de la propia
instrucción.
El tamaño del operando inmediato puede
abarcar desde 1 a 16 Bits y puede tener o no
bit de signo.
Cap.2– Programación en C vs. Ensamblador
1.7.1 Inmediato
EJEMPLO 1:
AND.B #0x0F, W6
;W6<7:0> = W6<7:0> AND 0x0F
Se realiza la operación lógica AND, entre el valor inmediato 0x0F y el byte
de menos peso de W6. El resultado se almacenará en ese mismo byte.
EJEMPLO 2:
ADD W1, #0x0500, [W2++]
;[W2] = W1 + 0x0500
;W2 = W2 + 2
Se suma la palabra contenida en W1, con el operando inmediato 0x0500, y
el resultado se guarda en la posición de la memoria de datos direccionada
por W2. Después se incrementa W2 en 2 unidades.
Cap.2– Programación en C vs. Ensamblador
1.7.2 Directo
DIRECTO
Lo emplean las instrucciones que tienen
como operando la dirección de la memoria de
datos donde reside el contenido de una
variable.
Para este direccionamiento es frecuente
utilizar los 8 KB inferiores del espacio de la
memoria de datos, denominada “RAM
cercana”.
Con la instrucción MOV es posible acceder a
los 64 KB de la memoria de datos
Cap.2– Programación en C vs. Ensamblador
1.7.2 Directo
EJEMPLO 1:
DEC 0x2200
;[0x2200] = [0x2200] – 1
Decrementa en una unidad el valor de la palabra contenida en la dirección
de memoria 0x2200, de la RAM.
EJEMPLO 2:
MOV 0x2200, W5 ; W5 = [0x2200]
Mueve el contenido de la localidad de memoria direccionada por 0x2200, de
la RAM, al registro W5.
EJEMPLO 3:
AND 0x2200
;W0 = [0x2200] AND W0
Con el valor de la palabra contenida en la dirección 0x2200 se realiza la
operación lógica AND BIT a BIT con el contenido del registro WREG
(W0), quedando inalterado el valor contenido en la dirección 0x2200.
 La mayoría de las instrucciones que usan el direccionamiento directo
toman al registro de trabajo WREG como operando implícito, actuando
W0 como WREG.
Cap.2– Programación en C vs. Ensamblador
1.7.3 Directo por registro
DIRECTO POR REGISTRO
Se emplea para acceder al contenido de los
16 registros de trabajo (W0 – W15) que
actúan como operando en la instrucción.
El acceso puede ser un dato de tamaño byte o
palabra.
La ventaja de este modo de direccionamiento
es la rapidez con que se acceden a los
registros internos de la CPU.
Cap.2– Programación en C vs. Ensamblador
1.7.3 Directo por registro
EJEMPLO 1:
EXCH W5, W6 ;W5 ↔ W6
Se intercambian los datos con el contenido de los registros W5 y W6
EJEMPLO 2
SL W2, W3, W4 ;W4 = W2 << W3
Se desplaza a la izquierda el contenido del registro W2 el número de veces
que indica W3. El resultado se almacena en W4.
EJEMPLO 3
AND.B W1, #0XF2, W2 ; W2 <7:0> = W1 <7:0> AND 0XF2
Se realiza la operación lógica AND entre el byte de menos peso de W1 y el
operando inmediato 0xF2. El resultado de dicha operación se almacena en
en el byte de menos peso de W2.
Cap.2– Programación en C vs. Ensamblador
1.7.4 Indirecto por registro
INDIRECTO POR REGISTRO
El contenido de los registros de trabajo se
utilizan para guardar la dirección efectiva del
operando en la memoria de datos.
Los registros W actúan como apuntadores,
permitiendo incrementar o decrementar
automáticamente el contenido de un registro
antes o después de ejecutar la instrucción.
Los incrementos o decrementos son de una o
dos unidades o más.
Cap.2– Programación en C vs. Ensamblador
1.7.4 Indirecto por registro
 Con esto se logra la exploración secuencial de
arreglos o bancos de datos en el sentido que se
desee, según el tamaño de los datos direccionados
por los registros W sea de uno o de dos bytes o de
más
 El direccionamiento indirecto con registro de
desplazamiento emplea un registro Wb que suma el
contenido con el registro Wn que contiene la
dirección efectiva.
 Wb actúa con el desplazamiento de Wn y permite
acceder a los 64 KB de la memoria RAM, aunque carece
de posibilidades de incremento y decremento.
Cap.2– Programación en C vs. Ensamblador
1.7.4 Indirecto por registro
Modo indirecto
por registro
Sintaxis
Dato tamaño
byte
Dato tamaño
palabra
Modificación de Wn
Sin modificación
[Wn]
*Wn
EA=[Wn]
EA=[Wn]
Pre-incremento
[++Wn]
*(++Wn)
EA=[Wn+=1]
EA=[Wn+=2]
El contenido de Wn contiene
la dirección efectiva y no
varía
Wn es pre-incrementado
para formar la dirección
efectiva del operando
Pre-decremento
[--Wn]
*(--Wn)
EA=[Wn-=1]
EA=[Wn-=2]
Wn es pre-decrementado
para formar la dirección
efectiva del operando
Post-incremento
[Wn++]
*(Wn++)
EA=[Wn]+=1
EA=[Wn]+=2
Wn contiene la dirección
del operando y luego es
post-incrementado
Post-decremento
[Wn--]
*(Wn--)
EA=[Wn]-=1
EA=[Wn]-=2
Wn contiene la dirección
del operando y luego es
post-decrementado
Registro
Desplazamiento
[Wn+Wb]
*(Wn+wb)
EA=[Wn+Wb
]
EA=[Wn+Wb]
La suma de Wn y Wb forma
la dirección efectiva del
operando. Wn y Wb no
cambian
Cap.2– Programación en C vs. Ensamblador
1.7.4 Indirecto por registro
EJEMPLO1
MOV [W3++], [W0--] ; [W0] = [W3]
; W3 = W3+2
; W0 = W0-2
Mover el dato direccionado por el contenido de W3 a la localidad de
memoria direccionada por W0. Después W3 se incrementa en 2 unidades y
W0 se decrementa en dos unidades. Todo esto ocurre en un ciclo de
instrucción.
Cap.2– Programación en C vs. Ensamblador
1.7.4 Indirecto por registro
EJEMPLO2
MOV.B [--W4], [W5+W6] ;W4 = W4 - 1
;[W5+W6] <7:0> = [W4<7:0>]
Decrementa el apuntador (W4) en una unidad, esto es, porque se utiliza el
especificador “.B” (Byte). Después se accede a la localidad de memoria y se
lee el byte de menos peso. Ese Byte se coloca en el byte de menor peso de
la dirección de memoria formada por la suma de (W5+W6). Todo esto
ocurre en un ciclo de instrucción.
Cap.2– Programación en C vs. Ensamblador
1.7.4 Indirecto por registro
EJEMPLO3
ADD W7, [++W8], [W5--]
;W8 = W8 + 2
;[W5] = W7 + [W8]
;W5 = W5 - 2
Incrementar en dos unidades el contenido de W8, después se suma la
palabra direccionada por el contenido de W7 más el dato direccionado por el
por el registro W8, previamente incrementado. El resultado se guardará en
la localidad de memoria direccionada por W5. Finalmente, el contenido de
W5 se decrementa en 2 unidades. Todo esto ocurre en un ciclo de
instrucción.
Cap.2– Programación en C vs. Ensamblador
1.7.4 Indirecto por registro
RESUMEN:
Inmediato: Se proporciona el valor del operando en el código
de la propia instrucción. (Valor constante).
Directo: Se proporciona la dirección de la memoria de datos en
la que se almacena el operando. (0x0000-0x1FFF) 8K**
Directo por registro: El operando reside en uno de los
registros de trabajo (W0-W15). (0x0000-0x000F)
Indirecto por registro: El contenido de los registros de trabajo
contiene la dirección efectiva de la memoria de datos donde se
halla el operando. (0x0000-0xFFFF) 64K
**Con la instrucción MOV alcanza un rango de (0x0000-0xFFFE)
Cap.2– Programación en C vs. Ensamblador
1.7.4 Indirecto por registro
RESUMEN:
MOV.B #0x30, W1
MOV.B 0x2000, W1
MOV.B W1, [W2++]
CLR.B [W4--]
MOV #0x2000, W0
MOV 0x2000, W1
MOV [W1], [W2++]
MOV 0x2001, W3 (Excepción por error de dirección)
Cap.2– Programación en C vs. Ensamblador
1.7.4 Indirecto por registro
EJEMPLOS:
1
MOV #0x38F5, W5
AND.B W5, #0x0F,W8
2
MOV #56, W2
ADD #1000, W2
3
MOV #45, W0
MOV W0, 0x2200
DEC 0x2200
4
MOV #23, W0
MOV W0, 0x3311
MOV #74, W0
ADD 0x3311
5
MOV #5, W0
MOV W0, 0x1100
AND 0x1100, WREG
6
MOV #34, W0
MOV #67, W1
ADD W0, W1, W2
7
MOV #0xC3F7, W2
MOV #5, W3
SL W2, W3, W4
8
MOV #0xFC83, W1
MOV #0x4018, W3
MOV #0x2931, W2
IOR.B W1, W3, W2
Cap.2– Programación en C vs. Ensamblador
EJEMPLOS:
9
10
MOV.B [W1++], [W2--]
ADD W1, [--W2], [++W7]
1.7.4 Indirecto por registro
Cap.2– Programación en C vs. Ensamblador
1.7.4 Indirecto por registro
16 Bits
ARCHIVO DE REGISTROS
MSB
W0
LSB
0x0001
0x0000
W1
W2
0x0801
0X3F
0X47
0x0800
W3
0x0803
0X00
0X00
0x0802
W4
0x0805
0X78
0XA1
0x0804
0x0807
0X00
0X00
0x0806
0x0809
0X00
0X00
0x0808
W5
W6
W7
MAPA DE MEMORIA
Cap.2– Programación en C vs. Ensamblador
1.7.4 Indirecto por registro
Obtener los valores de los registros y/o localidades de memoria después de ejecutar las
siguientes instrucciones:
1
MOV 0x0800, W2
INC W2, W2
4
MOV #0x034, W4
MOV 0x0804, W6
ADD W4, W6, W6
7
INC.B 0x0804
CLR.B 0x0804
10
MOV #0x0800, W5
CLR W6
REPEAT #4
MOV W6, [W5++]
2
MOV #0x0800, W1
MOV [W1], W7
AND.B W7, #0X0F, [++W1]
5
MOV #0x0808, W7
MOV #0x0802, W3
MOV #0x0800, W5
ADD W5, [++W3], [W7--]
8
MOV 0x0800, W0
MOV #0x0800, W5
MOV.B W0, [W5+0X03]
11
MOV #1, W1
MOV #1, W2
DO #5, CICLO
ADD W1, W2, W3
MOV W2, W1
CICLO:MOV W3, W2
3
MOV #0x0A0A, W6
SL W6, #3, W6
MOV W6, 0X0808
6
MOV #0x0802, W2
MOV #0x0804, W3
MOV #0x0802, W7
SUB.B W7, [W3++], [--W2]
9
MOV #0x1245, W0
CLR.B W0
ADD #0x0378, W0
12
MOV #0x0800, W1
CLR W0
REPEAT #3
ADD W0, [W1++], W0
LSR W0, #2, W0