ELENA09

Untitled

Jun 16th, 2020
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. format PE CONSOLE
  2. entry start
  3. include 'includes\win32ax.inc'
  4.  
  5. ;G=(N, Σ, P, S). N={S, A, B, C}, Σ={a,b}, P={S→aA|bB, A→aA|bB, B→bS|aC, C→aC|bC|e}
  6.  
  7. section '.data' data readable writeable
  8. fileName    db 20 dup(0)
  9. lfileName   dd  ?
  10. flength     dd ?
  11. fbuf        dd ?
  12. msg         db  '%s %s%s',0
  13. errmsg      db "Ошибка! Нужно задать имя текстового файла для ввода. Или файл пустой",0
  14. hHeap       dd  ?
  15. _hFile      dd  ?
  16. _r          dd 00
  17. stdin       dd ?
  18. stdout      dd ?
  19.  
  20. section '.code' code readable executable
  21.  
  22. start:
  23. ; подключение русского языка
  24.     invoke SetConsoleOutputCP,CP_UTF8
  25.     invoke SetConsoleCP, CP_UTF8
  26.  
  27.     invoke printf,'%s',<'Привет',13,10,0>
  28.     invoke   GetStdHandle, STD_OUTPUT_HANDLE
  29.     mov      [stdout],eax
  30.     invoke    GetStdHandle, STD_INPUT_HANDLE
  31.     mov      [stdin],eax
  32. ; Запрашиваем имя файла
  33.         cinvoke printf,'%s',<'Имя файла : ',0>
  34.         invoke   ReadConsole,[stdin],fileName,20,lfileName,NULL
  35.         mov      EBX, lfileName
  36.         sub      [lfileName],2
  37.         mov      EBX,  [lfileName]
  38.         mov      [fileName +EBX ],0
  39.  
  40. ; Открываем файл для чтения
  41.         invoke      CreateFile, fileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ;????
  42.         mov     [_hFile], eax
  43.         cmp     eax, -1
  44.         je      err1
  45. ;Определим длину файлa
  46.         invoke      GetFileSize, [_hFile], flength
  47.         ;cmp            eax,0   ;сравнить можно???
  48.         ;je         err1
  49.         mov         [flength],eax
  50. ;Вывод длины
  51.         cinvoke     printf,'Длина файла = %d %s',[flength],<10,13,0>
  52. ;Выделение памяти
  53.         invoke      GetProcessHeap
  54.         cmp         eax,NULL
  55.         jne         GoodHeap
  56.         cinvoke     printf,'%s',<'Ошибка выделения памяти', 10 ,13,0>
  57.         jmp         _closef
  58. GoodHeap:
  59.         mov     [hHeap],eax
  60.         mov     ebx,[flength]
  61.         add     ebx,2
  62.         invoke      HeapAlloc,[hHeap],HEAP_ZERO_MEMORY,ebx
  63.         test    eax,eax
  64.         jz      _closef
  65.         mov     [fbuf],eax
  66. ; Читаем весь файл
  67.         invoke  ReadFile,[_hFile],[fbuf],[flength],_r, NULL
  68. ;Записать в конец 0 - символ конца строки
  69.         mov     ebx,[fbuf]
  70.         add     ebx,[flength]
  71.         mov     byte[ebx],0
  72. ;Вывод на консоль
  73.         cinvoke     puts,[fbuf]
  74.  
  75.  
  76. ; Закрытие файла
  77. _closef:
  78.     invoke HeapFree, [hHeap], [fbuf] ; ОСВОБОЖДЕНИЕ КУЧИ
  79.         invoke  CloseHandle,[_hFile]
  80.         mov     [_hFile],0
  81. ; Работа автомата
  82. mov ebx, [fbuf]
  83. dec ebx ; перейдём к -1 элементу, чтобы хорошо войти в цикл
  84. S:
  85.     inc ebx
  86.     mov AL, byte[ebx] ;заносим символ в AL
  87.     cmp AL, 'a'
  88.     je A ; если символ = а - переходим в состояние А
  89.     cmp AL, 'b'
  90.     je B
  91.     jmp er ;если это любой другой символ крома а и b (или конечный 0) - уходим в ошибку
  92.     A:
  93.         inc ebx
  94.         mov AL, byte[ebx]
  95.         cmp AL, 'a'
  96.         je A
  97.         cmp AL, 'b'
  98.         je B
  99.         jmp er
  100.     B:
  101.         inc ebx
  102.         mov AL, byte[ebx]
  103.         cmp AL, 'a'
  104.         je C
  105.         cmp AL, 'b'
  106.         je S
  107.         jmp er
  108.        
  109.     C:
  110.         inc ebx
  111.         mov AL, byte[ebx]
  112.         cmp AL, 'a'
  113.         je C
  114.         cmp AL, 'b'
  115.         je C
  116.         cmp AL, 0
  117.         jne er
  118.         cinvoke puts, "YES"
  119.         jmp fin
  120.     er:
  121.         cinvoke puts, "NO"
  122.     fin:
  123.  cinvoke puts,'Press any key...'
  124.  cinvoke _getch
  125.  invoke ExitProcess,0
  126.  
  127. err1:
  128.  cinvoke puts,errmsg
  129.  jmp fin
  130.  
  131. section '.idata' import data readable writeable
  132.  
  133. library kernel,'kernel32.dll',\
  134. msvcrt,'msvcrt.dll',\
  135. user32,'user32.dll'
  136.  
  137. import kernel,\
  138. ExitProcess,'ExitProcess',\
  139. SetConsoleOutputCP,'SetConsoleOutputCP',\
  140. SetConsoleCP,'SetConsoleCP',\
  141. GetProcessHeap,'GetProcessHeap',\
  142. HeapAlloc,'HeapAlloc',\
  143. HeapFree,'HeapFree',\
  144. CreateFile , 'CreateFileA',\
  145. GetFileSize , 'GetFileSize',\
  146. ReadFile , 'ReadFile' ,\
  147. WriteFile , 'WriteFile' ,\
  148. CloseHandle , 'CloseHandle',\
  149. GetStdHandle,'GetStdHandle',\
  150. WriteConsole,'WriteConsoleA',\
  151. ReadConsole,'ReadConsoleA',\
  152. SetFilePointer,'SetFilePointer'
  153.  
  154.  
  155. import msvcrt,\
  156. printf,'printf',\
  157. _getch,'_getch',\
  158. puts,'puts',\
  159. scanf,'scanf',\
  160. fscanf,'fscanf'
Add Comment
Please, Sign In to add comment