Смекни!
smekni.com

Разработка виртуальных лабораторных работ средствами эмулятора Emu8086 (стр. 4 из 21)

Описание типов исполнимых файлов:

#MAKE_COM# - самый старый и самый простой формат исполнимого файла. Такие файлы загружаются с префиксом 100h (256 байтов). Выберите СОМ Template из меню New, если вы планируете компилировать COM-файл. Директива компилятора ORG 100h должна быть добавлена перед кодом. Выполнение всегда начинается с первого байта файла. Поддерживается командной строкой DOS и Windows.

#MAKE_EXE# - более "продвинутый" формат исполнимого файла. Не ограничены размер и количество сегментов. Сегмент стека должен быть определен в программе. Вы можете выбрать EXE Template из меню New для создания простой ЕХЕ-программы с определенными сегментмами Данных, Стека и Кода. Точка входа (где начинается выполнение) определяется программистом. Поддерживается командной строкой DOS и Windows.

#MAKE_BIN# - простой исполнимый файл. Вы можете определить значения всех регистров, сегмент и смещение для области памяти, куда этот файл будет загружен. Если загрузить файл "MY. BIN" в эмулятор, он будет виден для файла - "MY. BINF" и загрузится файл "MY. BIN" в местоположение, определенное в файле "MY. BINF". Регистры также установятся с учетом информации из этого файла (откройте этот файл в редакторе для изменения или изучения). В том случае, если эмулятор не найдет файл "MY. BINF", будет использоваться текущие значения регистров и файл "MY. BIN" загрузится в текущий CS: IP.

Выполнение начинается со значения в CS: IP.

Этот тип файла уникален для Emu8086.

Файл ". BINF создается автоматически компилятором, если он находит директиву #MAKE_BIN#.

ПРЕДУПРЕЖДЕНИЕ! если файл ". binf" существует, то он будет перезаписан!

Значения должны быть шестнадцатиричными! Если эти значения не определены, то они устанавливаются по умолчанию:

LOAD_SEGMENT = 0100 LOAD_OFFSET = 0000 CS = ES = SS = DS = 0100 IP = 0000 Если LOAD_SEGMENT и LOAD_OFFSET не определены, то используются значения CS и IP, и наоборот.

Если значение Load to offset не равно нулю (0000), то ORG???? h должна быть добавлена в файл. BIN, где???? h - это смещение для загрузки. Это должно быть сделано для того, чтобы компилятор мог вычислить правильные адреса.

#MAKE_BOOT# - эта директива копирует первую дорожку дискеты (загрузочный сектор).

Вы можете записать загрузочный сектор виртуального дисковода (FLOPPY_0) через меню эмулятора:

[Virtual Drive] - > [Write 512 bytes at 7C00 to Boot Sector] Сначала вы должны откомпилировать ". boot"-файл, а затем загрузить его в эмулятор (см. "micro-os_loader. asm" и "micro-os_kernel. asm" в разделе "Samples").

Затем выберите в меню [Virtual Drive] - > [Boot from Floppy], чтобы загрузить эмулятор с виртуального дисковода.

Затем, если вам любопытно, вы можете записать виртуальную дискету на реальную дискету и загрузить с нее ваш компьютер. Я рекомендую использовать "RawWrite for Windows" с: http://uranus. it. swin.edu. au/~jn/linux/rawwrite. htm (учтите, что "micro-os_loader. asm" не использует MS-DOS-совместимый загрузочный сектор, так что лучше использовать чистую дискету, хотя она должна быть отформатирована IBM (MS-DOS)).

Директива компилятора ORG 7C00h должна быть добавлена перед кодом, если компьютер начинает загружаться с первой дорожки дискеты в адрес 0000: 7C00.

Размер. BOOT-файла должен быть менее 512 байтов (ограничен размером сектора дискеты).

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

Обработка ошибок

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

MOV DS, 100 - это недопустимая команда, потому что в сегментный регистр нельзя устанавливать непосредственное значение - должны использоваться регистры общего назначения:

MOV AX, 100 MOV DS, AX MOV AL, 300 - это недопустимая команда, т.к регистр AL имеет только 8 битов, и его максимальное значение 255 (или 11111111b), а минимальное - 128.

Компилятор делает несколько проходов перед генерацией правильного машинного кода. Если он находит ошибку и не выполняет требуемое количество проходов, он может выдать неправильное сообщение об ошибке. Например:

#make_COM#

ORG 100h

MOV AX, 0

MOV CX, 5

m1: INC AX

LOOP m1; это не настоящая ошибка!

MOV AL, 0FFFFh; ошибка здесь.

RET

Список генерируемых ошибок:

(7) Condition Jump out of range (Условие перехода за пределами диапазона) !: LOOP m1 (9) Wrong parameters (Неправильнве параметры): MOV AL, 0FFFFh (9) Operands do not match (Операнды не соответствуют): Second operand is over 8 bits (Второй операнд более 8 битов) ! Первое сообщение (7) - неправильное. Компилятор не закончил вычисление смещений для меток, поэтому он думает, что смещение метки m1 - это 0000. Этот адрес лежит за пределами диапазона, т.к мы начинаем со смещения 100h.

Внесите исправления в эту строку: MOV AL, 0FFFFh (AL не может содержать значение 0FFFFh). Это устранит обе ошибки! Например:

#make_COM#

ORG 100h

MOV AX, 0

MOV CX, 5

m1: INC AX

LOOP m1; тот же самый код без ошибки!

MOV AL, 0FFh; все!

RET

При сохранении компилируемого файла, компилятор также сохраняет 2 других файла, которые используются эмулятором для отображения фактического исходного кода при его исполнении и выборе соответствующей строки.

asm - этот файл содержит оригинальный исходный код, который был использован для создания исполнимого файла.

debug - этот файл содержит информацию, которая позволяет эмулятору выбирать строки оригинального исходного кода во время выполнения машинного кода.

symbol - Таблица символов. Она содержит информацию, которая позволяет отображать окно "Variables" (Переменные). Это текстовый файл, так что вы можете посмотреть его из текстового редактора.

binf - этот файл содержит информацию, которая используется эмулятором для загрузки BIN-файла в указанное местоположение, и установки значений регистров предшествующих выполнению (создается только в том случае, если исполнимый файл - это BIN-файл).

2.3 Редактор исходного кода

Использование мыши Редактор поддерживает следующие действия мыши:

Горячие клавиши редактора:

Допустимые правила синтаксиса выражений для поиска и замены

Если появятся проблемы с редактором исходного кода, вы можете вручную скопировать файл "cmax20. ocx" из каталога, где установлена программа, в папку Windows\System или Windows\System32, заменив существующую версию этого файла (после этого может потребоваться перезагрузка компьютера

2.4 Ассемблер

Что такое ассемблер? Ассемблер - это программа, преобразовывающая исходный текст программы, написанной на языке ассемблера, в машинный код. Дополнительно ассемблер может создавать листинг программы с номерами строк, адресами переменных, операторами исходного языка и таблицей перекрестных ссылок символов и переменных, используемых в программе. Совместно с ассемблером используется программа, называемая компоновщиком (linker) или редактором связей (linkage editor). Она объединяет отдельные файлы, созданные ассемблером, в единую исполняемую программу. В блок базовых программ входит также отладчик (debugger) позволяющий программисту пошагово выполнять программу, проверять и изменять содержимое памяти.

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

16-разрядные программы для реального режима адресации. Эти программы предназначены для выполнения в системе MS DOS либо в среде эмулятора DOS под Linux. Большинство примеров из этой книги можно адаптировать для выполнения в реальном режиме адресации. О программировании для реального режима адресации речь пойдет в многочисленных примечаниях книги. Кроме того, две главы полностью посвящены выводу текстовой и графической информации на экран монитора в режиме MS DOS.

32-разрядные программы для защищенного режима. Эти программы предназначены для запуска в окне текстового терминала (консоли) вереде операционной системы Microsoft Windows. С их помощью вы сможете отобразить на экране монитора как текстовые, так и графические данные.

Как язык ассемблера связан с машинным кодом? Во-первых, машинный код - это набор чисел, которые интерпретируются центральным процессором компьютера и определяют выполняемые им действия. Например, все процессоры Intel семейства IA-32 имеют совместимый между собой машинный код. Машинный код состоит исключительно из двоичных чисел. Во-вторых, язык ассемблера состоит из набора операторов, понятных человеку. Каждый оператор начинается с короткого мнемонического обозначения выполняемых процессором действий, например ADD (сложить), MOV (переслать), SUB (вычесть) или CALL (вызвать). Язык ассемблера однозначно связан с машинным кодом. Это значит, что каждый оператор языка ассемблера соответствует одной команде машинного кода.

Какое отношение имеет язык ассемблера к языкам высокого уровня, таким как C++ или Java? Языки высокого уровня, такие как C++ или Java, не имеют однозначного соответствия с языком ассемблера и, следовательно, с машинным кодом. Например, один оператор языка C++ транслируется в несколько операторов языка ассемблера или несколько машинных команд. Давайте посмотрим, как происходит процесс трансляции оператора языка C++ в машинный код. Поскольку анализировать двоичный машинный код очень трудно, вместо него мы рассмотрим эквивалентные операторы языка ассемблера. В приведенном ниже операторе языка C++ выполняются две арифметические операции и полученный результат присваивается переменной. Предположим, что существуют целочисленные переменные X и Y:

X = (У + 4) 3;

В результате трансляции получится приведенный ниже набор ассемблерных команд. Обратите внимание, что одному оператору языка высокого уровня соответствует несколько команд языка ассемблера, так как последний однозначно связан с машинным кодом: