Advertisement
Guest User

Esercizio Scacchiera

a guest
Jan 23rd, 2016
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. comment   *----------------------------------------
  2.                 Esercizio: scacchiera
  3.                 Author   : Marco 'RootkitNeo'
  4.           ----------------------------------------*
  5.  
  6.  
  7. include         c:\masm32\include\masm32rt.inc
  8. include         coords.inc
  9.  
  10. ; ==================================
  11. ;         MACRO
  12. ; ==================================
  13. ; Calcola l'abs() di un valore passato in number
  14. ABS_NUMBER     MACRO    number
  15.   push         ebx
  16.  
  17.   mov          ebx, number
  18.   sar          ebx, 01Fh
  19.   xor          number, ebx
  20.   sub          number, ebx
  21.  
  22.   pop          ebx
  23.  
  24. ENDM
  25.  
  26. ; ==================================
  27.  
  28.  
  29.  
  30. ; SEZIONI
  31. ; ========================================================================
  32. .data
  33.  
  34. szWhiteKing             db        "========= Posizione Re Bianco ======== ",13,10,0
  35. szBlackKing             db        13,10,"========= Posizione Re Nero ======== ",13,10,0
  36. szBlackQueen            db        13,10,"========= Posizione Regina Nera ======== ",13,10,0
  37. szPossibleState         db        13,10,"========= Possibili Mosse Re Bianco ========",13,10,0
  38.  
  39. szX                     db        "X: ",0
  40. szY                     db        "Y: ",0
  41.  
  42. szTemp                  db  7     dup(?)    ; Numero letto da tastiera
  43.  
  44. ; ========================================================================
  45. .data?
  46.  
  47. coordsWhiteKing         COORDS    < >     ; Re Bianco
  48. coordsBlackKing         COORDS    < >     ; Re Nero
  49. coordsBlackQueen        COORDS    < >     ; Regina Nera
  50.  
  51. pointerToMemory         DWORD      ?      ; Puntatore DWORD non inizializzato
  52.                                           ; alloco memoria dinamicamente (non che sia utile)
  53.  
  54. ; ========================================================================
  55. .code
  56. start:
  57.  
  58.   ; White King
  59.   ; ------------------------------------------------------
  60.   print    offset  szWhiteKing
  61.   print    offset  szX
  62.  
  63.   invoke           StdIn, addr szTemp, 6
  64.   invoke           atodw, addr szTemp
  65.   mov              coordsWhiteKing.dwX, eax
  66.  
  67.   print    offset  szY
  68.  
  69.   invoke           StdIn, addr szTemp, 6
  70.   invoke           atodw, addr szTemp
  71.   mov              coordsWhiteKing.dwY, eax
  72.   ; ------------------------------------------------------
  73.  
  74.   ; Black King
  75.   ; ------------------------------------------------------
  76.   print    offset  szBlackKing
  77.   print    offset  szX
  78.  
  79.   invoke           StdIn, addr szTemp, 6
  80.   invoke           atodw, addr szTemp
  81.   mov              coordsBlackKing.dwX, eax
  82.  
  83.   print    offset  szY
  84.  
  85.   invoke           StdIn, addr szTemp, 6
  86.   invoke           atodw, addr szTemp
  87.   mov              coordsBlackKing.dwY, eax
  88.   ; ------------------------------------------------------
  89.  
  90.   ; Black Queen
  91.   ; ------------------------------------------------------
  92.   print    offset  szBlackQueen
  93.   print    offset  szX
  94.  
  95.   invoke           StdIn, addr szTemp, 6
  96.   invoke           atodw, addr szTemp
  97.   mov              coordsBlackQueen.dwX, eax
  98.  
  99.   print    offset  szY
  100.  
  101.   invoke           StdIn, addr szTemp, 6
  102.   invoke           atodw, addr szTemp
  103.   mov              coordsBlackQueen.dwY, eax
  104.   ; ------------------------------------------------------
  105.  
  106.   ; Verifico se i Re sono in posizioni adiacenti
  107.   push             coordsWhiteKing.dwY
  108.   push             coordsWhiteKing.dwX
  109.   call             isBlackKingNear
  110.  
  111.   .IF eax == 1
  112.     print            "I Re non possono essere vicini.",13,10
  113.     jmp              _exit
  114.   .ENDIF
  115.  
  116.   ; Verifico se è scacco; se scacco matto restituisce eax=2
  117.   ; in caso contrario restituira' 0
  118.   call             checkMateWoman
  119.  
  120.   .IF eax == 2
  121.     print            "Scacco Matto, nessuna mossa disponibile",13,10
  122.     jmp              _exit
  123.   .ENDIF
  124.  
  125.   ; Se ci sono mosse possibili le stampo a video
  126.   print   offset   szPossibleState
  127.  
  128.   call             printPosition
  129.  
  130.   _exit:
  131.  
  132.   call             GetProcessHeap
  133.   invoke           HeapFree, eax, 0, pointerToMemory
  134.  
  135.   inkey
  136.   invoke           ExitProcess, 0
  137.  
  138.  
  139.  
  140. ; Restituisce in EAX la distanza tra (x,y) e le relative coordinate
  141. ; del Re Nero. Se EAX=1 i Re confinano
  142. ; Distanza di Tchebichev
  143. ; -------------------------------------------------------------
  144. isBlackKingNear         proc uses ebx edx        dwX :DWORD, dwY :DWORD  
  145.   mov                   eax, dwX
  146.   sub                   eax, coordsBlackKing.dwX
  147.   ABS_NUMBER            eax
  148.  
  149.   push                  eax  
  150.  
  151.   mov                   eax, dwY
  152.   sub                   eax, coordsBlackKing.dwY
  153.   ABS_NUMBER            eax
  154.   mov                   ebx, eax
  155.  
  156.   pop                   eax
  157.  
  158.   cmp                   eax, ebx
  159.   cmovl                 eax, ebx
  160.  
  161.   ret
  162.  
  163. isBlackKingNear         endp
  164. ; --------------------------------------------------------------------
  165. ;
  166.  
  167. ; Verifica lo scacco di donna
  168. ; --------------------------------------------------------------------
  169. checkMateWoman     proc
  170.  
  171.   call               GetProcessHeap
  172.   invoke             HeapAlloc, eax, HEAP_ZERO_MEMORY, 40h
  173.   mov                pointerToMemory, eax  
  174.  
  175.   mov                esi, eax
  176.   assume             esi :ptr COORDS
  177.  
  178.   ; Guardo tutt le 8 posizioni attorno al Re bianco
  179.   mov                eax, coordsWhiteKing.dwX
  180.   mov                ebx, coordsWhiteKing.dwY
  181.  
  182.   mov                ecx, eax
  183.   mov                edx, ebx
  184.   xor                ecx, ecx
  185.  
  186.   ; Cerca attorno al Re Bianco
  187.   dec                eax
  188.   dec                ebx
  189.   .WHILE ecx < 8
  190.     .IF ecx == 3 || ecx == 5
  191.       inc                eax
  192.       mov                ebx, edx
  193.       dec                ebx
  194.     .ELSEIF ecx == 4
  195.       inc                ebx
  196.     .ENDIF
  197.    
  198.     .IF eax > 0 && eax < 9 && ebx > 0 && ebx <9
  199.       mov              edi, eax
  200.    
  201.       push             ebx
  202.       push             eax
  203.       call             isCheckMateWoman
  204.      
  205.       .IF eax == 0
  206.         push             ebx
  207.         push             edi
  208.         call             isBlackKingNear
  209.        
  210.         ; Salvo le posizioni che non sono sotto scacco
  211.         .IF eax != 1
  212.           mov              [esi+ecx*8].dwX, edi
  213.           mov              [esi+ecx*8].dwY, ebx
  214.         .ENDIF
  215.        
  216.       .ENDIF
  217.      
  218.       mov              eax,edi
  219.      
  220.     .ENDIF
  221.    
  222.     inc                ecx
  223.     inc                ebx
  224.   .ENDW
  225.  
  226.   ; Se la memoria puntata da ESI risulta a 0
  227.   ; in corrispondenza del primo elemento, mi fermo;
  228.   ; si tratta di scacco matto, non ci sono mosse
  229.   ; che salvano il Re Bianco
  230.   .IF [esi].dwX == 0 && [esi].dwY == 0
  231.     mov              eax, 2
  232.   .ELSE
  233.     mov              eax, 0
  234.   .ENDIF
  235.  
  236.   ret
  237. checkMateWoman     endp
  238. ; ---------------------------------------------------------------------
  239.  
  240. ;Verifico se il Re e' sotto scacco dalla Regina
  241. ; @return:   EAX = 1 in presenza di scacco; 0 se non e' sotto scacco
  242. ; ---------------------------------------------------------------------
  243. isCheckMateWoman              proc uses ebx ecx edx dwX:DWORD, dwY:DWORD
  244.  
  245.   mov                eax, dwX
  246.   mov                ebx, dwY
  247.  
  248.   ; orizzontale / verticale
  249.   .IF eax == coordsBlackQueen.dwX || ebx == coordsBlackQueen.dwY
  250.     mov                eax, 1
  251.     ret
  252.   .ENDIF
  253.  
  254.   ;Diagonali
  255.   mov                ecx, coordsBlackQueen.dwX
  256.   sub                ecx, coordsBlackQueen.dwY
  257.  
  258.   sub                eax, ebx
  259.  
  260.   .IF eax == ecx
  261.     mov              eax, 1
  262.     ret
  263.   .ENDIF
  264.  
  265.   mov               ecx, coordsBlackQueen.dwX
  266.   add               ecx, coordsBlackQueen.dwY
  267.   mov               eax, dwX
  268.   add               eax, dwY
  269.  
  270.   .IF ecx == eax
  271.     mov               eax,1
  272.     ret
  273.   .ENDIF
  274.  
  275.   mov               eax,0
  276.  
  277.   ret
  278. isCheckMateWoman              endp
  279. ; ------------------------------------------------------------------------
  280. ;
  281.  
  282. ; Stampo le posizioni valide
  283. ; ------------------------------------------------------------------------
  284. printPosition    proc
  285.  
  286.   mov                esi, pointerToMemory
  287.   assume             esi:ptr COORDS
  288.   xor                ecx,ecx
  289.  
  290.   .WHILE ecx < 8
  291.     mov                eax, [esi+ecx*8].dwX
  292.     mov                ebx, [esi+ecx*8].dwY
  293.  
  294.     .IF eax > 0
  295.       push               ecx
  296.       print              str$(eax),32
  297.       print              str$(ebx),13,10
  298.       pop                ecx
  299.     .ENDIF
  300.    
  301.     inc                ecx
  302.   .ENDW
  303.  
  304.   ret
  305. printPosition    endp
  306. ; --------------------------------------------------------------------------
  307.  
  308. end           start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement