Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Методические рекомендации по выполнению лабораторной работы. Для создания консоли используем функцию AllocConsole




Для создания консоли используем функцию AllocConsole. По завершении программы консоль освобождается автоматически или с помощью функций FreeConsole.

Следует отметить, что один процесс может иметь только одну консоль, поэтому выполнение в начале программы FreeConsole обязательно.

Для чтения из буфера консоли используется функция ReadConsole.

Установить позицию курсора в консоли можно при помощи функции SetConsoleCursorPosition.

Установить цвет выводимых букв можно с помощью функции SetConsoleTextAttribute.

Для определения заголовка окна консоли используется функция SetConsoleTitle.

Функция CharToOem используется для перевода DOS-кодировки в Windows-кодировку.

Большинство консольных функций при правильном их завершении возвращает ненулевое значение. В случае ошибки в EAX помещается ноль.

Пример создания собственной консоли

; cons1.asm

.386P

.MODEL FLAT, stdcall

; константы

STD_OUTPUT_HANDLE equ -11

STD_INPUT_HANDLE equ -10

; атрибуты цветов

FOREGROUND_BLUE equ 1h ; синий цвет букв

FOREGROUND_GREEN equ 2h ; зеленый цвет букв

FOREGROUND_RED equ 4h ; красный цвет букв

FOREGROUND_INTENSITY equ 8h ; повышенная интенсивность

BACKGROUND_BLUE equ 10h ; синий цвет фона

BACKGROUND_GREEN equ 20h ; зеленый цвет фона

BACKGROUND_RED equ 40h ; красный цвет фона

BACKGROUND_INTENSITY equ 80h ; повышенная интенсивность

COL1 = 2h + 8h ; цвет выводимого текста

COL2 = 1h + 2h + 8h ; цвет выводимого текста 2

; прототипы внешних процедур

EXTERN GetStdHandle: NEAR

EXTERN WriteConsoleA: NEAR

EXTERN SetConsoleCursorPosition: NEAR

EXTERN SetConsoleTitleA: NEAR

EXTERN FreeConsole: NEAR

EXTERN AllocConsole: NEAR

EXTERN CharToOemA: NEAR

EXTERN SetConsoleCursorPosition: NEAR

EXTERN SetConsoleTextAttribute: NEAR

EXTERN ReadConsoleA: NEAR

EXTERN SetConsoleScreenBufferSize: NEAR

EXTERN ExitProcess: NEAR

; директивы компоновщику для подключения библиотек

includelib c:\win32\work\import32.lib

;----------------------------------------------------------------------------

COOR STRUC

X WORD ?

Y WORD ?

COOR ENDS

; сегмент данных

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'

HANDL DWORD ?

HANDL1 DWORD ?

STR1 DB 'Введите строку: ', 13, 10, 0

STR2 DB 'Простой пример работы консоли', 0

BUF DB 200 dup (?)

LENS DD ? ; количество выведенных символов

CRD COOR <?>

_DATA ENDS

 

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

START:

; перекодируем строку

PUSH OFFSET STR1

PUSH OFFSET STR1

CALL CharToOemA

; образовать консоль

; вначале освободить уже существующую

CALL FreeConsole

CALL AllocConsole

; получить HANDL1 ввода

PUSH STD_INPUT_HANDLE

CALL GetStdHandle

MOV HANDL1, EAX

; получить HANDL вывода

PUSH STD_OUTPUT_HANDLE

CALL GetStdHandle

MOV HANDL, EAX

; установить новый размер окна консоли

MOV CRD.X, 100

MOV CRD.Y, 25

PUSH CRD

PUSH EAX

CALL SetConsoleScreenBufferSize

; задать заголовок консоли

PUSH OFFSET STR2

CALL SetConsoleTitleA

; установить позицию курсора

MOV CRD.X, 0

MOV CRD.Y, 10

PUSH CRD

PUSH HANDL

CALL SetConsoleCursorPosition

; задать цветовык атрибуты выводимого текста

PUSH COL1

PUSH HANDL

CALL SetConsoleTextAttribute

; вывести строку

PUSH OFFSET STR1

CALL LENSTR ; в EBX длина строки

PUSH 0

PUSH OFFSET LENS

PUSH EBX

PUSH OFFSET STR1

PUSH HANDL

CALL WriteConsoleA

; ждать ввод строки

PUSH 0

PUSH OFFSET LENS

PUSH 200

PUSH OFFSET BUF

PUSH HANDL1

CALL ReadConsoleA

; вывести полученную строку

; вначале задать цветовые атрибуты выводитого текста

PUSH COL2

PUSH HANDL

CALL SetConsoleTextAttribute

;---------------------------------------------------

PUSH 0

PUSH OFFSET LENS

PUSH [LENS]

PUSH OFFSET BUF

PUSH HANDL

CALL WriteConsoleA

; небольшая задержка

MOV ECX, 01FFFFFFFh

L1:

LOOP L1

; закрыть консоль

CALL FreeConsole

CALL ExitProcess

; строка - [EBP+08h]

; длина в EBX

LENSTR PROC

; PUSH EBX

; MOV EBP, ESP

ENTER 0, 0

PUSH EAX

;------------------------------------

CLD

MOV EDI, DWORD PTR [EBP+08h]

MOV EBX, EDI

MOV ECX, 100 ; ограничить длину строки

XOR AL, AL

REPNE SCASB ; найти символ 0

SUB EDI, EBX ; длина строки, включая 0

MOV EBX, EDI

DEC EBX

; POP EAX

; POP EBP

LEAVE

RET 4

LENSTR ENDP

_TEXT ENDS

END START

Для работы с команданой строкой применяется АРІ функция GetCommandLineA, которая возвращает указатель на командную строку. Эта функция одинакова работает как для консольных приложений, так и для приложений GUI (Graphic Universal Interface).

Пример 2. Программа вывода параметров командной строки

; cons_2.asm

.386P

.MODEL FLAT, stdcall

; константы

STD_OUTPUT_HANDLE equ -11

; прототипы внешних процедур

EXTERN GetStdHandle: NEAR

EXTERN WriteConsoleA: NEAR

EXTERN ExitProcess: NEAR

EXTERN GetCommandLineA: NEAR

; директивы компоновщику для подключения библиотек

includelib c:\win32\work\import32.lib

; сегмент данных

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'

HANDL DWORD ?

NUM DWORD ?

BUF DB 100 dup (0)

LENS DWORD ? ; количества выведенных символов

CNT DWORD ?

_DATA ENDS

; сегмент кода

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

START:

; получить HANDLE вывода

PUSH STD_OUTPUT_HANDLE

CALL GetStdHandle

MOV HANDL, EAX

; получить количество параметров

CALL NUMPAR

MOV NUM, EAX

MOV CNT, 0

;----------------------------------------------

; вывести параметры командной строки

LL1:

MOV EDI, CNT

CMP NUM, EDI

JE LL2

; номер параметра

INC EDI

MOV CNT, EDI

; получить параметр номером EDI

LEA EBX, BUF

CALL GETPAR

; получить длину параметра

PUSH OFFSET BUF

CALL LENSTR

; в конце - перевод строки

MOV BYTE PTR [BUF+EBX], 13

MOV BYTE PTR [BUF+EBX+1], 10

MOV BYTE PTR [BUF+EBX+2], 0

ADD EBX, 2

; вывод строки

PUSH 0

PUSH OFFSET LENS

PUSH EBX

PUSH OFFSET BUF

PUSH HANDL

CALL WriteConsoleA

JMP LL1

LL2:

PUSH 0

CALL ExitProcess

; строка - [EBP+08H]

; длина в EBX

LENSTR PROC

PUSH EBX

MOV EBP, ESP

PUSH EAX

;-------------------------------------------

CLD

MOV EDI, DWORD PTR [EBP+08H]

MOV EBX, EDI

MOV ECX, 100 ; ограничить длину строки

XOR AL, AL

REPNE SCASB ; найти символ 0

SUB EDI, EBX ; длина строки, включая 0

MOV EBX, EDI

DEC EBX

;-------------------------------------------

POP EAX

POP EBP

RET 4

LENSTR ENDP

; определить количество параметров (->EAX)

NUMPAR PROC

LOCALS

CALL GetCommandLineA

MOV ESI, EAX ; указатель на строку

XOR ECX, ECX ; счетчик

MOV EDX, 1 ; признак

@@L1:

CMP BYTE PTR [ESI], 0

JE @@L4

CMP BYTE PTR [ESI], 32

JE @@L3

ADD ECX, EDX ; номер параметра

MOV EDX, 0

JMP @@L2

@@L3:

OR EDX, 1

@@L2:

INC ESI

JMP @@L1

@@L4:

MOV EAX, ECX

RET

NUMPAR ENDP

; получить параметр

; EBX - указывает на буфер, куда будет помещен параметр

; в буфер помещается строка с нулем на конце

; EDI - номер параметра

GETPAR PROC

LOCALS

CALL GetCommandLineA

MOV ESI, EAX ; указатель на строку

XOR ECX, ECX ; счетчик

MOV EDI, 1 ; признак

@@L1:

CMP BYTE PTR [ESI], 0

JE @@L4

CMP BYTE PTR [ESI], 32

JE @@L3

ADD ECX, EDX ; номер параметра

MOV EDX, 0

JMP @@L2

@@L3:

OR EDX, 1

@@L2:

CMP ECX, EDI

JNE @@L5

MOV AL, BYTE PTR [ESI]

MOV BYTE PTR [EBX], AL

INC EBX

@@L5:

INC ESI

JMP @@L1

@@L4:

MOV BYTE PTR [EBX], 0

RET

GETPAR ENDP

_TEXT ENDS

END START

Для компиляции программы используются следующие командные строки:

TASM32 /ml prog.asm

TLINK32 /ap pgog.obj

Основная литература– 5[120-143]

Контрольные вопросы.

1. Какие аргументы использует АРІ функция GetStdHandle?

2. Дайте названия цветов букв и символов используемых функцией SetConsoleTextAttribute?

3. Назовите параметры функции CharToOem?

4. Какие типы событий зарезервированы операционной системой?

 


Поделиться:

Дата добавления: 2015-09-15; просмотров: 57; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.005 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты