Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
Исходный текст программы консольного приложения Windows выглядит
несколько иначе. Сразу же оговорюсь: мы будем использовать упрощенный
синтаксис для компилятора MASM. Исходный текст программы для компилятора
Microsoft представлен в листинге 2.9.
Листинг 2.9. Консольное приложение Windows
.386
.model flat, stdcall
option casemap : none ; различаем регистр символов
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
; объявления и инициализация переменных
conTitle DB "i
mes DB "]
len mes EQU $•
readBuf DB •?
lenReadBuf DD 1
hStdln DD 0
hStdOut DD 0
chrsRead DD 0
chrsWritten DD О
STD_INP_HNDL DD -10
STD_OUTP_HNDL DD -11
. code
start:
call AllocConsole
test EAX, EAX
j z ex
; инициализация консольного приложения
push offset conTitle
call SetConsoleTitleA
test EAX, EAX
j z ex
call getout_hndl
call getinp_hndl
; вывод сообщения в окно консоли
push EBX
mov EBX, offset mes
mov ECX, len_mes
call write_con
pop EBX
; ожидание ввода и выход из программы
call read_con
ex:
push 0
call ExitProcess
; Процедуры
getout_hndl proc
push STD OUTP HNDL
call GetStdHandle
mov hStdOut, EAX
ret
getout_hndl endp
getinp_hndl proc
push STD_INP_HNDL
call GetStdHandle
mov hStdln, EAX
ret
getinp_hndl endp
wrpiutseh_ con 0p roc
push chrsWritten
push ECX
push EBX
push hStdOut
call WriteConsoleA
ret
write_con endp
read_con proc
push 0
push chrsRead
push lenReadBuf
push offset readBuf
push hStdln
call ReadConsoleA
ret
read_con endp
end start
Как видим, тексты двух программ сильно различаются. Тем не менее оба
приложения используют одни и те же принципы. И приложение MS-DOS,
и Windows-приложение используют механизм системных вызовов.
Программа MS-DOS (см. листинг 2.8) использует стандартный системный
вызов через прерывание 2ih для записи строки на консоль. При вызове используются
параметры:
mov АН, 40h
mov DX, offset message
mov BX, 1
mov CX, lmessage
int 2In
дескриптор вызова (АН=40п-запись
в файл-устройство)
адрес строки для записи
дескриптор стандартного устройства вывода
длина строки данных
В операционных системах Windows системные вызовы реализованы иначе.
Вместо прерывания 2ih используется набор многочисленных функций WIN
API, предоставляемых операционной системой Windows в распоряжение
программиста. Механизм действия этих функций довольно сложный и будет
рассмотрен в главе 4 и в последующих главах. Сейчас же вполне достаточно
знать несколько основных правил при работе с WIN API:
• параметры функций являются 32-разрядными;
• параметры функций передаются через стек;
• параметры записываются в стек в порядке, обратном их следованию в
описании функции;
• если функция возвращает значение, то оно передается в регистре ЕАХ.
Рассмотрим работу консольного приложения (см. листинг 2.9) более подробно.
Для удобства фрагменты программного кода, выполняющие инициализацию,
ввод и вывод, реализованы в виде отдельных подпрограмм.
Вначале приложение запрашивает у операционной системы текстовое окно
(консоль) для вывода информации. Для этого используется функция WIN
API AiiocConsoie. Она не требует никаких параметров при вызове. В случае
успеха возвращается ненулевое значение, и программа продолжает работу.
<< Назад В начало Далее >> |
|