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


 
 
 

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