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
© Copyright 2024