
- •Принципы организации ввода/вывода текстовых и числовых данных
- •2. Основные теоретические положения
- •2.1. Построение com файлов
- •2.2. Организация ввода-вывода
- •Функция овн. Проверка входного статуса клавиатуры
- •2.3. Ввод числовых данных
- •2.4. Процедуры
- •3. Задание на лабораторную работу и требования к отчету
Лабораторная работа № 1
Принципы организации ввода/вывода текстовых и числовых данных
1. Цель работы: освоение принципов построения простейших консольных приложений на языке ассемблера для системы MS-DOS, ознакомление с командами и способами адресации языка ассемблера и правилами построения программ в соответствии со структурным способом программирования.
2. Основные теоретические положения
2.1. Построение com файлов
СОМ файл является самым простым видом исполняемого файла в системе MS-DOS и представляет собой точную копию программы в двоичном виде, в каком ее нужно загрузить в память. СОМ файлы не содержат дополнительного префикса. Они не содержат адресных констант, зависимых от адреса загрузки программы в память. Все в программе представлено как смещение с начала сегмента для кода, включая данные и стек. Следовательно, размер программы не может превышать 64 Кбайтов. Поэтому загрузка СОМ файлов сводится к определению достаточно большого свободного блока памяти, построению PSP (Program Segment Prefix) и считыванию всего файла в область после PSP.
В области PSP хранится специальная системная информация и информация для программы. Область PSP всегда занимает 256 байт. Содержимое и назначение этой области в данной лабораторной не рассматриваются.
Регистрам CS, DS, SS и ES присваивается значение сегмента программы (сегментный адрес PSP). Указатель инструкций IP получает значение 100Н. SP получает значение FFFEH, т.е. конец адресного пространства из 64 Кбайтов используется для стека. Байт по адресу FFFEH в стеке содержит 00Н, так что после команды RET в конце программы в IP получается значение 00Н, т.е. выполняется инструкция INT 20H, записанная в начале PSP.
Можно привести следующие практические правила создания COM файлов:
Программа должна начинаться директивой ORG 100Н и входная точка должна быть в начале программы:
ORG 100
START:
<Тело программы>
END START
Так программа соответствует значению CS:IP после ее загрузки - CS содержит сегментный адрес PSP, a IP установлен в значение 100Н. Если нужно начать выполнение с другого места, первой инструкцией после ORG 100 должна быть JMP.
Не допускается определять отдельные сегменты для данных и для стека. Определяется только сегмент для кода. Используется директива ASSUME, чтобы сопоставить все сегментные регистры сегменту для кода, например ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG.
Данные можно располагать в произвольном месте программы, лишь бы не путать их с кодом. Рекомендуется однако расположить их в начале программы, чтобы не получить при ассемблировании ошибки при обращении к данным, которые еще не определены (forward reference). В таком случае программа должна начинаться инструкцией JMP, чтобы передать управление после данных.
Не допускаются инструкции, которые имеют в качестве операндов сегментные адреса, например MOV AX.SEG DATA FIELD1. В частности, в начале программы отсутствует типичная для EXE файлов последовательность MOV AX.DSEG / MOV DS.AX (не определяется отдельный сегмент для данных).
При загрузке программы SS, как и остальные сегментные регистры, имеет значение сегментного адреса PSP. SP указывает последний адрес 64-Кбайтового адресного пространства (стек заполняется от старших к младшим адресам). Если нужна программа меньшего размера, можно изменить SP еще до использования стека.
На рис. 1 представлен пример описания простейшего COM файла.
TITLE TestCom
CODESG SEGMENT PARA 'Code'
; Указание настройки сегментных регистров
assume CS:COOESG,DS:CODESG,SS:CODESG.ES:CODESG
ORG 100H ;Начало в конце PSР
BEGIN:
JMP MAIN ;0бход через данные
; Определение данных
VAR_A DW 259
VAR_B DW 3
VAR_C DW ?
MAIN PROC NEAR
;Основное тело программы
MOV AX , VAR_A
ADD AX , VAR_B
MOV VAR_C , AX
;Вернуться в DOS
RET
; Конец процедуры
MAIN ENDP
; Конец сегмента
CODESG ENDS
; Конец программы
END BEGIN
Рис. 1. Пример простейшей COM программы