Файл: 13. Многомодульные ассемблерные программы.pdf

ВУЗ: Не указан

Категория: Учебное пособие

Дисциплина: Программирование

Добавлен: 30.10.2018

Просмотров: 546

Скачиваний: 6

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Title    DB     „Текст в заголовке‟, 0  ; строка заканчивается нулевым байтом 

. CODE          ; начало кодового фрагмента 

Main    PROC    NEAR          ; точка входа в программу 

  CALL    AlloсConsole 

  LEA   EAX, Title   ; адрес строки – в EAX 

  PUSH    EAX         ;  а потом – в стек 

  CALL    SetConsoleTitleA 

  PUSH     0       ;  в стек – нулевой код завершения 

  CALL    ExitProcess 

Main    ENDP 

  END     Main 

Больше  возможностей  по  работе  с  консолью  дают  функции 

ReadConsole и WriteConsole. Первая обеспечивает простейший ввод текста с 

клавиатуры  без  анализа  управляющих  клавиш  с  занесением  результата  во 

внутренний буфер программы. Вторая функция выводит текст на экран. 

Для  использования  этих  функций  надо  сначала  получить  2 

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

вывода.  Оба  дескриптора  получаются  с  помощью  функции  GetStdHandle  с 

параметром-константой  (-10)  (для  ввода)  и  (-11)  (для  вывода).  Для 

сохранения дескрипторов надо зарезервировать память (два двойных слова). 

Параметры функции ReadConsole: 

 

дескриптор ввода  

 

адрес буфера для сохранения вводимой строки 

 

размер буфера в байтах 

 

адрес  области  памяти  для  сохранения  количества  реально  введенных 

символов  

 

резервный параметр со значением 0 

Параметры функции WriteConsole: 

 

дескриптор вывода  

 

адрес буфера для хранения выводимой строки 


background image

 

размер буфера в байтах 

 

адрес  области  памяти  для  сохранения  количества  реально  выводимых 

символов  

 

резервный параметр со значением 0 

 

Структура программы: 

1. Объявление всех используемых функций как внешних 

2. Объявление используемых данных 

Bufer         DB   50   DUP (?)       ; буфер на 50 байтов 

HandIn      DD    ?          ; здесь будет дескриптор входного потока 

HandOut    DD   ?          ; а здесь – выходного 

Len            DD   ?          ; здесь будет реальная длина введенной строки 

3. Команды 

PUSH   -10    

CALL    GetStdHandle 

MOV     HandIn,  EAX     ; сохраним дескриптор входного потока 

PUSH    -11 

CALL    GetStdHandle 

MOV     HandOut, EAX     ; сохраним дескриптор выходного потока 

PUSH    0 ;занесение в стек входных параметров функции ReadConsole 

PUSH    OFFSET    Len      ; адрес области Len в стек 

PUSH    50                      

PUSH    OFFSET    Bufer   ; адрес области Bufer в стек 

PUSH    HandIn 

CALL    ReadConsole 

CMP      EAX , 0            ; проверить код завершения 

JZ           Exit                  ;  переходим на обработку неудачного ввода 

PUSH     0 

PUSH    OFFSET    Len 

PUSH    Len 


background image

PUSH    OFFSET    Bufer 

PUSH    HandOut 

CALL    WriteConsole 

 

Кроме  трех  перечисленных,  для  консольного  ввода/вывода  можно 

использовать еще около 50 функций, например: 

  SetConsoleCursorPosition:  установка  позиции  курсора  для  ввода  или 

вывода 

  SetConsoleTextAttribute:    установка  цветовых  атрибутов  текста  и  его 

фона 

  ReadConsoleInput:  низкоуровневый  ввод  с  консоли  с  возможностью 

обработки управляющих клавиш и событий от мыши 

  WriteConsoleOutput:  низкоуровневый  вывод  в  экранный  буфер  с 

возможностью использования нескольких буферов (окон) 

 

Практические задания к теме №13. 

Задание 1. Оформить выполненные ранее программы с подпрограммами в 

виде двухмодульных, вынеся во вспомогательный модуль текст 

подпрограммы. 

Задание2. Выполнить простейшие консольные Windows-программы с 

помощью утилит tasm32, tlink32 и td32.