Вопрос № 182387: Уважаемые эксперты, начал изучать исходник из учебника Зубкова и он показался интересным, но к сожалению он работает не так как надо. Пожалуйста найдите ошибку для того чтобы первоначальное сообщение выводилось в нужной кодировке и самое главное н...
Вопрос № 182387:
Уважаемые эксперты, начал изучать исходник из учебника Зубкова и он показался интересным, но к сожалению он работает не так как надо. Пожалуйста найдите ошибку для того чтобы первоначальное сообщение выводилось в нужной кодировке и самое главное не могу понять почему консоль исчезает и нет возможности пролистать содержимое файла.
Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, ANATOLY FIRST! 1) Кодировка. Не секрет, что консольные программы работают в кодировке OEM (т.е. ASCII), а все наши строки заданы в ANSI. Что делать? Можно предложить, как минимум, два простых способа: Первый: элементарно перекодировать исходный код программы в ASCII (Почему бы и нет? Дешево и сердито ) Второй: предварительная перекодировка строк из ANSI в ASCII при помощи функции CharToOem
2) Почему изчезает консоль?
А чего Вы ожидали? Программа все сделала, завершилась, ОС завершила консоль... Так и должно быть... Как побороть? Это сделать не просто, а очень просто! Надо просто перед выходом подождать чего-то с клавиатуры. Можно делать по-разному. Я в программе использовал дополнительный ввод строки. Т.о., выход из программы будет по нажатию на Enter. До нажатия на Enter можно подвигать содержимое консоли при по
мощи полосы прокрутки... Программу слегка подправил под masm. Мне так больше нравится Удачи в освоении ассемблера!
Код:
;---------------------------------------------------------- ;prg07_36.asm
- Win32-консольное приложение для исследования порядка использования файлов, проецируемых в память. ;---------------------------------------------------------- .486 .model flat, STDCALL ;модель памяти flat ;STDCALL - передача параметров в стиле С (справа налево) ;вызываемая процедура чистит за собой стек ;%NOINCL ;запретить вывод текста включаемых файлов ;include WindowConA.inc include c:\masm32
\include\windows.inc include c:\masm32\include\kernel32.inc include c:\masm32\include\user32.inc
;------------------ inFile ----------------------------------------------------- ;открытие объекта ядра "файл" для исходного файла inFile invoke CreateFileA, addr inFile, GENERIC_READ+GENERIC_WRITE, 0, NULL, \ OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ;проверить успех cmp eax, 0ffffffffh jz exit ;неудача mov hinFile, eax
;создание объекта ядра "
;проецируемый файл" для исходного файла inFile invoke CreateFileMappingA, hinFile, NULL, PAGE_READWRITE, 0, 0, NULL ;проверить успех cmp eax, 0 jz exit ;неудача mov hMapinFile, eax
;проецирование файловых данных для исходного файла inFile на адресное пространство процесса invoke MapViewOfFile, hMapinFile, FILE_MAP_WRITE, 0, 0, NULL ;проверить успех открытия файла cmp eax, 0 jz exit ;неудача mov PointInRegion, eax mov ebx, eax ;адрес начала исходного файла
в памяти в ebx
;ждем ввод чего-нибудь, чтобы окно консоли сразу не закрылось ! invoke ReadConsoleA, dIn, addr inFile, 80, addr NumWri, 0
; cmp eax,0 ; jz exit ;если неуспех - можно не делать,
так как все равно закрывать объекты ядра
;------------------------------------------------------------------------ ;разрываем связь файла на диске и его отображения invoke FlushViewOfFile, PointInRegion, NULL
;закрываем объекты ядра "проекция файла" и "файл" invoke CloseHandle, hinFile invoke CloseHandle, hMapinFile ;выход из приложения exit: ;VOID ExitProcess(UINT uExitCode) invoke ExitProcess, 0 start endp<
br>end start
----- Люби своего ближнего, как самого себя
Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 06.03.2011, 03:53
Номер ответа: 266113 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Оценка ответа: 5 Комментарий к оценке: Спасибо;)
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 266113
на номер 1151 (Россия) |
Еще номера »
Ответ поддержали (отметили как правильный):
1 чел.
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.