From cf403b7d1808f1d178d2b615f509f444bfdb8241 Mon Sep 17 00:00:00 2001 From: serr Date: Sun, 16 Feb 2025 13:56:35 +0300 Subject: [PATCH] =?UTF-8?q?getinput:=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE=D0=B9?= =?UTF-8?q?=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB?= =?UTF-8?q?=20=D0=B2=20=D0=BE=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=83=D1=8E=20?= =?UTF-8?q?=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- getinput/echo.asm | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/getinput/echo.asm b/getinput/echo.asm index d945de7..9dfd4b5 100644 --- a/getinput/echo.asm +++ b/getinput/echo.asm @@ -8,51 +8,52 @@ section '.code' code readable executable start: invoke printf, usage invoke printf, req + call get_string + invoke printf, resp, eax + invoke free, eax + invoke getch + invoke ExitProcess, 0 + +; Функция, считывающая строку любой длины из консоли +get_string: + push ebp ; указатель на начало стека в ebp + mov ebp, esp ; новый epb - esp invoke malloc, 2 ; аллоцирую изначально 2 байта под символ и нуль-терминатор mov ebx, eax ; адрес строки будет в ebx push 2 ; емкость push 0 ; длина строки - .next_char: - ; беру со стека длину и емкость pop eax ; длина pop ecx ; емкость - ; увеличиваю длину на 1 - inc eax + inc eax ; увеличиваю длину на 1 cmp eax, ecx ; если длина = емкость je .realloc_memory ; реаллоцирую память push ecx ; новая емксоть в стек push eax ; новая длина в стек jmp .continue ; иначе продолжаю программу - .realloc_memory: - ; удваиваю емкость - shl ecx, 1 + 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, завершаем ввод + je .exit ; Если 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 +.exit: + mov eax, ebx ; ответ в eax + mov esp, ebp ; восстанавлиает указатель указатель на вершину стека вызывающей функции + pop ebp ; восстанавливает указатель на начало стека вызывающей функции + ret ; возвращение управления section '.data' data readable writeable