getinput: вызов функции через invoke, добавил секцию с указателями на функции

master
serr 2025-02-16 15:02:56 +03:00
parent 23a93da088
commit fd1b036929
1 changed files with 60 additions and 56 deletions

View File

@ -3,12 +3,23 @@ format PE console
entry start entry start
include '%FASMINC%\WIN32A.INC' include '%FASMINC%\WIN32A.INC'
section '.data' data readable writeable
usage db \
'This is a test echo program written in FASM,', \
' outputting to you the string you entered.', 10, \
'Works with strings of any length!', 10, 10, 0
req db 'TEXT: ', 0
resp db 10, 'ECHO: %s', 10, 'Press any button to exit: ', 0
section '.funcs' data readable writeable
; считывание пользовательской строки любого размера из stdin
get_string_stdin dd _get_string_stdin
section '.code' code readable executable section '.code' code readable executable
start: start:
invoke printf, usage invoke printf, usage
invoke printf, req invoke printf, req
call get_string_stdin invoke get_string_stdin
invoke printf, resp, eax invoke printf, resp, eax
pop ebx pop ebx
pop eax pop eax
@ -17,7 +28,8 @@ start:
invoke ExitProcess, 0 invoke ExitProcess, 0
; Функция, считывающая строку любой длины из консоли ; Функция, считывающая строку любой длины из консоли
get_string_stdin: proc _get_string_stdin
.start:
push ebp ; указатель на начало стека в ebp push ebp ; указатель на начало стека в ebp
mov ebp, esp ; новый epb - esp mov ebp, esp ; новый epb - esp
invoke malloc, 2 ; аллоцирую изначально 2 байта под символ и нуль-терминатор invoke malloc, 2 ; аллоцирую изначально 2 байта под символ и нуль-терминатор
@ -45,27 +57,19 @@ get_string_stdin:
.continue: .continue:
invoke getche ; считываю символ с клавиатуры invoke getche ; считываю символ с клавиатуры
cmp al, 13 cmp al, 13
je .exit ; Если Enter, завершаем ввод je .end ; Если 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 eax, ebx ; ответ в eax
mov esp, ebp ; восстанавлиает указатель указатель на вершину стека вызывающей функции mov esp, ebp ; восстанавлиает указатель указатель на вершину стека вызывающей функции
pop ebp ; восстанавливает указатель на начало стека вызывающей функции pop ebp ; восстанавливает указатель на начало стека вызывающей функции
ret ; возвращение управления ret ; возвращение управления
endp
section '.data' data readable writeable
usage db \
'This is a test echo program written in FASM,', \
' outputting to you the string you entered.', 10, \
'Works with strings of any length!', 10, 10, 0
req db 'TEXT: ', 0
resp db 10, 'ECHO: %s', 10, 'Press any button to exit: ', 0
section '.idata' import data readable section '.idata' import data readable
library \ library \