Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler (Уч_пос_Лаб_Ч1).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.43 Mб
Скачать

А) Листинг prog_exe.Lst

Turbo Assembler Version 4.1

1

2 IDEAL

3 0000 MODEL small

4 0000 stack 32

5 0020 10*(3F) db 16 dup('?') ;Введено с целью просмотра сегмента

; стека программой – оболочкой

6 0030 DATASEG

7 0000 8F E0 AE A3 E0 A0 AC+ mes db 'Программа типа .exe',10,13,'$'

8 AC A0 20 E2 A8 AF A0+

9 20 2E 65 78 65 0A 0D+

10 24

11 0016 CODESEG

12 0000 B8 0000s Start: mov ax,@data ;Установка в ds адреса

13 0003 8E D8 mov ds,ax ;сегмента данных

14 0005 B4 09 mov ah,09h ;Вывод сообщения mes на экран

15 0007 BA 0000r mov dx,offset mes

16 000A CD 21 int 21h

17 000C B8 4C00 Exit: mov ax,04C00h

18 000F CD 21 int 21h ;Вызов DOS. Останов программы

19 END Start ;Конец программы/точка входа

Groups & Segments Bit Size Align Combine Class

Dgroup Group

Stack 16 0030 Para Stack Stack

_Data 16 0016 Word Public Data

_Text 16 011 Word Public Code

Б) Машинный код исполняемого файла prog_exe.Exe на диске объёмом 624 байта

Заголовок программы (512 байт)

00000: 4D 5A 70 00 02 00 01 00 20 00 00 00 FF FF 04 00 MZp ☻ ☺ ♦

00010: 30 00 00 00 00 00 00 00 3E 00 00 00 01 00 FB 71 0 > ☺ √q

00020: 6A 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 jr

00030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 ☺

00040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

...................................

001F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Загрузочный модуль: Сегмент кода (32 байта)

00200: B8 02 00 8E D8 B4 09 BA 00 00 CD 21 B8 00 4C CD ╕☻ o╪┤o║ ═!╕ L=

00210: 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 !

Сегмент данных (32 байта)

00220: 8F E0 AE A3 E0 A0 AC AC A0 20 E2 A8 AF A0 20 2E Программа типа .

00230: 65 78 65 0A 0D 24 00 00 00 00 00 00 00 00 00 00 exe◙♪$

Сегмент стека (48 байт)

00240: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00250: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00260: 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F ????????????????

Рис. П.1.3_2. Листинг и машинный код программы типа .exe

Таблица П.1.3_2

Формат заголовка исполняемого .Exe – файла на диске

Смещение

Число байтов

Описание

00h

2

Сигнатура "MZ" (Mark Zbikowski) или код 4D5A

02h

2

Остаток от деления размера загрузочного модуля на 512. (для нашего примера 624 -512=112=70h)

04h

2

Размер файла в блоках по 512 байт, округленный в большую сторону

06h

2

Число элементов таблицы настройки адресов

08h

2

Размер заголовка в параграфах

0Ah

2

Минимальное число параграфов, требуемых программе дополнительно к её образу на диске

0Ch

2

Максимальное число параграфов, требуемых программе дополнительно к её образу на диске (по умолчанию FFFFh)

0Eh

2

Смещение в параграфах сегмента стека в загрузочном модуле (SS0)

10h

2

Значение регистра SP0

12h

2

Поразрядная контрольная сумма EXE- файла

14h

2

Значение регистра IP0 при входе в программ

16h

2

Смещение в параграфах сегмента кода в загрузочном модуле (CS0)

18h

2

Расстояние в байтах от начала файла до первого элемента таблицы настройки адресов

1Ah

2

Содержат «0», если программа является резидентной, или отличное от нуля число, если данная часть программы является оверлейной

1Ch

6

Различные сигнатуры, в том числе версия Tlink (смещение 1Fh)

Действия MS DOS при запуске .exe-программы отличаются от действий при запуске программы типа .com, хотя в обоих случаях используется одна и та же функция Exec.

  1. Запускаемой программе отводится вся свободная в данный момент оперативная память, в которой определяется начальный сегментный адрес программы (NS0).

  2. По нулевому смещению в выделенном для программы сегменте памяти Exec создаёт служебную структуру – префикс программного сегмента PSP. Его размер, как и для COM-программ, равен 256 байт.

  3. Вслед за PSP размещается загрузочный модуль программы, а заголовок и таблица настройки в память не копируются. После этого выполняется так называемая настройка адресов.

  4. Суть настройки состоит в следующем: компоновщик (Tlink или какой-либо другой) строит exe-модуль относительно некоторого "базового адреса" (в MS DOS программы могут загружаться в произвольную область памяти). Поэтому при загрузке программы к каждому сегментному адресу прибавляется значение начального сегмента программы (NS0). Элементы, требующие настройки, указываются в таблице настройки. Таким образом, устанавливаемые значения регистров для программы рис. П.1.3_2 примут следующие значения:

  • DS = ES = NS0;

  • CS = NS0 + 10h + CS0=NS0 +10h;

  • SS = NS0 + 10h + SS0=NS0 + 14h;

  • IP = IP0 =00h , SP = SP0 = 30h

Здесь CS0, SS0, IP0 и SP0 берутся загрузчиком Exec из заголовка exe-файла, а значение 10h – резервирует пространство (в параграфах) для PSP.

  1. После загрузки программы начинается процесс её исполнения, для чего Exec передает управление по адресу cs:ip.

7. ЛАБОРАТОРНАЯ РАБОТА № 2

СИСТЕМНЫЕ ФУНКЦИИ DOS ВВОДА-ВЫВОДА ИНФОРМАЦИИ. ОБРАБОТКА СТРОКОВЫХ ПЕРЕМЕННЫХ

7.1. Целевые установки

  • Освоение стандартных способов ввода-вывода DOS.

  • Разработка программ по обработке символьной информации с использованием строковых команд.

7.2. Методические рекомендации

7.2.1. Вызовы функций MS-DOS для ввода-вывода символьной информации

Для того чтобы написать простую, но законченную программу, необходимо знать три вещи – как вводить данные, как выводить результат и как остановить выполнение программы. В языках высокого уровня имеются специальные операторы ввода/вывода, которые позволяют в удобной форме реализовать эти функции. В системе команд процессора ix86 также имеются команды ввода/вывода, но они реализуют эти операции на самом низком, физическом уровне, т.е. обеспечивают обращение к портам ввода/вывода по конкретным адресам. Для обеспечения ввода/вывода информации на этом уровне программист должен знать номера портов каждого устройства, а также протоколы или алгоритмы обслуживания этих устройств. Операционная система MS DOS реализует ряд сервисных функций ввода/вывода на логическом уровне, которые выступают как пронумерованные функции прерывания Int 21h. При этом прикладная программа пользователя должна сообщить необходимые для данной функции параметры и передать управление DOS, которая и осуществит все необходимые операции по управлению устройством на физическом уровне (где-то, возможно, обратится за помощью к BIOS), а затем вернёт управление прикладной задаче, сообщив, успешно ли завершилась операция или же была допущена ошибка.

Прерывания, в основном, можно разделить на два основных типа: аппаратные (hardware) и программные (software interrupt). Аппаратные прерывания вызываются сигналами от периферийных устройств, требующими обслуживания процессором, а программные, через посредство команды Int, вызывающей какую-либо сервисую функцию (процедуру) DOS или BIOS. Перечень функций, выполняемых операционной системой DOS, подробно изложен в п. 3.

Упрощенная схема обработки прерывания изображена на рис. 2.1. Процессор выполняет команду прерывания, используя таблицу векторов, где содержатся все адресные указатели обработчиков (аппаратных и программных) прерываний. Действия процессора при переходе на выполнение подпрограммы-обработчика (инициируемое командой Int n) и последующем возврате обратно (при встрече команды Iret) в точку выхода из основной программы показаны на рис. 2.1 цифрами в кружках. Одно и то же прерывание может выполнять несколько различных функций, код которых помещается в регистр ah, а дополнительные параметры заносятся в другие регистры РОН. Возвращаемая обработчиком информация содержится в регистре al или ax, если флаг cf=0. Флаг cf устанавливается в 1, если произошла какая-либо ошибка, код которой заносится в регистр ax (так называемый код возврата ошибки). Возможные коды ошибок приводятся в руководствах по DOS [4, 10, 12].

Рис. 2.1. Упрощенная схема обработки программного прерывания Int n

Функции информационного обмена MS DOS в своём развитии изменялись от специализированных программ обмена для каждого типа устройства на основе блока управления файлами FCB (File Control Block) до унификации обмена на основе файловой системы через дескрипторы. Дескриптор или логический номер файла идентифицирует файл или устройство, с которым должна работать прикладная программа. Это упрощает программирование операций ввода/вывода, т.к. позволяет осуществлять обмен информации независимо от природы файла (устройства). Существует пять стандартных дескрипторов файлов, которые предоставляются прикладной программе:

  • 0 – стандартный ввод с консоли (обычно клавиатура);

  • 1 – стандартный вывод на консоль (обычно экран дисплея);

  • 2 – устройство вывода ошибок (всегда дисплей);

  • 3 – внешнее устройство обмена AUX (асинхронный адаптер COM1);

  • 4 – стандартный принтер (первый параллельный порт LPT1).

Стандартный ввод (как и стандартный вывод) можно перенаправить средствами DOS на любое устройство или в файл, а стандартная ошибка всегда связана с экраном (обычно дескриптор 2 используют для вывода диагностических сообщений). Перенаправление ввода или вывода программы осуществляет командный процессор Command.com. Если, допустим, в программе prog предусмотрен ввод данных через дескриптор стандартного ввода 0, а вывод данных через дескриптор вывода 1, то при обычном запуске программы командой prog.exe программа будет требовать входные данные с клавиатуры и выводить результаты своей работы на экран. Если, однако, при запуске программы использовать символ перенаправления

prog.exe > file.txt,

то система сама создаст файл file.txt, и весь вывод программы будет записан в этот файл. Ввод по-прежнему будет осуществляться с клавиатуры. Запуск программы командой

prog.exe < file.dat

приведёт к тому, что программа всю требуемую ей информацию попытается ввести из файла file.dat. Поэтому этот файл должен быть подготовлен пользователем заранее. Вывод программы опять поступит на экран. Наконец, команда

prog.exe < file.dat > file.txt

заставит программу выполняться в режиме ввода информации из файла file.dat и вывода в файл file.txt. Ни экран, ни клавиатура использоваться не будут. Сама программа ничего не знает об этих перенаправлениях – она во всех случаях обращается к стандартному устройству ввода данных и к стандартному устройству вывода данных. Просто DOS как бы подставляет ей на входе и выходе другие устройства.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]