Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2645
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2327
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1347
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1424
Дата выхода:10.03.2011, 01:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:217 / 66
Вопросов / ответов:1 / 1

Вопрос № 182387: Уважаемые эксперты, начал изучать исходник из учебника Зубкова и он показался интересным, но к сожалению он работает не так как надо. Пожалуйста найдите ошибку для того чтобы первоначальное сообщение выводилось в нужной кодировке и самое главное н...



Вопрос № 182387:

Уважаемые эксперты, начал изучать исходник из учебника Зубкова и он показался интересным, но к сожалению он работает не так как надо.
Пожалуйста найдите ошибку для того чтобы первоначальное сообщение выводилось в нужной кодировке и самое главное не могу понять почему консоль исчезает и нет возможности пролистать содержимое файла.

Отправлен: 05.03.2011, 00:17
Вопрос задал: ANATOLY FIRST (4-й класс)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, 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

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

;Объявление внешними используемых в данной программе функций Win32 (ASCII):
;extrn AllocConsole:PROC
;extrn SetConsoleTitleA:PROC
;extrn ExitProcess:PROC
;extrn GetStdHandle:PROC
;extrn CreateFileA:PROC
;extrn CreateFileMappingA:PROC
;extrn MapViewOfFile:PROC
;extrn UnmapViewOfFile:PROC
;extrn CloseHandle:PROC
;extrn FlushFileBuffers:PROC
;extrn FlushViewOfFile:PROC
;extrn WriteFile:PROC
;extrn SetConsoleCursorPosition:PROC
;extrn ReadConsoleA:PROC
;extrn WriteConsoleA:PROC
;extrn GetFileSize:PROC
;макроопределения типов
SSHORT equ <dw 0>
;структура для установки положения курсора в консоли:
Coord struc
xx SSHORT
yy SSHORT
Coord ends
.data
TitleText db 'Пример использования отображенных в память файлов 9;,0
NumWri dd 0
inFile db 80 dup (20)
con Coord <>
xxx dw 0
yyy dw 0
FileSize dd 0 ;размер файла
hinFile dd 0
hMapinFile dd 0
mes1 db 'Введите путь к исходному файлу:',0
len_mes1=$-mes1-1 ;-1, чтобы убрать 0
dOut dd 0
dIn dd 0
PointInRegion dd 0
.code
start proc near
;точка входа в программу:
;запрос консоли
invoke AllocConsole
;проверить успех запроса консоли
test ax, ax
jz exit ;неудача

;текст окна заголовка
;сначала преобразуем из ANSI в ASCII
invoke CharToOem, addr TitleText, addr TitleText
;зададим заголовок окна
invoke SetConsoleTitleA, addr TitleText

;вывод строки текста
;вначале получим дескрипторы ввода и вывода консоли
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov dOut, eax ;dOut-дескриптор ввода вывода консоли
invoke GetStdHandle, STD_INPUT_HANDLE
mov dIn, eax ;dIn-дескриптор ввода вывода консоли

;установим курсор в позицию (2, 5)
mov con.xx, 2
mov con.yy, 5
invoke SetConsoleCursorPosition, dOut, dword ptr con
cmp eax, 0
jz exit ;если неуспех

;вывести приглашение на ввод имени исходного файла
;сначала преобразуем из ANSI в ASCII
invoke CharToOem, addr mes1, addr mes1
;выводим
invoke WriteConsoleA, dOut, addr mes1, len_mes1, addr NumWri, 0

;установим курсор в позицию (2, 6)
mov con.xx, 2
mov con.yy, 6
invoke SetConsoleCursorPosition, dOut, dword ptr con
cmp eax, 0
jz exit ;если неуспех

;читаем имя входного файла
invoke ReadConsoleA, dIn, addr inFile, 80, addr NumWri, 0

;сформировали ASCIIZ-строку
lea eax, inFile
add eax, NumWri
mov byte ptr [eax-2], 0

;------------------ 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

;------------------ inFile -----------------------------------------------------
;определим размер файла
;DWORD GetFileSize(HANDLE hFile,LPDWORD lpFileSizeHigh);
invoke GetFileSize, hinFile, 0
cmp eax,0
jz exit ;если неуспех
mov FileSize,eax ;сохраним размер файла

;------------------------------------------------------------------------------
;вывод на экран
;установим курсор в начальную позиция (0,0))
cycl:
mov ax,xxx
mov con.xx,ax
mov ax,yyy
mov con.yy,ax
invoke SetConsoleCursorPosition, dOut, dword ptr con
cmp eax,0
jz exit ;если неуспех

;------------------- WriteConsoleA----------------------------------------
invoke WriteConsoleA, dOut, PointInRegion, FileSize, addr NumWri, 0

;ждем ввод чего-нибудь, чтобы окно консоли сразу не закрылось !
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 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Ответ поддержали (отметили как правильный): 1 чел.



    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное