Autor Tema: Confusión con el uso de ORG, como usarlo adecuadamente?  (Leído 13762 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Confusión con el uso de ORG, como usarlo adecuadamente?
« en: 01 de Noviembre de 2011, 18:46:56 »
Hola amigos del foro.

Estoy empapándome todo lo que puedo con la programación en ensamblador, ya que llevo cerca de 2 años programando en CCS y ha habido ocasiones en que su presición no me ha sido suficiente.

Por ahora estoy con las interrupciones, y me surge una duda que expongo a continuación:

He notado en infinidad de códigos que los programadores ponen los siguientes vectores: ORG 0, ORG 4 y ORG 5, por lo que me he documentado, comprendo que cuando el programa necesita transladarse a una zona del programa como después de un reset (ORG 0), o durante una interrupción (ORG 4), busca su vector correspondiente, estoy en lo correcto?, por lo tanto me surgen 2 dudas, en qué momento o parte de un programa es necesario un ORG 5?, suponiendo que se coloca para dejar intacto el vector de interrupciones, por que he notado que los programadores hacen esto:

Código: [Seleccionar]
        org 0x00 ; Aqui comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
;**** Vector de Interrupcion ****
org 0x04 ; Atiendo Interrupcion.-
goto ISR
 
; **** Programa Principal ****
;**** Configuracion de puertos ***
org 0x05 ; Origen del codigo de programa.-
Inicio

Con mi razonamiento llego a la conclusión de que linealmente, el programa nunca pasará por org 0x05, debido a que en el reset salta Inicio y en la interrupcion salta a ISR, por lo que la única forma de llegar allí es por medio de una condicion equivalente al reset y la interrupción, esto es correcto?, alguien sabe cuál es dicha condición?

La otra duda que tengo es que durante un reset, el PC (program counter) se pone en 0, y se dirige a ORG 0x00, para comenzar a ejecutar normalmente las instrucciones e incrementar el CP en cada una, bien, mi duda es, cuando pasa por la dirección 0x04, que pasa aquí entonces?, no hay confusión con el vector de interrupción? o simplemente se salta este vector?, he tratado de ver la secuencia de inicio en el MPlab Sim, pero cuando inicia el programa, lo hace directamente en inicio, y el CP ya vale 10, asi que no tengo idea de lo que sucede en ese instante.

Y por último, hay otros vectores a parte de estos que deba conocer?

Disculpenme por debrayarme tanto, pero estas dudas no me dejan avanzar, y agradezco por adelantado la atención y el tiempo que me pudiesen dedicar.
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Confusión con el uso de ORG, como usarlo adecuadamente?
« Respuesta #1 en: 01 de Noviembre de 2011, 19:10:46 »
Hola fal, el org lo que hace es asignar una direccion a la etiqueta, es decir, en caso de inicio lop que haces es decirle que tu rutina "inicio" esta en la direccion 5, pero la puedes poner en 20,30,7 el numero que quieras, excepto el 0 y el 4 que estan reservados para el reset y para la interrupcion
"Nada es imposible, no si puedes imaginarlo"

Desconectado JBQ

  • PIC16
  • ***
  • Mensajes: 118
Re: Confusión con el uso de ORG, como usarlo adecuadamente?
« Respuesta #2 en: 01 de Noviembre de 2011, 19:30:59 »
Mira, la instrucción ORG viene de la palabra origen, y lo que indica es que a partir de ahi es el origen de las instrucciones que pongas.

Resolviendo dudas:
---------------------

Código: [Seleccionar]
org     0x0000

goto   INICIO


org     0x0004

...................
..................

org     0x0005

INICIO
         ...........
         ...........

         end




Esto tipo de firmware que ves aqui, que es muy comun para quienen se inician, lo único que hace es indicar donde comienza el vector reset (0x0000) donde comienza el vector interrup (0x0004) y donde comienza tu firmware principal (0x0005).

Cuando se produce un reset, sin importar lo que se haya implementado, el pc del uc apunta a la posicion 0x0000. Luego ejecuta las instrucciones una por una empezando por la 0x0000, luego la 0x0001; y si te das cuenta, la primera instrucción es " goto  inicio"; por la tanto se dirije a la etiqueta INICIO, que se ubica en la posicion 0x0005. Cuando se produzca una interrup, el pc del uc automaticamente apuntara a la posicion 0x0004, y ejecutara las instrucciones una por una, primero la 0x0004, luego la 0x0005 y asi sucesivamente. Lo que pasa es que cuando se empieza con el asm, se indica poner el  "org 0x0005" para poder colocar en la posicion 0x0004 (posicion del interrup) una instruccion como goto SERVICIO_INTERRUP. nada mas por eso (cosa que no es recomendable, a menos que solo uses una pagina del uc).

Saludos.


Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Confusión con el uso de ORG, como usarlo adecuadamente?
« Respuesta #3 en: 01 de Noviembre de 2011, 19:45:36 »
Muchas gracias por sus respuestas muchachos.

Hola rivale, lo que me dices es que la instrucción ORG en realidad hace esto?:

ORG 0x00     goto INICIO              ;La instrucción goto INICIO se guarda en 0x00
ORG 0x04     goto INTERRUPT        ;La instrucción goto INTERRUPT se guarda en 0x04

De esta forma ya me queda claro la utilidad del ORG, gracias!!!

Amigo JBQ, muchas gracias, ya comprendí que realmente no ejecuta las instrucciones linealmente despues del ORG 0x00, si no que esta dirección, cuando hay un ORG 0x05 Inicio, es simplemente un puente para llegar a dicha dirección, lo que no comprendo es por qué dices que no es recomendable hacerlo de esta forma?
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Confusión con el uso de ORG, como usarlo adecuadamente?
« Respuesta #4 en: 01 de Noviembre de 2011, 19:52:01 »
no exactamente al decirle
 org 0x00
 goto inicio

lo que haces es que en cuanto este en la direccion 0x00 lo siguiente que hace es brincar a inicio. y en cuanto este en 0x04 la siguiente instruccion sera brincar a "interrupt"
"Nada es imposible, no si puedes imaginarlo"

Desconectado JBQ

  • PIC16
  • ***
  • Mensajes: 118
Re: Confusión con el uso de ORG, como usarlo adecuadamente?
« Respuesta #5 en: 01 de Noviembre de 2011, 20:04:42 »
Las instrucciones "org" no son puentes, son indicadores de que ahi es el inicio del codigo a implementar.

por ejemplo: si tu dices que tal bloque de programa inicie en la posicion 0x1125 entonces lo haces asi:

addres     instruccion
                
                org 0x1125
0x1125     nop
0x1126     bsf
0x1127     nop
0x1128     bcf

al decir que inicie en 0x0005 indicas que a partir de ahi empieeza lo que comunmente llaman el inicio, o el programa principal.
cuando hay un reset, el pc apunta a la posicion 0x0000, si no hay nada que le indique que salte, ejecutara la 0x0001 y luego la 0x0002, y asi sucesivamente, incluso la 0x0003 y la 0x0004 sin importar que alli haya un "org 0x0004".

Respecto a lo de que no es recomendable poner un goto en la posicion 0x0004, va por que si en tu firmware estas manejando paginas, y suponte que estas en la página 3 y se produce una interrup, el pc apunta a la posicion 0x0004 y lo que ejecutara sera un goto , y si tu codigo implementado esta en la pagina 0, pues no ira ahi, ira a la página 3. Recuerda que el goto solo contiene 11 de los 13 bits de las instrucciones.

saludos.
« Última modificación: 01 de Noviembre de 2011, 22:48:52 por JBQ »

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Confusión con el uso de ORG, como usarlo adecuadamente?
« Respuesta #6 en: 02 de Noviembre de 2011, 20:14:27 »
Ok, ahora si lo comprendí perfectamente, excelentes explicaciones, gracias!!!
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com


 

anything