commit 8effa140062b34c0a5df51ef956abfa0eb2e6e90 Author: serr Date: Sat Feb 15 19:37:34 2025 +0300 new diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..adb36c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.exe \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..210e546 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Разные маленькие программки, написанные мной на FASM под Windows \ No newline at end of file diff --git a/getinput/echo.asm b/getinput/echo.asm new file mode 100644 index 0000000..577e17e --- /dev/null +++ b/getinput/echo.asm @@ -0,0 +1,75 @@ +format PE console +entry start +include '%FASMINC%\WIN32A.INC' + + +section '.code' code readable executable +start: + invoke printf, usage + invoke printf, req + invoke malloc, 2 ; аллоцирую изначально 2 байта под символ и нуль-терминатор + mov ebx, eax ; адрес строки будет в ebx + push 2 ; емкость + push 0 ; длина строки в стеке + +.next_char: + ; беру со стека длину и емкость + pop eax ; длина + pop ecx ; емкость + ; увеличиваю длину на 1 + inc eax + cmp eax, ecx ; если длина = емкость + je .realloc_memory ; реаллоцирую память + push ecx ; новая емксоть в стек + push eax ; новая длина в стек + jmp .continue ; иначе продолжаю программу + +.realloc_memory: + ; удваиваю емкость + shl ecx, 1 + push ecx ; новая емксоть в стек + push eax ; новая длина в стек + invoke realloc, ebx, ecx + pop ebx + pop ecx + mov ebx, eax ; в ebx новый адрес данных + +.continue: + invoke getche ; считываю символ с клавиатуры + cmp al, 13 + je .end ; Если Enter, завершаем ввод + mov edx, eax ; символ из eax в edx + pop eax ; берем новую длину + mov [ebx + eax - 1], dl ; сохраняю считанный символ в выделенной памяти + mov byte [ebx + eax], 0 ; добавляю нуль-терминатор + push eax + jmp .next_char ; след итерация + +.end: + ; вывод результата + invoke printf, resp, ebx + ; освобождение памяти + invoke free, ebx + invoke getch + invoke ExitProcess, 0 + + +section '.data' data readable writeable + usage db 'This is a test echo program written in FASM, outputting to you the string you entered. Works with strings of any length!', 10, 10, 0 + req db 'TEXT: ', 0 + resp db 10, 'ECHO: %s', 10, 0 + newline db 10, 0 + +section '.idata' import data readable + library \ + msvcrt, 'msvcrt.dll', \ + kernel32, 'kernel32.dll' + import msvcrt, \ + malloc, 'malloc', \ + realloc, 'realloc', \ + free, 'free', \ + printf, 'printf', \ + getche, '_getche', \ + getch, '_getch' + import kernel32, \ + ExitProcess, 'ExitProcess' \ No newline at end of file diff --git a/hellosailor/hello.asm b/hellosailor/hello.asm new file mode 100644 index 0000000..aed58b7 --- /dev/null +++ b/hellosailor/hello.asm @@ -0,0 +1,22 @@ +format PE +entry start + +include '%FASMINC%\WIN32A.INC' + +section '.data' data readable writeable + message db 'Hello, Sailor!!', 0 + +section '.code' code readable executable +start: + invoke printf, message + invoke ExitProcess, 0 + +section '.idata' import data readable + library \ + msvcrt, 'msvcrt.dll', \ + kernel32, 'kernel32.dll' + + import msvcrt, \ + printf, 'printf' + import kernel32, \ + ExitProcess, 'ExitProcess'