Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
Если запрос на открытие консоли завершился неудачей, функция возвращает
нулевое значение, и программа завершается.
call AiiocConsoie
test EAX, EAX
jz ex ; завершить работу
О
ExitProcess
ex:
push
call
В этом фрагменте программного кода мы столкнулись еще с одной функцией
WIN API — ExitProcess. Этой функцией приложение, к а к правило, завершает
работу. В качестве входного параметра задаем нулевое значение.
Функция ExitProcess я в л я е т с я а н а л о г о м системного вызова MS-DOS, завершающего
работу DOS-приложения:
mov АХ, 4C00h
int 2lh
Предположим, мы успешно запросили у Windows консоль. Назовем окно
КОНСОЛИ, например, "Assembler console application", вызвав ДЛЯ ЭТОГО
ф у н к ц и ю WIN API setConsoieTitieA. В качестве параметра эта ф у н к ц и я
принимает смещение с т р о к и с заголовком.
push offset conTitle
call SetConsoieTitieA
test EAX, EAX
jz ex
Как и при в ы з о в е функции AiiocConsole, в регистре ЕАХ возвращается флаг
у с п е ш н о г о или неудачного выполнения функции SetConsoieTitieA. Если и
ЭТОТ ВЫЗОВ закОНЧИЛСЯ у с п е ш н о , ТО МОЖНО ВЫВОДИТЬ СТрОКу "Привет, мир!"
в о к н о приложения.
Вывод о с у щ е с т в л я е т с я функцией writeConsoleA, к о т о р а я записывает с т р о к у
с и м в о л о в на экран с текущей позиции курсора. Функция о б ъ я в л я е т с я следующим
образом:
BOOL WriteConsoleA(HANDLE hConsoleOutput,
CONST VOID *lpBuffer,
DWORD nNumberOfCharsToWrite,
LPDWORD lpNumberOfCharsWritten,
LPVOID lpReserved)
Параметры фуНКЦИИ WriteConsoleA:
• HANDLE hConsoleOutput — дескриптор (идентификатор) выходных данных
консоли;
• CONST VOID *ipBuffer — указатель на буфер выводимой с т р о к и ;
• DWORD nNumberOfCharsToWrite — КОЛИЧесТВО ВЫВОДИМЫХ СИМВОЛОВ;
• LPDWORD lpNumberOfCharsWritten — указатель на фактическое количество
выведенных символов;
• LPVOID lpReserved — зарезервировано (должно быть равно 0).
Функция возвращает ненулевое значение в случае успешного завершения.
Читателя могут смутить идентификаторы в описании параметров функции
— HANDLE, LPDWORD, LPVOID. Несмотря на столь загадочную аббревиатуру,
используемую Microsoft, эти параметры имеют простой смысл, HANDLE
представляет собой переменную целого типа размером в двойное слово
DWORD, а параметры с префиксом LP (LPDWORD, LPVOID) — указатели на переменную,
также размером в двойное слово.
При вызове функций WIN API параметры передаются через стек справа налево,
причем первым попадает в стек самый правый параметр.
push offset charBuf
push hStdOut
call WriteConsoleA
Для удобства использования этой функции в последующих примерах можно
поместить ее исходный код в подпрограмму writecon.
write_con proc
push 0
push chrsWritten
push ECX
push EBX
push hStdOut
call WriteConsoleA
ret
write_con endp
Параметры для вызова этой функции будем передавать в регистрах ЕСХ И ЕВХ.
Содержимое регистра ЕВХ желательно сохранить в стеке. Пример вызова функции
writecon из нашего приложения будет выглядеть следующим образом:
push ЕВХ
mov ЕВХ, offset charBuf
push
push
push
chrsWritten
len charBuf
0
mov ECX, len_charBuf
call write_con
pop EBX
Другой полезной функцией WIN API является ReadConsoleA, вызываемая из
процедуры readcon.
read_con proc
push 0
push chrsRead
push lenReadBuf
push offset readBuf
push hStdln
call ReadConsoleA
ret
read_con endp
Функция ReadConsoleA считывает символ из буфера ввода консоли и очищает
буфер. В случае успеха функция возвращает ненулевое значение.
Мы используем ввод с консоли в программе для задержки закрытия окна
приложения после выводастроки на экран.
Функция объявляется следующим образом:
BOOL ReadConsoleA(HANDLE hConsolelnput,
LPVOID lpBuffer,
DWORD nNumberOfCharsToRead,
LPDWORD lpNumberOfCharsRead,
LPVOID lpReserved);
В функцию передаются следующие параметры:
• HANDLE hConsolelnput — дескриптор буфера входных данных;
П LPVOID lpBuffer — буфер данньгх;
П DWORD nNumberOfCharsToRead — количество СИМВОЛОВ ДЛЯ Чтения;
П LPDWORDlpNumberOfCharsRead — количество СИМВОЛОВ, фактически про-
читанных;
П LPVoiDipReserved — зарезервировано (обычно равно 0).
Программа выводит строку "Привет, мир!" в окно консольного приложения и ожидает ввода символа с клавиатуры, после чего ее работа завершается.
Чтобы использовать каркас приложения для демонстрации наших примеров,
будем размещать программный код между секцией инициализации и
функцией чтения консоли. Компиляция собранного таким образом приложения
выполняется с помощью командных строк:
ml/c/coff/Fo hellow.obj hellow.asm
link/SUBSYSTEM:WINDOWS/LIBPATH: :\masm\lib hellow.obj
Второй вариант консольного приложения Windows разработаем с использованием
Мастера приложений Delphi 7. Конечно, читатели легко могут выполнить
все необходимые манипуляции в среде программирования Delphi
для получения каркаса такого приложения, поэтому не будем останавливаться
на этом подробно.
Полученный таким образом шаблон 32-разрядного консольного приложения
представлен в листинге 2.10.
<< Назад В начало Далее >> |
|