getinput: выделил основной функционал в отельную функцию
parent
05a3038675
commit
cf403b7d18
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue