Autor Tema: ¿Como hacer un IF en assembler?  (Leído 38796 veces)

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

Desconectado ariel25

  • PIC10
  • *
  • Mensajes: 42
¿Como hacer un IF en assembler?
« en: 22 de Enero de 2007, 12:50:53 »
Hola amigos antes que nada quisiera agradecerles por toda la ayuda que brindan y es justamente por eso que acudo a ustedes. Me gustaria saber como hacer un IF en assembler ya que solo conozco dos funciones algo parecidas a un IF que es el btfss y btfsc. Ahhhhh y trabajo con un pic 16f84A, gracias de antemano por la ayuda

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Como hacer un IF en assembler?
« Respuesta #1 en: 22 de Enero de 2007, 13:09:29 »
Hola ariel25 bienvenido al foro!!!

Ejemplo:

C....

if(variable == 5)
        miFuncion();

ASM....

movfw variable
movwf aux
movlw 5
subwf aux
btfss STATUS,Z
call miFuncion

De todas formas, si expones de forma clara el "IF" que quieres hacer te podremos ayudar mejor.

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ¿Como hacer un IF en assembler?
« Respuesta #2 en: 22 de Enero de 2007, 14:56:47 »
Hola ariel25 bienvenido al foro!!!

Ejemplo:

C....

if(variable == 5)
        miFuncion();

ASM....

movfw variable
movwf aux
movlw 5
subwf aux
btfss STATUS,Z
call miFuncion

De todas formas, si expones de forma clara el "IF" que quieres hacer te podremos ayudar mejor.

Saludos!

manwenwe en tu código hay un pequeño bug.  La rutina miFunción no se llamará cuando variable sea igual a 5, sino que por el contrario se llamará cuando no sea igual a 5.

Tal vez esta forma sería más breve.

Código: ASM
  1. movfw variable
  2. sublw .5                   ;
  3. btfsc STATUS,Z
  4. call miFuncion            ; Si variable-5 = 0 -> el bit Z se enciende


Verificando el carry se puede además determinar si la variable fue menor o mayor.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Como hacer un IF en assembler?
« Respuesta #3 en: 22 de Enero de 2007, 15:24:08 »
Jajaja se me escapó, gracias por corregirme. Realmente hace 2 años que no programo en ASM y se me olvidaron muchos de los pequeños detalles... pero como en su tiempo le dí mucha caña a la algoritmia en sí, aun me atrevo a intentar escribir algo de código de manera espontanea y sobre todo intentar ayudar a los recien llegados al foro :mrgreen:

Prometo que la próxima vez revisaré el código: tampoco es cuestión de que confundir al personal :D

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ¿Como hacer un IF en assembler?
« Respuesta #4 en: 22 de Enero de 2007, 15:55:21 »
Jajaja se me escapó, gracias por corregirme. Realmente hace 2 años que no programo en ASM y se me olvidaron muchos de los pequeños detalles... pero como en su tiempo le dí mucha caña a la algoritmia en sí, aun me atrevo a intentar escribir algo de código de manera espontanea y sobre todo intentar ayudar a los recien llegados al foro :mrgreen:

Prometo que la próxima vez revisaré el código: tampoco es cuestión de que confundir al personal :D

Saludos!

Jeje, no es gran problema, simplemente fue un pequeño bug, nada más. 

Sí el ariel25 captó la idea podría haberlo detectado él mismo. 
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: ¿Como hacer un IF en assembler?
« Respuesta #5 en: 22 de Enero de 2007, 16:34:48 »
Tambien hay atajos de Microchip...

Código: [Seleccionar]
movfw variable
sublw .5                   ;
SKPNZ
call miFuncion

SKPNZ  Skip if not Zero (salta si el bit cero no esta en 1)

 :-/ :-/ :-/ :-/
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Como hacer un IF en assembler?
« Respuesta #6 en: 22 de Enero de 2007, 16:48:49 »
Perdona MGLSOFT ¿qué es SKPNZ? ¿un define o una instrucción? (lo de la instruccion lo digo porque no conozco el repertorio de los PIC18, sólo he programado en ASM para PIC16).

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: ¿Como hacer un IF en assembler?
« Respuesta #7 en: 22 de Enero de 2007, 17:07:22 »
Perdona MGLSOFT ¿qué es SKPNZ? ¿un define o una instrucción? (lo de la instruccion lo digo porque no conozco el repertorio de los PIC18, sólo he programado en ASM para PIC16).

Saludos!

SKPNZ en una instruccion (entre otras) no documentadas que MICROCHIP tiene para las lineas 14 y 16.

Para la linea 18 te pongo aqui una idea de con que instruccion puedes hacer lo mismo... :mrgreen: :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Como hacer un IF en assembler?
« Respuesta #8 en: 22 de Enero de 2007, 17:22:15 »
Citar
SKPNZ en una instruccion (entre otras) no documentadas que MICROCHIP tiene para las lineas 14 y 16.

Que interesante! Primera noticia...

De las instrucciones de salto(skip), sólo conocía: btfss, btfsc, incfsz y decfsz.

Tengo un par de preguntas:

1. ¿Qué quiere decir lo de no documentas? Está claro que en mi libro sobre los PIC16(uno de ANGULO) no están documentadas(no aparecen) jejeje pero ¿por qué?

2. ¿Donde puedo encontrar una lista de estas instrucciones?

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ¿Como hacer un IF en assembler?
« Respuesta #9 en: 22 de Enero de 2007, 17:42:15 »
Un humilde aporte

SKPNZ es un macro, no una instrucción.  El ensamblador hace el reemplazo como cualquier otra macro.

Les paso la lista de macros que recuerdo ahora

SKPNZ -->  BTFSC STATUS,Z

movfw  REGISTRO --> movf   REGISTRO,W

banksel REGISTRO  --> hará un bsf y bcf del STATUS,RP0 y STATUS,RP1   para que apunten a la página donde está definida la variable

bankisel  REGISTRO
--> seteará los bits IRP adecuados para el direccionamiento indirecto de registro del banco en que está ubicado el registro (mediante FSR)

pagesel SUBRUTINA
  --> hará una carga del PCLATH con los bits adecuados de acuerdo a la página donde esté SUBRUTINA

pageselw SUBRUTINA --> guardará en WREG el byte más significativo de la ubicación de SUBRUTINA y lo guardará en PCLATH.



Si hace falta , hago algún ejemplo.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: ¿Como hacer un IF en assembler?
« Respuesta #10 en: 22 de Enero de 2007, 17:43:01 »
Quienes han comprado el programador PisStart 16B de Microchip tienen esa informacion, vere de levantar una imagen y ponerla aqui.
Te aclaro que es muy viejo pero anda correctamente aun... :mrgreen: :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: ¿Como hacer un IF en assembler?
« Respuesta #11 en: 22 de Enero de 2007, 17:46:43 »
Mas Macros (me reto Maunix) :D :D :D :D

CLRZ  borra el bit Z
CLRW borra el registro W
CLRC corra el bit C

Mil perdones jefe Maunix!!! :mrgreen: :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ¿Como hacer un IF en assembler?
« Respuesta #12 en: 22 de Enero de 2007, 17:59:57 »
Mas Macros (me reto Maunix) :D :D :D :D

CLRZ  borra el bit Z
CLRW borra el registro W
CLRC corra el bit C

Mil perdones jefe Maunix!!! :mrgreen: :mrgreen: :mrgreen:

Jeje, no te estoy retando, simplemente llamando a las cosas por su nombre.   :lol: :lol:


La aclaración la hice para evitar la confusión a alguno con algunos añitos en la espalda recordará el SET DE INSTRUCCIONES secreto de los micros Z80 o algunos micros de motorola e intel.

Era de la diversión de unos cuantos ir descubriendo esas instrucciones.  Yo era joven pero recuerdo haber leído muchos artículos de gente buscando ese tipo de cosas.

Esas eran realmente instrucciones no documentadas, según sus fabricantes porque no habían tenido el debido testeo!

 8)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Como hacer un IF en assembler?
« Respuesta #13 en: 22 de Enero de 2007, 18:00:51 »
Bueno, donde dije digo diog diego.... jejejeje, me expresé mal, dije define cuando la palabra era macro... gracias por vuestras respuestas.

Las macros que puso maunix(bueno "movfw" si la conocía) no las conocía, las de MGLSOFT sí.

¿Donde se pueden definir tus propias macros?

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ¿Como hacer un IF en assembler?
« Respuesta #14 en: 22 de Enero de 2007, 18:11:15 »
¿Donde se pueden definir tus propias macros?

En cualquier lugar del código!

Lo aconsejable es que tus macros las coloques todas en un archivo .inc y lo incluyas en tu proyecto o archivo .asm

De esa forma, los puedes llamar siempre.


Ejemplo.


macro mymacro a,b
       movf  a,w
       addwf  b,w
endm


Luego lo llamas así

Código: ASM
  1. mymacro MYVAR1,MYVAR2

que se compilará así

Código: ASM
  1. movf MYVAR1,w
  2.       addwf MYVAR2,w


y la suma de ambas quedará en WREG.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything