Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- format PE CONSOLE
- entry start
- include 'includes\win32ax.inc'
- ;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}
- section '.data' data readable writeable
- fileName db 20 dup(0)
- lfileName dd ?
- flength dd ?
- fbuf dd ?
- msg db '%s %s%s',0
- errmsg db "Ошибка! Нужно задать имя текстового файла для ввода. Или файл пустой",0
- hHeap dd ?
- _hFile dd ?
- _r dd 00
- stdin dd ?
- stdout dd ?
- section '.code' code readable executable
- start:
- ; подключение русского языка
- invoke SetConsoleOutputCP,CP_UTF8
- invoke SetConsoleCP, CP_UTF8
- invoke printf,'%s',<'Привет',13,10,0>
- invoke GetStdHandle, STD_OUTPUT_HANDLE
- mov [stdout],eax
- invoke GetStdHandle, STD_INPUT_HANDLE
- mov [stdin],eax
- ; Запрашиваем имя файла
- cinvoke printf,'%s',<'Имя файла : ',0>
- invoke ReadConsole,[stdin],fileName,20,lfileName,NULL
- mov EBX, lfileName
- sub [lfileName],2
- mov EBX, [lfileName]
- mov [fileName +EBX ],0
- ; Открываем файл для чтения
- invoke CreateFile, fileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ;????
- mov [_hFile], eax
- cmp eax, -1
- je err1
- ;Определим длину файлa
- invoke GetFileSize, [_hFile], flength
- ;cmp eax,0 ;сравнить можно???
- ;je err1
- mov [flength],eax
- ;Вывод длины
- cinvoke printf,'Длина файла = %d %s',[flength],<10,13,0>
- ;Выделение памяти
- invoke GetProcessHeap
- cmp eax,NULL
- jne GoodHeap
- cinvoke printf,'%s',<'Ошибка выделения памяти', 10 ,13,0>
- jmp _closef
- GoodHeap:
- mov [hHeap],eax
- mov ebx,[flength]
- add ebx,2
- invoke HeapAlloc,[hHeap],HEAP_ZERO_MEMORY,ebx
- test eax,eax
- jz _closef
- mov [fbuf],eax
- ; Читаем весь файл
- invoke ReadFile,[_hFile],[fbuf],[flength],_r, NULL
- ;Записать в конец 0 - символ конца строки
- mov ebx,[fbuf]
- add ebx,[flength]
- mov byte[ebx],0
- ;Вывод на консоль
- cinvoke puts,[fbuf]
- ; Закрытие файла
- _closef:
- invoke HeapFree, [hHeap], [fbuf] ; ОСВОБОЖДЕНИЕ КУЧИ
- invoke CloseHandle,[_hFile]
- mov [_hFile],0
- ; Работа автомата
- mov ebx, [fbuf]
- dec ebx ; перейдём к -1 элементу, чтобы хорошо войти в цикл
- S:
- inc ebx
- mov AL, byte[ebx] ;заносим символ в AL
- cmp AL, 'a'
- je A ; если символ = а - переходим в состояние А
- cmp AL, 'b'
- je B
- jmp er ;если это любой другой символ крома а и b (или конечный 0) - уходим в ошибку
- A:
- inc ebx
- mov AL, byte[ebx]
- cmp AL, 'a'
- je A
- cmp AL, 'b'
- je B
- jmp er
- B:
- inc ebx
- mov AL, byte[ebx]
- cmp AL, 'a'
- je C
- cmp AL, 'b'
- je S
- jmp er
- C:
- inc ebx
- mov AL, byte[ebx]
- cmp AL, 'a'
- je C
- cmp AL, 'b'
- je C
- cmp AL, 0
- jne er
- cinvoke puts, "YES"
- jmp fin
- er:
- cinvoke puts, "NO"
- fin:
- cinvoke puts,'Press any key...'
- cinvoke _getch
- invoke ExitProcess,0
- err1:
- cinvoke puts,errmsg
- jmp fin
- section '.idata' import data readable writeable
- library kernel,'kernel32.dll',\
- msvcrt,'msvcrt.dll',\
- user32,'user32.dll'
- import kernel,\
- ExitProcess,'ExitProcess',\
- SetConsoleOutputCP,'SetConsoleOutputCP',\
- SetConsoleCP,'SetConsoleCP',\
- GetProcessHeap,'GetProcessHeap',\
- HeapAlloc,'HeapAlloc',\
- HeapFree,'HeapFree',\
- CreateFile , 'CreateFileA',\
- GetFileSize , 'GetFileSize',\
- ReadFile , 'ReadFile' ,\
- WriteFile , 'WriteFile' ,\
- CloseHandle , 'CloseHandle',\
- GetStdHandle,'GetStdHandle',\
- WriteConsole,'WriteConsoleA',\
- ReadConsole,'ReadConsoleA',\
- SetFilePointer,'SetFilePointer'
- import msvcrt,\
- printf,'printf',\
- _getch,'_getch',\
- puts,'puts',\
- scanf,'scanf',\
- fscanf,'fscanf'
Add Comment
Please, Sign In to add comment