Advertisement
dllbridge

Chess.asm

Dec 16th, 2022
1,261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. format  PE console
  3.  
  4.  
  5.  
  6. entry   start
  7. include 'win32ax.inc'
  8. include 'api\kernel32.inc'
  9.  
  10.  
  11.  
  12. ;------------------------------------------------
  13. ;
  14. ;
  15. ;    Создание переменных !
  16. ;
  17. ;------------------------------------------------
  18. section '.data' data readable writeable
  19.  
  20.  
  21.  
  22.          sz1     db   17 dup(0)        ; Строка с координатами клеток    ( char sz1[17] )
  23.  
  24.  
  25.  
  26.            i     dd    0
  27.         nCell    dd    7 dup(0)        ; E2D3: Буква, цифра, Буква, цифра
  28.           pos    dd    0               ; Счётчик опознанных символов координат (должно быть 4)
  29.  
  30.        cell_1    dd    0               ; 0 = Чёрный цвет 1-й клетки (по умолчанию)
  31.        cell_2    dd    0               ; 0 = Чёрный цвет 2-й клетки (по умолчанию)
  32.  
  33.         sz2      db   'black.', 13, 10, 0                          ; по умолчанию
  34.         sz3      db   'white.', 13, 10, 0
  35.  
  36.         psz1     dd    ?               ; Указатели на строки
  37.         psz2     dd    ?
  38.  
  39. ;  A, B, C, D, E, F, G, H
  40. ;  a, b, c, d, e, f, g, h
  41. ;  1, 2, 3, 4, 5, 6, 7, 8
  42.  
  43. ;  Нечётная буква + нечётная цифра = ЧЁРНЫЙ цвет   (A, C, E: нечётные буквы, как 1, 3, 5)
  44. ;    чётная буква +   чётная цифра = ЧЁРНЫЙ цвет   (B, D, F:   Чётные буквы, как 2, 4, 6)
  45. ;  Нечётная буква +   чётная цифра =  белый
  46. ;    чётная буква + нечётная цифра =  белый
  47.  
  48. ;    E2E4    ->  (1, 0, 1, 0)  ->  1+0, 1+0 -> нечётное и нечётное (  Yes, same colors.)
  49. ;    h3-e5   ->  (0, 1, 1, 1)  ->  0+1, 1+1 -> нечётное и   ЧЁТНОЕ (No, various colors.)
  50. ;------------------------------------------------
  51. ;
  52. ;
  53. ;    Код программы
  54. ;
  55. ;------------------------------------------------
  56. section '.code' code readable executable
  57.  
  58.  
  59. start:     call Get_string
  60.  
  61. L_01:      mov  edx, [i]
  62.            xor  eax, eax
  63.            mov   al, [sz1 + edx]
  64.  
  65.            cmp  eax,  0             ;  Если строка кончилась раньше, чем мы нашли 4 символа, соо-
  66.            jz   L_06                ;              ...тветсвующие координатам двух клеток (E2-E4)
  67.  
  68.            inc  [i]
  69.            cmp   al,   '1'          ;  Сравниваем очередной символ с '1' (= 49)
  70.            jge  L_08                ;  больше или равно (al >= 49)
  71.  
  72. L_02:      mov  eax, [pos]
  73.            cmp  eax,  4
  74.            jl   L_01
  75.  
  76.  
  77.            mov   [psz1] , sz2
  78.            mov   [psz2] , sz2
  79.            mov     eax  , [nCell     ]
  80.            add     eax  , [nCell +  4]
  81.            test    eax  ,  1
  82.            jz      L_03              ; если чётное, то переход...
  83.            mov  [cell_1],  1         ; Белый цвет у первой клетки
  84.            mov   [psz1] , sz3
  85.  
  86. L_03:      mov     eax  , [nCell +  8]
  87.            add     eax  , [nCell + 12]
  88.            test    eax  ,  1
  89.            jz      L_04              ; если чётное, то переход...
  90.            mov  [cell_2],  1         ; Белый цвет у 2-й клетки
  91.            mov   [psz2] , sz3
  92.  
  93. L_04:      mov  eax, [cell_1]
  94.            cmp  eax, [cell_2]
  95.            jz   L_07
  96.            cinvoke  printf, <"No, various colors.", 10, 0>
  97.  
  98.  
  99. L_05:      cinvoke  printf, <"1st cell is %s">,  [psz1]
  100.            cinvoke  printf, <"2nd cell is %s">,  [psz2]
  101.            cinvoke  scanf, <"%d", 10, 0>, pos
  102.            invoke   ExitProcess, 0             ; Завершаем программу
  103.            ; - - - - - - - - - - - - - - - - - -
  104.  
  105. L_06:      cinvoke  printf, <"Error! You entered the coordinates incorrectly.", 10, 0>
  106.            cinvoke  printf, <"pos = %d. All 4 positions must be filled.", 10, 0>, [pos]
  107.            cinvoke  printf, <"%d, %d, %d, %d", 10, 0>, [nCell], [nCell+4], [nCell+8], [nCell+12]
  108.            cinvoke  printf, <"cell_1 = %d", 10, 0>,   [cell_1]
  109.            cinvoke  printf, <"cell_2 = %d", 10, 0>,   [cell_2]
  110.            jmp   L_05
  111.  
  112. L_07:      cinvoke  printf, <"Yes, same colors.", 10, 0>
  113.            jmp   L_05
  114.  
  115. L_08:      ccall  parity_check, eax
  116.            jmp   L_02
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126. ;   Так производитим проверку на чётность числа в аккумуляторе.
  127. ;   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  128. ;   test  eax,1
  129. ;   jnz   Odd    ;нечетное, переход на метку Odd
  130. ;   jz    Even   ;четное, переход на метку Even
  131. ;    ........
  132. ;   Odd:.....
  133. ;    ........
  134. ;   Even:....
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144. ; Функция ожидает от пользователя ввод координат двух клеток на шахматной доске
  145. ; Например: E2E4
  146. ;           e2e3
  147. ;           f7-G1
  148. ;/////////////////////////////////////////////////////////////
  149. proc    Get_string                                         ;//
  150.  
  151.         cinvoke  printf, <"Enter the coordinates of 2 cells.", 0>
  152.         cinvoke  printf, <"  For example: E2-E4, e2-e4, E2E4, e2e4.", 10, 0>
  153.         cinvoke  scanf, <"%s">, sz1
  154.         ret
  155. endp
  156.  
  157.  
  158.  
  159.  
  160. ;//   arg % 2  Проверяем чётная ли буква или цифра
  161. ;//   результат (0 или 1) поместим  в nCell[pos]
  162. ;/////////////////////////////////////////////////////////////
  163. proc    parity_check, arg                                  ;//
  164.  
  165.         mov   eax, [arg]
  166.         mov    bl, 2
  167.         div    bl                                          ;//    ah - хранит остаток от деления
  168.         shr   eax, 8
  169.  
  170.         ; cinvoke  printf, <"    =  %d", 10, 0>, eax       ;//         Печать остатка от деления
  171.  
  172.         mov  edx,   [pos]
  173.         mov [nCell + edx * 4], eax
  174.         inc [pos]
  175.         ret
  176. endp
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188. ;------------------------------------------------
  189. ;
  190. ;
  191. ;    Подключение библиотек
  192. ;
  193. ;------------------------------------------------
  194.  
  195. ; CINVOKE макрос в составе FASM.  Позволяет вызывать CDECL-функции.
  196.  
  197.  
  198.  
  199.  
  200.  
  201. section '.idata' import data readable
  202. library kernel32, 'kernel32.dll',\
  203.         msvcrt,   'msvcrt.dll'
  204.  
  205. import msvcrt,\
  206.        printf, 'printf',\
  207.         scanf,  'scanf'
  208.  
  209.  
  210.  
  211.          
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement