• Jueves 13 de Mayo de 2021, 07:39

Autor Tema:  sudoku en asm  (Leído 1846 veces)

carlorodri

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
sudoku en asm
« en: Miércoles 11 de Mayo de 2011, 13:06 »
0
Hola compañeros programadores, estoy resolviendo las rutinas de un sudoku pero la verdad es que no me aclaro mucho, si alguien pudiese hecharme una mano estaria muy agradecido.



Y tendria que completar el siguiente codigo:

@;=== Programa per a calcular possibles números en una casella d'un sudoku  ===
@;= alumne 1 = nom2.cognom2x@estudiants.urv.cat

@;--- .data. Non-zero Initialized data ---
.data
      .global sudoku_input      @;matriu d'entrada (9 files x 9 columnes,
   sudoku_input:               @; més 7 columnes a -1 per motius de visualització en debugger)
      .byte   0, 1, 2, 0, 0, 9, 0, 0, 6, -1, -1, -1, -1, -1, -1, -1
      .byte   5, 0, 0, 0, 3, 0, 0, 2, 0, -1, -1, -1, -1, -1, -1, -1
      .byte   0, 9, 8, 0, 0, 0, 0, 0, 7, -1, -1, -1, -1, -1, -1, -1
      .byte   0, 2, 3, 7, 0, 4, 6, 0, 0, -1, -1, -1, -1, -1, -1, -1
      .byte   0, 8, 5, 0, 1, 0, 4, 7, 0, -1, -1, -1, -1, -1, -1, -1
      .byte   0, 0, 4, 6, 0, 5, 1, 8, 0, -1, -1, -1, -1, -1, -1, -1
      .byte   2, 0, 0, 0, 0, 0, 8, 5, 0, -1, -1, -1, -1, -1, -1, -1
      .byte   0, 6, 0, 0, 7, 0, 0, 0, 1, -1, -1, -1, -1, -1, -1, -1
      .byte   8, 0, 0, 3, 0, 0, 7, 6, 0, -1, -1, -1, -1, -1, -1, -1
                           @;fila de separació amb la matriu de sortida
      .byte   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1

@;-- .bss. Zero initialized data ---
.bss
      .global sudoku_output      @;matriu de sortida (82 files x 12 columnes,
   sudoku_output:               @; més 4 columnes a -2 per motius de visualitzacio en debugger)
      .space   82*16            @;format de sortida, per cada fila:
                           @; p_fil, p_col, num_pos_sol, poss_1, poss_2, poss_3, ..., poss_9
                           @; = p_fil és posició fila (de 0 a 8, 0 primera fila)
                           @; = p_col és posició columna (de 0 a 8, 0 més a l'esquerra)
                           @; = num_pos_sol és número de possibles solucions (de 1 a 9)
                           @; = poss_1 és 1 si el 1 és possible, 0 si no ho és
                           @; = poss_2 és 2 si el 2 és possible, 0 si no ho és
                           @; = poss_3 és 3 si el 3 és possible, 0 si no ho és
                           @; etc. fins a poss_9
                           @; (es completa la taula amb 4 posicions a -2, per fer 16 columnes)


@;-- .text. Program code ---
.text      
      .arm
      .global principal
   @;- Funció 'principal' -> recorre totes les casella del sudoku i invoca la funció 'fila_result'
   @;- per detectar quins números poden anar en aquella casella, emmagatzemant el resultat en una
   @;- fila de la matriu de resultats (veure definició de sudoku_output)
   @;-   resultat:
   @;- R4 = adreça base de la matriu de resultats
   @;- R5 = número de files de la matriu de resultats
   principal:
         push {r0-r3,r6,r7, lr}   @;salva a la pila els registres a modificar
         
         ldr r0, =sudoku_input   @;carrega adreça matriu de sudoku en R0
         ldr r4, =sudoku_output   @;carrega adreça matriu de resultats en R4
         mov r5, #0            @;R5 = índex de fila de resultats
         mov r1, #0            @;R1 = índex de fila de sudoku
      .Lbuc_fil:               @;bucle per a recórrer totes les files del sudoku
         
         mov r2, #0            @;R2 = índex de columna
      .Lbuc_col:               @;bucle per a recórrer totes les columnes del sudoku
         add r6, r2, r1, lsl #4   @;R6 = offset (fila * 16) + columna
         ldrb r7, [r0, r6]      @;carrega l'element (fila,columna) en R7
         cmp r7, #0            @;detecta si es tracta d'una posició buida
         bne .Lcont1            @;en cas negatiu, salta el paquet d'instruccions seguent
         add r3, r4, r5, lsl #4   @;R3 = adreça fila resultats
         bl fila_result         @;calcula fila resultats
         add r5, #1            @;incrementa índex fila resultats
      .Lcont1:
         add r2, #1            @;passa a la següent columna matriu sudoku
         cmp r2, #9            @;verifica si ha arribat a l'última columna
         bne .Lbuc_col         @;en cas negatiu, continua el bucle de columnes
         
         add r1, #1            @;passa a la següent fila matriu sudoku
         cmp r1, #9            @;verifica si ha arribat a l'última fila
         bne .Lbuc_fil         @;en cas negatiu, continua el bucle de files
         
         pop {r0-r3,r6,r7, pc}   @;restaura registres i retorna de la rutina




   @;- Funció 'fila_result' -> calcula els números que poden anar en una casella del sudoku;
   @;-   paràmetres:
   @;- R0 : adreça base matriu sudoku
   @;- R1 : fila de la casella
   @;- R2 : columna de la casella
   @;- R3 : adreça base de la fila de resultats (veure descipció en secció .bss)
   fila_result:
         push {lr}      @;salva a la pila els registres a modificar
         
         
         pop {pc}         @;restaura registres i retorna de la rutina




   @;- Funció 'actual_result' -> tanca el número que troba a la casella [R1,R2] dins la posicio corresponent de resultats (escriu un 0)
   @;-   paràmetres:
   @;- R0 : adreça base matriu sudoku
   @;- R1 : fila de la casella
   @;- R2 : columna de la casella
   @;- R3 : adreça de la fila de resultats, desplaçada fins a comptador de possibles resultats (offset 2)
   @;- R4 : comptador de possibles resultats (entrada)
   @;-   resultats:
   @;- R4 : comptador de possibles resultats (sortida)
   actual_result:
         push {lr}      @;salva a la pila els registres a modificar
         
         
         pop {pc}         @;restaura registres i retorna de la rutina



   @;- Funció 'subquad_result' -> calcula els números que poden anar a una casella en un subquadrat del sudoku;
   @;-   paràmetres:
   @;- R0 : adreça base matriu sudoku
   @;- R1 : fila de la casella
   @;- R2 : columna de la casella
   @;- R3 : adreça de la fila de resultats, desplaçada fins a comptador de possibles resultats (offset 2)
   @;- R4 : comptador de possibles resultats (entrada)
   @;-   resultats:
   @;- R4 : comptador de possibles resultats (sortida)
   subquad_result:
         push {lr}      @;salva a la pila els registres a modificar
         
         
         pop {pc}         @;restaura registres i retorna de la rutina



   @;- Funció 'divmul_3' -> calcula la fila/columna base d'una subregió, a partir d'un índex de
   @;- fila o columna (0-8), obtenint un número múltiple de 3 (0, 3, 6)
   @;-   paràmetres:
   @;- R5 : índex d'entrada (0-8)
   @;-   resultats:
   @;- R5 : número base de sortida (0, 3, 6)
   divmul_3:
         push {lr}      @;salva a la pila els registres a modificar
         
         
         pop {pc}         @;restaura registres i retorna de la rutina


.end




Cualquier comentario es bienvenido! gracias!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: sudoku en asm
« Respuesta #1 en: Jueves 12 de Mayo de 2011, 23:38 »
0
Si nos explicaras un poco lo que quieres exactamente, lo que llevas hecho y/o cuál es el problema, nos ahorarrías tiempo  ^_^