getinput: вызов функции через invoke, добавил секцию с указателями на функции
parent
23a93da088
commit
fd1b036929
|
@ -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 \
|
||||||
|
|
Loading…
Reference in New Issue