getinput: выделил основной функционал в отельную функцию

master
serr 2025-02-16 13:56:35 +03:00
parent 05a3038675
commit cf403b7d18
1 changed files with 18 additions and 17 deletions

View File

@ -8,51 +8,52 @@ section '.code' code readable executable
start: start:
invoke printf, usage invoke printf, usage
invoke printf, req 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 байта под символ и нуль-терминатор invoke malloc, 2 ; аллоцирую изначально 2 байта под символ и нуль-терминатор
mov ebx, eax ; адрес строки будет в ebx mov ebx, eax ; адрес строки будет в ebx
push 2 ; емкость push 2 ; емкость
push 0 ; длина строки push 0 ; длина строки
.next_char: .next_char:
; беру со стека длину и емкость
pop eax ; длина pop eax ; длина
pop ecx ; емкость pop ecx ; емкость
; увеличиваю длину на 1 inc eax ; увеличиваю длину на 1
inc eax
cmp eax, ecx ; если длина = емкость cmp eax, ecx ; если длина = емкость
je .realloc_memory ; реаллоцирую память je .realloc_memory ; реаллоцирую память
push ecx ; новая емксоть в стек push ecx ; новая емксоть в стек
push eax ; новая длина в стек push eax ; новая длина в стек
jmp .continue ; иначе продолжаю программу jmp .continue ; иначе продолжаю программу
.realloc_memory: .realloc_memory:
; удваиваю емкость shl ecx, 1 ; удваиваю емкость
shl ecx, 1
push ecx ; новая емксоть в стек push ecx ; новая емксоть в стек
push eax ; новая длина в стек push eax ; новая длина в стек
invoke realloc, ebx, ecx invoke realloc, ebx, ecx
pop ebx pop ebx
pop ecx pop ecx
mov ebx, eax ; в ebx новый адрес данных mov ebx, eax ; в ebx новый адрес данных
.continue: .continue:
invoke getche ; считываю символ с клавиатуры invoke getche ; считываю символ с клавиатуры
cmp al, 13 cmp al, 13
je .end ; Если Enter, завершаем ввод je .exit ; Если Enter, завершаем ввод
mov edx, eax ; символ из eax в edx mov edx, eax ; символ из eax в edx
pop eax ; берем новую длину pop eax ; берем новую длину
mov [ebx + eax - 1], dl ; сохраняю считанный символ в выделенной памяти mov [ebx + eax - 1], dl ; сохраняю считанный символ в выделенной памяти
mov byte [ebx + eax], 0 ; добавляю нуль-терминатор mov byte [ebx + eax], 0 ; добавляю нуль-терминатор
push eax push eax
jmp .next_char ; след итерация jmp .next_char ; след итерация
.exit:
.end: mov eax, ebx ; ответ в eax
; вывод результата mov esp, ebp ; восстанавлиает указатель указатель на вершину стека вызывающей функции
invoke printf, resp, ebx pop ebp ; восстанавливает указатель на начало стека вызывающей функции
; освобождение памяти ret ; возвращение управления
invoke free, ebx
invoke getch
invoke ExitProcess, 0
section '.data' data readable writeable section '.data' data readable writeable