TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: mtristan en 02 de Enero de 2010, 15:59:13

Título: Algunas directivas útiles en ASM
Publicado por: mtristan en 02 de Enero de 2010, 15:59:13
.

(Agregado 04/01/10):
Nota: TODAS las directivas son no-case-sensitive. Da lo mismo poner Banksel, BANKSEL, banksel, etc.

BANKSEL
Sintaxis:   BANKSEL   registro
Agrega las instrucciones necesarias (BSF y BCF en los registros FSR o STATUS) para cambiar al banco donde se encuentra el registro indicado.

Ejemplo:
Código: ASM
  1. BANKSEL TRISA   ; Cambia al banco donde esta TRISA
  2.         MOVLW   0x00
  3.         MOVWF   TRISA   ; Configura el puerto como salida
  4.         BANKSEL PORTA   ; Cambia al banco donde esta PORTA
  5.         MOVLW   0x08
  6.         MOVWF   PORTA   ; Mueve 0X08 a la salida del puerto

DE
Sintaxis: [etiqueta]   DE   exp1[, exp2, exp3, ... ]
Indica al compilador los valores (exp1, exp2, etc) que tendrán los registros de la eeprom de datos (en caso de tener) luego de programar el PIC.
Para especificar que los valores exp se guardarán a partir de la primera dirección, se debe anteponer a la línea de la directiva:
- Para PIC18:   ORG   0xF00000
- Para PIC1x:   ORG   0x2100

Ejemplos:
Código: ASM
  1. ORG     0x2100
  2. psswrd  DE      0x00, 0x34, 0x55, 0x00
(http://img710.imageshack.us/img710/5044/87876527.th.jpg) (http://img710.imageshack.us/i/87876527.jpg/)

Código: ASM
  1. ORG     0x2110                  ; Indica la direccion 0X10 de la eeprom
  2.         DE      "PROGRAMA DADO"         ; y guarda una cadena de caracteres
(http://img264.imageshack.us/img264/8271/dadok.th.jpg) (http://img264.imageshack.us/i/dadok.jpg/)

DT
Sintaxis: [etiqueta]   DT   exp1[, exp2, exp3, ... ]
Crea una serie de instrucciones RETLW con los valores dados por exp1, exp2, etc. SOLO PARA PIC12/16.

Ejemplos equivalentes:
Código: ASM
  1. TABLA
  2.         ADDWF   PCL,F
  3.         RETLW   B'01100110'
  4.         RETLW   B'11111000'
  5.         RETLW   B'00011100'

Código: ASM
  1. TABLA
  2.         ADDWF   PCL,F
  3.         DT      B'01100110', B'11111000', B'00011100'

CBLOCK - ENDC
Sintaxis:
   CBLOCK   [exp]
[etiqueta1[:bytes]
[etiqueta2[:bytes]
etiqueta3[:bytes]]

...
   ENDC
Asigna una etiqueta determinada a una lista de registros de la memoria RAM comenzando por la dirección exp. Si no se especifica una dirección exp, se inicia con la última dirección puesta en una directiva CBLOCK anterior.
También puede asignarse una etiqueta a un grupo de registros (algo así como los vectores en C) especificando el número de bytes de RAM que ocupará una misma etiqueta.

Ejemplos:
Código: ASM
  1. CBLOCK 0x20
  2. BANDERA                 ; Se asigna la etiqueta BANDERA al registro 0X20
  3. CONT1                   ; Se asigna la etiqueta CONT1 al registro 0X21
  4. CONT2                   ; Se asigna la etiqueta CONT2 al registro 0X22
  5.         ENDC
  6.  
  7.         CBLOCK
  8. NUM                     ; Se asigna la etiqueta NUM al registro 0X23
  9.         ENDC

Código: ASM
  1. CBLOCK  0x0C
  2. DOBLE:2                 ; Se asigna la etiqueta DOBLE a los registros 0X0C y 0x0D
  3.         ENDC
  4.  
  5. ...
  6.  
  7.         MOVLW   0x90
  8.         MOVWF   DOBLE   ; Se guarda 0x90 en el registro 0x0C
  9.         MOVLW   0x3F
  10.         MOVWF   DOBLE+1 ; Se guarda 0x3F en el registro 0x0D


Estas son las que más me han servido por el momento. Invito a que investiguen un poco más (hay muchas más directivas que estas) en el archivo de ayuda del MPASM.
¡Saludos!
Título: Re: Algunas directivas útiles en ASM
Publicado por: alogic.on en 02 de Enero de 2010, 18:37:24
buena propuesta :mrgreen: estaremos atentos

un saludo

Título: Re: Algunas directivas útiles en ASM
Publicado por: Suky en 02 de Enero de 2010, 21:27:45
Otras directivas muy útiles son pagesel, lgoto y lcall para el manejo de páginas de micros que poseen más de una como por ejemplo el 16F877:

(http://img214.imageshack.us/img214/8561/paginas1yd0.jpg)

Estas directivas agregan automáticamente las instrucciones de control sobre los bit 3 y 4 de PCLATCH.

Ejemplos:

Código: ASM
  1. Pagesel         Rutina
  2.         Call            Rutina
  3. ; Seria equivalente a:
  4.         Lcall           Rutina
  5.  
  6.         Pagesel         Rutina2
  7.         Goto            Rutina2
  8. ; Seria equivalente a:
  9.         Lgoto           Rutina2


Saludos!
Título: Re: Algunas directivas útiles en ASM
Publicado por: alogic.on en 03 de Enero de 2010, 10:34:09
mmmm.... yo normalmente consulto aqui (http://perso.wanadoo.es/pictob/directivas_mpasm.htm) por si le vale a alguno como yo que no le de al ingles, pero lcall/lgoto no las conocia. mu guapas para ahorrarse unas lineas ;-)

un saludo

Título: Re: Algunas directivas útiles en ASM
Publicado por: Leon Pic en 03 de Enero de 2010, 12:19:50
Muy buen tema. Algo de aclarar, es que esto solo sirve para el MPASIM - MPLAB.
Título: Re: Algunas directivas útiles en ASM
Publicado por: mtristan en 04 de Enero de 2010, 16:08:41
.


Un par más:

FILL
Sintaxis: etiqueta   FILL   exp, end
Llena la memoria de programa (a partir de su aparición) con la constante exp. Si end es un número, indica cuántos registros de memoria se llenarán. Si se desea llenar hasta la aparición de una etiqueta, se debe poner (en el lugar de end): etiqueta-$
Si se quiere llenar la memoria con una instrucción, se la pone en lugar de exp entre paréntsis.

Ejemplos:
Código: ASM
  1. NADA    FILL    (NOP),10        ; Llena las proximas 10 direcciones con instrucciones NOP

Código: ASM
  1. FILL    0x1010,FINAL-$  ; Llena con 0X1010 los registros de la memoria de programa hasta la etiqueta FINAL
  2.         ORG     0x50
  3. FINAL
  4.         END


IFDEF - ELSE - ENDIF
Sintaxis:
   IFDEF   etiqueta
(BLOQUE DE PROGRAMA A)
   [ELSE
(BLOQUE DE PROGRAMA B)]
   ENDIF
Compila un bloque de programa si una etiqueta ha sido definida previamente (con la directiva #DEFINE). Si no, compila el bloque debajo de ELSE. Si no se agrega la directiva ELSE, no se compila nada hasta ENDIF.
Resulta útil para crear archivos .inc con distintas rutinas que se utilizan o no dependiendo del caso. Por ejemplo, en un archivo con rutinas para manejo de LCD se pueden agregar rutinas de inicialización distintas (para distintos controladores) y sólo compilar la necesaria en el proyecto.

Ejemplo:
Código: ASM
  1. ; En el encabezado del programa principal:
  2.         #DEFINE INIT2
  3.  
  4. ...
  5.  
  6. ; En el archivo .inc:
  7.         IFDEF   INIT1
  8. (RUTINA DE INICIALIZACION 1)
  9.         ENDIF
  10.  
  11.         IFDEF   INIT2           ; Esta es la que se compilara.
  12. (RUTINA DE INICIALIZACION 2)
  13.         ENDIF
  14.  
  15.         IFDEF   INIT3
  16. (RUTINA DE INICIALIZACION 3)
  17.         ENDIF

PD1: Gracias por agregar PEGESEL, Suky. Tenía miedo de ponerla porque no le he usado nunca (por el momento me alcanza con el 16F628A  :mrgreen:)
PD2: ¿Por qué sólo sirven para el MPLAB?


Título: Re: Algunas directivas útiles en ASM
Publicado por: alogic.on en 04 de Enero de 2010, 17:05:41
pues no es precisamente una directiva pero es otra forma de ahorrar lineas, u de pensar. pero aun no le cogi el truquillo, os lo paso y si podeis me contais si habeis echo algo parecido y como lo habeis solucionado, o por si os da alguna idea ;-)
se me ocurrio que para generar una tabla de forma automatica podria hacer esto;
   dt    .0,   (($-1+1)),   (($-1+1)),   (($-1+1)),   (($-1+1)),   (($-1+1))   si se le pone .20 por ej en el primero empieza a partir de ahí
y el compilador hacia justo eso, sumaba uno al valor de la linea anterior :mrgreen:
 pero intente esto
   DT   .0, (($-1+2)), (($-1+2)), (($-1+2)), (($-1+2)),
y me dijo que naranjas. sigue sumando uno.
 tambien asi no da error al compilar
#define eco   .3
#define L      .2
dt    .0,   (($-1+eco+L)),   (($-1+eco+L)),   (($-1+eco+L)),   (($-1+eco+L))
y que va se niega, empieza por .20 y suma uno al siguiente, mas uno, mas uno..... no multipilca ni resta.
 asi por ej.
   DT   .10, (($-1-2)), (($-1-2)), (($-1-2)), (($-1-2)),
lo que sale es 0xa, oxfe, 0xff, 0, 0x1   :shock: aqui ya si que me perdi, pero algo hace

 :shock: :shock: :shock: seguire dandole a ver si lo saco

un saludo
Título: Re: Algunas directivas útiles en ASM
Publicado por: sander en 04 de Enero de 2010, 19:46:15
pues no es precisamente una directiva pero es otra forma de ahorrar lineas, u de pensar. pero aun no le cogi el truquillo, os lo paso y si podeis me contais si habeis echo algo parecido y como lo habeis solucionado, o por si os da alguna idea ;-)
se me ocurrio que para generar una tabla de forma automatica podria hacer esto;
   dt    .0,   (($-1+1)),   (($-1+1)),   (($-1+1)),   (($-1+1)),   (($-1+1))   si se le pone .20 por ej en el primero empieza a partir de ahí
y el compilador hacia justo eso, sumaba uno al valor de la linea anterior :mrgreen:
 pero intente esto
   DT   .0, (($-1+2)), (($-1+2)), (($-1+2)), (($-1+2)),
y me dijo que naranjas. sigue sumando uno.
 tambien asi no da error al compilar
#define eco   .3
#define L      .2
dt    .0,   (($-1+eco+L)),   (($-1+eco+L)),   (($-1+eco+L)),   (($-1+eco+L))
y que va se niega, empieza por .20 y suma uno al siguiente, mas uno, mas uno..... no multipilca ni resta.
 asi por ej.
   DT   .10, (($-1-2)), (($-1-2)), (($-1-2)), (($-1-2)),
lo que sale es 0xa, oxfe, 0xff, 0, 0x1   :shock: aqui ya si que me perdi, pero algo hace

 :shock: :shock: :shock: seguire dandole a ver si lo saco

un saludo

 :? :? :? , hasta donde recuerdo el $ se utiliza para hacer referencia a la direccion no al contenido de la misma ,  fijate en el ultimo ejemplo que pusiste , seguramente el inicio de la tabla esta en la direccion 0x100,  entonces para la direccion 0x101 al utilizar tu ecuacion ($-1-2), tendrias en vez de $ 0x101.

=>........ 0x101 - 1 - 2 =0x0FE y para las direcciones siguientes:
=>........ 0x102 - 1 - 2 =0x0FF
=>........ 0x103 - 1 - 2 =0x100
=>........ 0x104 - 1 - 2 =0x101

Fijate que en los dos ultimos casos la directiva DT solo reconocera el byte menos significativos , entonces tienes 0x00 y 0x01.


Para hacer lo que quieres me parece que deberias definirte una variable creo que existe alguna directiva para hacer algo asi.

Saludos
Título: Re: Algunas directivas útiles en ASM
Publicado por: alogic.on en 05 de Enero de 2010, 06:36:22
aps ok, si es que hay veces que me atasco. toma como valor el nº de linea mmmmm

#define eco   .5
   DT   eco, (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)),....
   org  0x800
retlw   0x5
retlw   0x6
retlw   0x7...y asi suma uno a cada linea a partir de ''eco''
 aunque no era precisamente lo que creia que se podia hacer. para tablas de 0 a 256 mas menos, puede valer para con copiar pegar sin rematarnos a escribir hacer una tablita
Citar
   DT   eco, (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)),
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))
   DT  (($-1+eco+1)), (($-1+eco+1)), (($-1+eco+1))

aunque mientras que escribia se me ocurrio otra alogicada :D no funciona ya creo que es pedirle muxo
Citar
PRIN_TABLA
DT   eco
FILL (($-1+eco+1)),FINAL-$ ; Llena con ¡'¡'¡'¡'¡' los registros de la memoria de programa hasta la etiqueta FINAL


org   PRIN_TABLA+.50
FINAL

dice que naranjas
Error[122]   D:\NUEVOS PROYECTOS MPLAB\CNC\DRV_UNI\RUTINAS.INC 403 : Illegal opcode (($-1+.0+1))
esto me empezaba a recordar a esas carreras que se hacen con el c por poner todo un santo programa en cada vez menos lineas :D

un saludo



Título: Re: Algunas directivas útiles en ASM
Publicado por: BrunoF en 05 de Enero de 2010, 10:16:55
Hola alogic. No entiendo realmente cual es el fin de dicha tabla.

No hace falta tabla alguna para ese comportamiento.



#define eco   .5




         movlw   eco
         addwf    offset,w
         ;aca el valor seria el mismo que hacer eco + la posicion de la tabla donde quieres ir(offset)

sin tabla, sin ocupar rom.
Título: Re: Algunas directivas útiles en ASM
Publicado por: Leon Pic en 05 de Enero de 2010, 13:53:12
PD2: ¿Por qué sólo sirven para el MPLAB?

Porque éstas, no son instrucciones del lenguaje assembler, sino directivas que utiliza el IDE para generar el lenguaje assembler.
Título: Re: Algunas directivas útiles en ASM
Publicado por: alogic.on en 05 de Enero de 2010, 14:02:50
ya gracias, asi lo estuve haciendo. pero en el vco que estoy trasteando, utiliza cuatro formas de onda y ya no es un +1 precisamente, si la diente de sierra seria incf +1 o en vez de subiendo decf -1 bajando pero ya la triangular la tuve que hacer leyendo una tabla, no me dio pa mas
Citar
   DT   .248, .246, .244, .242, .240
   DT   .238, .236, .234, .232, .230
   DT   .228, .226, .224, .222, .220
   DT   .218, .216, .214, .212, .210
   DT   .218, .216, .214, .212, .210
   DT   .198, .196, .194, .192, .190
   DT   .188, .186, .184, .182, .180   
   DT   .178, .176, .174, .172, .170
   DT   .168, .166, .164, .162, .160
   DT   .158, .156, .154, .152, .150
   DT   .148, .146, .144, .142, .140
   DT   .138, .136, .134, .132, .130
   DT   .128, .126, .124, .122, .120
   DT   .118, .116, .114, .112, .110
   DT   .108, .106, .104, .102, .100
   DT   .98, .96, .94, .92, .90
   DT   .88, .86, .84, .82, .80
   DT   .78, .76, .74, .72, .70
   DT   .68, .66, .64, .62, .60
   DT   .58, .56, .54, .52, .50
   DT   .48, .46, .44, .42, .40
   DT   .38, .36, .34, .32, .30
   DT   .28, .26, .24, .22, .20
   DT   .18, .16, .14, .12, .10
   DT   .8, .6, .4, .2, .0, .0, .0, .0

;

   DT .0, .0, .0, .0, .2, .4, .6, .8
   DT   .10, .12, .14, .16, .18
   DT   .20, .22, .24, .26, .28
   DT   .30, .32, .34, .36, .38
   DT   .40, .42, .44, .46, .48
   DT   .50, .52, .54, .56, .58
   DT   .60, .62, .64, .66, .68
   DT   .70, .72, .74, .76, .78
   DT   .80, .82, .84, .86, .88
   DT   .90, .92, .94, .96, .98
   DT   .100, .102, .104, .106, .108
   DT   .110, .112, .114, .116, .118
   DT   .120, .122, .124, .126, .128
   DT   .130, .132, .134, .136, .138
   DT   .140, .142, .144, .146, .148
   DT   .150, .152, .154, .156, .158
   DT   .160, .162, .164, .166, .168
   DT   .170, .172, .174, .176, .178
   DT   .180, .182, .184, .186, .188
   DT   .190, .192, .194, .196, .198
   DT   .200, .202, .204, .206, .208
   DT   .210, .212, .214, .216, .218
   DT   .220, .222, .224, .226, .228
   DT   .230, .232, .234, .236, .238
   DT   .240, .242, .244, .246, .248

y ya ni hablar de una senoidal  :? no se ni como, pero estuve intentando que mplab generase algunos datos para no tener que copiarla de una grafica. por que no tengo ni idea de hacer una integral?? creo que se llama asi. hace unos dias incluso pensaba que a lo mejor con algunas ecuaciones podria sacarla pero claro. no son ecuaciones precisamente. :? y a mi las mates... por eso el example. pero bueno. dicen que no hay mal que por bien no venga y creo que para algo me servira, no se exactamente para que. pues como bien has puesto Bruno es mas facil escribir eso que na


 para no perder el hilo os pongo la tabla con las operaciones ;-)
Citar
Operadores Aritméticos y de Procedencia
Operador    Ejemplo
$    Retorna contador de programa    goto $+3
(    Paréntesis izquierdo    1 +(d*4)
)    Paréntesis derecho    (longitud+1) * 256
!    Operador NOT (completo lógico)    If ! (a - b)
-    Negación (complemento a 2)    -1 * longitud
~    Complemento    flags = ~flags
high    Retorna byte alto    movlw high CTR_Tabla
low    Retorna byte bajo    movlw low CTR_Tabla
upper    Retorna byte superior    movlw upper CTR_Tabla
*    Multiplica    a = b * c
/    División    a = b / c
%    Módulo    entry_len = tot_len % 16
+    Suma    tot_len = entry_len * 8 + 1
-    Resta    entry_len = (tot - 1) / 8
<<    Desplazamiento a la izquierda    flags = flags << 1
>>    Desplazamiento a la derecha    flags = flags >> 1
>=    Mayor o igual    If entry_idx >= num_entries
>    Mayor que    If entry_idx > num_entries
<    Menor que    If entry_idx < num_entries
<=    Menor o igual    If entry_idx <= num_entries
= =    Igual a    If entry_idx = num_entries
!=    No igual a    If entry_idx != num_entries
&    Bitwise AND    flags = flags & ERROR_BIT
^    Bitwise Or-exclusiva    flags = flags ^ ERROR_BIT
|    Bitwise Or    flags = flags | ERROR_BIT
&&    Función AND lógica    If (len = = 511) && (b = = c)
||    Función lógica OR    If (len = = 511) || (b = = c)
=    Hacer igual a    entry_index = 0
+=    Sumar a, hacer igual    entry_index += 1
-=    Restar, hacer igual    entry_index -= 1
*=    Multiplicar, hacer igual    entry_index *= entry_length
/=    Dividir, hacer igual    entry_index /= entry_length
%=    Módulo, hacer igual    entry_index %= 8
<<=    Desplaza a la izquierda, hacer igual    flags <<=3
>>=    Desplaza a la derecha, hacer igual    flags >>=3
&=    AND, hacer igual    flags &=ERROR_FLAG
|=    OR, hacer igual    flags |= ERROR_FLAG
^=    OR-Exclusiva, hacer igual    flags ^= ERROR_FLAG
++    incrementar    i ++
--    decrementar    i --

un saludo
Título: Re: Algunas directivas útiles en ASM
Publicado por: BrunoF en 05 de Enero de 2010, 14:45:07
No se si te sigo...

Podes recurrir a algo asi para poder generar mucho codigo dinamico con pocas lineas.

Un ejemplo que hice para ver si es esto lo que buscas:

Este codigo:

Código: ASM
  1. TablaAutomatica macro valInicial,incremento,iteraciones
  2.                                 variable contador,tmp
  3.                                 tmp=valInicial
  4.  
  5.                                 ERRORLEVEL -207
  6.  
  7.                                 while(contador<iteraciones)
  8.                                         retlw   tmp
  9.                                         tmp+=incremento
  10.                                         contador++
  11.                                 endw                   
  12.  
  13.                                 ERRORLEVEL +207
  14.  
  15.                                 endm
  16.  
  17.                                 TablaAutomatica 0,1,10
  18.                                 TablaAutomatica 0,3,20


Genera esto.

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28950.0;attach=10877)


Título: Re: Algunas directivas útiles en ASM
Publicado por: alogic.on en 05 de Enero de 2010, 15:41:14
coach :shock: no si siempre me dejas pasmao. lo estudiare a ver que sale, gracias
Título: Re: Algunas directivas útiles en ASM
Publicado por: groundman en 09 de Enero de 2010, 09:15:44
hola,yo queria rellenar alguna direcciones del programa con alguna directiva.por ejemplo

clrf        AUX0
clrf        AUX1
clrf        AUX2
clrf        AUX3


 si hubiera algo asi:    "DIRECTIVA " clrf AUX0+4

seria como decirle que borrara 4 posiciones de memoria ram.inclusive AUX0. hay algo por ahi?
Título: Re: Algunas directivas útiles en ASM
Publicado por: BrunoF en 09 de Enero de 2010, 12:23:00
No, pero podes generarla. Todo puede generarse dinamicamente...
Título: Re: Algunas directivas útiles en ASM
Publicado por: mtristan en 09 de Enero de 2010, 12:55:03
.


Si todas las variables AUX0, AUX1, etc. estuvieran una después de otra, podrías hacer...

Código: ASM
  1. VARIABLE        AUX=0x20, CONT=0, MAXIMO=4      ; Dirección de AUX0
  2.  
  3. ...
  4.  
  5.         WHILE   CONT < MAXIMO
  6.  
  7.         CLRF    AUX
  8.         AUX=AUX+1
  9.         CONT=CONT+1
  10.  
  11.         ENDW

Por supuesto que para 4 variables queda más cómodo poner 4 CLRF, pero tal vez te sirva si querés dificultar un poco la lectura de tu código  ;-)


Título: Re: Algunas directivas útiles en ASM
Publicado por: BrunoF en 09 de Enero de 2010, 13:22:58
Código: [Seleccionar]
Limpiar macro memInicial,cantidad
variable contador
contador=cantidad

ERRORLEVEL -207

while(contador>0)
                                        clrf memInicial
                                        memInicial++
                                        contador--
endw

ERRORLEVEL +207

endm

Limpiar AUX,4


Título: Re: Algunas directivas útiles en ASM
Publicado por: BrunoF en 09 de Enero de 2010, 13:31:20
Mmmm ahora que vuelvo a revisar lo que querés, no creo que se pueda. Creo que hay serias limitaciones.

No se permite pasar una cadena como "CLRF" a una MACRO.

Por supuesto que podriamos generar un conjunto de definiciones y asignarle un valor a CLRFx (CLRF no podria ser utilizado porque es una palabra reservada del lenguaje) y luego si pasar este valor como CLRFx a la MACRO

Igualmente, si quieres borrar muchas posiciones consecutivas, lo mejor es usar direccionamento indirecto. Lo optimo seria armar una macro que segun la cantidad de posiciones a limpiar, decida si conviene hacer CRLF a una por una o usar el direccionamiento indirecto para limpiarlas. Todo depende de la ROM y velocidad que se quiera rescatar.
Saludos.










Título: Re: Algunas directivas útiles en ASM
Publicado por: groundman en 09 de Enero de 2010, 15:08:35
gracias por la explicacion.pero mi intencion era poner cuanto menos codigo mejor.veo que para 4 instruciones no interesa realizar un direcionamiento indirecto