Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2021, 13:31   #1
максхи
Пользователь
 
Регистрация: 20.12.2021
Сообщений: 50
По умолчанию консоль закрывается после третьего вывода

Написал код в masm32.
Я использовал invoke Sleep, ReadConsole и их вместе, но программа всё-равно после вывода закрывает окно.
код
Код:
.386
.model flat, stdcall
option casemap: none
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
inpu db 0
utput db 0
titl db 'wind',0
stdin  dd  ?
stdout dd  ?
str1 db "In:",0
str2 db "Out:",0
nWrite dd ? 
nRead dd ?
num dw 0
znak db ' '

.code
start:
invoke AllocConsole
invoke SetConsoleTitle, offset titl;
invoke GetStdHandle,-11
mov stdout, eax
invoke WriteConsole,stdout,addr str1,sizeof str1,addr nWrite,0 
invoke GetStdHandle, -10
mov stdin, eax
invoke ReadConsole,stdin,ADDR inpu,16,ADDR nRead,NULL 
mov ebx, 10
lea esi, inpu
xor eax,eax
mov ecx, 2
mov dl, [esi]
cmp dl, '-'
jne perevod1
div bl
mov [znak],'-'
inc esi
perevod1:
add al, [esi]
sub ax, '0'
mul bx
inc esi
inc ecx
cmp ecx, [nRead]
jne perevod1
div bx
mov bx,2
lea edi, utput
mov ecx, 0
perevod2:
xor edx,edx
div bx
add dl, '0'
push edx
inc cx
cmp eax, 0
jz enp
jmp perevod2
enp:
mov [num], cx
inc [num]
mov dl, [znak]
mov [edi],dl
bbir:
inc edi
pop edx
mov [edi], dl
dec cx
cmp cx, 0
jne bbir
xor edx,edx
invoke WriteConsole,stdout,addr str2,sizeof str2,addr nWrite,0 
invoke WriteConsole,stdout,addr utput,[num],addr nWrite,0 
invoke Sleep,30000
invoke ReadConsole,stdin,ADDR inpu,16,ADDR nRead,NULL 
end start
Почему не ждёт?
максхи вне форума Ответить с цитированием
Старый 21.12.2021, 07:52   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

У вас нет буферов для ввода и вывода - те однобайтовые переменные, которые объявлены принимают только по одному байту, а остальные символы записываются уже в переменные, объявленные после inpu и utput.
Код:
inpu db 1024 dup(?)
utput db 1024 dup(?)
И попробуйте выполнить программу в отладчике ollydbg - всё будет видно при пошаговом выполнении инструкций.
FPaul вне форума Ответить с цитированием
Старый 22.12.2021, 17:01   #3
максхи
Пользователь
 
Регистрация: 20.12.2021
Сообщений: 50
По умолчанию

FPaul, заменил, но это не помогает. Ответ у меня выводится правильный, но консоль закрывается спустя мгновение. Как влияют utput и inpu на команду Sleep?
максхи вне форума Ответить с цитированием
Старый 22.12.2021, 20:58   #4
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Я не знаю, что вы заменяете.

Пример ввода двух чисел и вывода их суммы.
Код:
.686
.model flat, stdcall
option casemap :none
        .nolist
        include \masm32\include\windows.inc

        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        ;include \masm32\include\msvcrt.inc
        include \masm32\include\masm32.inc
        include \masm32\macros\macros.asm

        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        ;includelib \masm32\lib\msvcrt.lib
        includelib \masm32\lib\masm32.lib

        .list
.const
        szConsoleTitle  db      "My console window title", 0
        szMsgResult     equ     cfm$("\nResult: %d")
        szPromptX       db      0Dh, 0Ah, "Input X: "
        szPromptY       db      "Input Y: "
.data
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        X               dd      ?
        Y               dd      ?
        iResult         dd      ?
        nBufLen         dd      ?
        aBuffer         db      1024 dup(?)
.code

;ввод целого числа
ReadSInt        proc    pPrompt:DWORD, nLengthPrompt:DWORD, pResult:DWORD
        pushad
        invoke  WriteConsole, hConsoleOutput, pPrompt,\
                nLengthPrompt, ADDR nBufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR aBuffer,\
                LENGTHOF aBuffer, ADDR nBufLen, NULL
        lea     esi,    [aBuffer]       ;удаление из буфера
        add     esi,    [nBufLen]       ;символов перевода строки
        mov     [esi-2],word ptr 0
        invoke  atol,   ADDR aBuffer
        mov     esi,    [pResult]
        mov     [esi],  eax
        popad
        ret
ReadSInt        endp

main    proc
        ;создание консоли (при компиляции приложения как GUI)
        invoke         AllocConsole
        invoke  SetConsoleTitle, ADDR szConsoleTitle
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     [hConsoleInput],        eax
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     [hConsoleOutput],       eax
        ;ввод числа X
        invoke  ReadSInt,       ADDR szPromptX, LENGTHOF szPromptX, ADDR X
        ;ввод числа Y
        invoke  ReadSInt,       ADDR szPromptY, LENGTHOF szPromptY, ADDR Y
        ;вычисление выражения по формуле Result=X+Y
        mov     eax,    [X]
        add     eax,    [Y]
        mov     [iResult],      eax
        ;вывод результата
        invoke  wsprintf,       ADDR aBuffer, szMsgResult, [iResult]
        mov     [nBufLen],      eax
        invoke  WriteConsole,   hConsoleOutput, ADDR aBuffer,\
                nBufLen, ADDR nBufLen, NULL
        ;пауза для просмотра результата
        invoke  Sleep,  10000
        ;завершение программы
        invoke  ExitProcess, 0
main    endp

end     main
FPaul вне форума Ответить с цитированием
Старый 27.12.2021, 11:49   #5
максхи
Пользователь
 
Регистрация: 20.12.2021
Сообщений: 50
По умолчанию

Когда я убираю строку writeconsole utpu, sleep работает,но если выводить полученное число, после его вывода в одной из операций ecx заносится в адрес, записанный в edx, и который не существует.
максхи вне форума Ответить с цитированием
Старый 27.12.2021, 15:48   #6
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Я не знаю, что вы исправляли за прошедшую неделю.

Могу повторить ещё раз замечания к коду из первого сообщения.

Могу повторить и добавить к ним.
У вас нет буферов для ввода и вывода - те однобайтовые переменные, которые объявлены принимают только по одному байту, а остальные символы записываются уже в переменные, объявленные после inpu и utput.
Код:
inpu db 1024 dup(?)
utput db 1024 dup(?)
И попробуйте выполнить программу в отладчике ollydbg - всё будет видно при пошаговом выполнении инструкций.

Также, все параметры, передаваемые в WriteConsole должны иметь размер 4 байта - это адреса, это значения и всё остальное.
Т.е. [num] типа dw - это явно неправильно.
FPaul вне форума Ответить с цитированием
Старый 30.12.2021, 16:57   #7
максхи
Пользователь
 
Регистрация: 20.12.2021
Сообщений: 50
По умолчанию

Fpaul, спасибо, изменение размера num помогло.
максхи вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрывается консольное приложение после выполнения. hemn6vyr Общие вопросы Delphi 5 08.03.2013 19:51
C++. Программа закрывается после клавиатурного ввода переменных Ruko! Помощь студентам 3 27.09.2012 06:41
Самопроизвольно закрывается форма после выполнения процедуры nitroG Помощь студентам 5 04.05.2010 08:20
delphi7 программа после компиляции сразу закрывается fredd Помощь студентам 1 30.10.2008 14:25
консоль закрывается сразу после выполнения последнего действия F4RR3LL Общие вопросы C/C++ 2 14.09.2008 20:43