Autor Tema: duda assembler  (Leído 73 veces)

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

Desconectado fordone

  • PIC10
  • *
  • Mensajes: 4
duda assembler
« en: 14 de Noviembre de 2017, 13:41:34 »
Hola estoy comenzando con lenguaje ensamblador y estoy tratando de entener algunas instrucciones por medio del siguiente ejemplo

movlw   0xff              //aqui entiendo que estoy moviendo el valor ff en hexadecimal a w
movwf   REGISTRO,1 //aqui el valor anteriormente en w lo moveria al registro 1
movlw   0x01           //le asigno el valor 01 al registro w.
addwf   REGISTRO,1 //sumaria el valor de w al registro 1 y el resultado lo coloco en el registro
bcf   STATUS,1
decf   REGISTRO,0
movf   REGISTRO,1

Hasta donde les comento entiendo mas o menos solo necesitaria que me indiquen si estoy haciendolo bien o si por el contrario estoy equivocado. a partir de bcf se que deberia en esta instruccion poner en 0 el bit 1 del file status pero no comprendo bien que hace. Tambien tengo una gran duda con los flags (Z DC C) quisiera saber como se van afectando en cada instruccion para ver si lo logro entender. Espero puedan ocmpartir sus conocimientos conmigo y ayudarme. Saludos y gracias de antemano ((:-))

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6121
Re:duda assembler
« Respuesta #1 en: 14 de Noviembre de 2017, 14:23:02 »
Primero que nada te recomiendo que uses las notaciones que vienen en los .inc

movwf   REGISTRO,1

es mas sensato si usas:

Código: ASM
  1. movwf   REGISTRO, F      ;Resultado en REGISTRO
  2. movwf   REGISTRO, W   ; para cuando es 0, y el resultado va a W

Tambien tenes definido los valores C, Z entre otros para usarlo con el registro STATUS, entonces te queda asi:

Código: ASM
  1. bcf   STATUS, DC
  2. bcf   STATUS, Z
  3. bcf   STATUS, C

Citar
Hasta donde les comento entiendo mas o menos solo necesitaria que me indiquen si estoy haciendolo bien o si por el contrario estoy equivocado. a partir de bcf se que deberia en esta instruccion poner en 0 el bit 1 del file status pero no comprendo bien que hace.

Los primeros comentarios estan bien, pero recorda que los comentarios de ASM son con un punto y coma.
El BCF STATUS, DC pone a 0 el bit DC (carry digit), este bit se activa cuando  el nibble inferior produce un overflow.. Ejemplo si tenes 0x0F y le sumas 1 y las banderas en C = 0, Z = 0, DC = 0, y le sumas 1 a ese numero, el resultado quedaria 0x10, y las banderas C = 0 , Z = 0 , DC = 1

Por ahi es insentato el programa que pasaste... vamos a ver paso a paso que hace:

Código: ASM
  1. movlw   0xff                 ; W = 0xFF
  2. movwf   REGISTRO, F   ; REGISTRO = W = 0xFF
  3. movlw   0x01               ; W = 0x01
  4. addwf   REGISTRO, F    ; REGISTRO = W + REGISTRO = 0x01 + 0xFF  = 0x00 , Aca se actualizan las banderas, las cuales tanto C, Z y DC van a estar en 1
  5. bcf   STATUS, DC          ; Bandera DC en 0, quedando C = 1, Z = 1, DC = 0
  6. decf   REGISTRO, W      ; REGISTRO = 0x00 - 1 = 0xFF , El DECF actualiza solo afecta a la bandera Z del STATUS, por lo tanto las demas no cambian, y quedan C = 1, Z = 0, DC = 0
  7. movf   REGISTRO, F      ; El MOVF solo afecta la bandera Z, lo que hace aca es tomar el valor de REGISTRO y ponerlo en REGISTRO, es decir lo unico que hace es actualizar la bandera Z

Espero que se entienda lo ultimo, cada instruccion afecta a algunas o ninguna bandera del registro STATUS, lo tenes en la tabla. Si por ejemplo quisiera saber si el registro es 0, solo haria:

Código: ASM
  1. MOVF REGISTRO, F  ; o lo pongo en W si no me molesta perder el valor de W
  2. BTFSS STATUS, Z
  3. NOP       ; Aca si no es 0
  4. NOP       ; Aca si es 0


Desconectado fordone

  • PIC10
  • *
  • Mensajes: 4
Re:duda assembler
« Respuesta #2 en: 14 de Noviembre de 2017, 14:39:26 »
Todo muy bien explicado bro entendi lo que me dijiste perfectamente. Muchisimas gracias  ((:-))