Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru