
- •Л Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичабораторная работа №1 Начало работы на языке ассемблера
- •Теоретическая часть
- •Int 21h
- •Int 21h
- •Задание
- •Контрольные вопросы.
- •Лабораторная работа №2 д Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичирективы языка ассемблера
- •Теоретическая часть
- •Задания (2 часа)
- •Int 21h
- •Int 21h
- •Контрольные вопросы
- •Лабораторная работа №3 к Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичоманды пересылки данных. Стек.
- •Теоретическая часть
- •Команды пересылки данных
- •Задание
- •Контрольные вопросы:
- •Лабораторная работа №4 а Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичрифметические операции. Битовые команды.
- •Теоретическая часть
- •Битовые команды
- •Задание
- •X dw ?
- •Int 21h
- •Int 21h
- •Контрольные вопросы:
- •Теоретическая часть
- •Задание
- •1. Предварительная подготовка
- •2 Порядок выполнения работы на эвм
- •Контрольные вопросы:
- •С Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичтроковые функции и массивы (4 часа).
- •Теоретическая часть Строковые инструкции
- •Инициализация массивов
- •Задание
- •Контрольные вопросы:
- •Лабораторная работа №7 п Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичроцедуры.
- •Теоретическая часть
- •Работа команд ret и retf
- •Задание
- •Программа №7.1
- •Контрольные вопросы
Задание
Внимательно изучите Приложения 1 и 2. Произведите трансляцию вашу исходную программу с ключом /L . Просмотрите созданный файл Lab1.lst. Протранслировать программу с ключом /LA и снова просмотреть содержимое файла Lab1.lst. Занести в отчет основные отличия.
Загрузить отладчик: Td
С помощью клавиши F10 перейти в режим меню, выбрать позицию FILE, команду OPEN, установить указатель на нужный exe-файл и загрузить его.
Клавишей F10 перейти в режим меню, выбрать позицию VIEW, открыть окно DUMP, затем CPU (при недостаточном объеме памяти закрыть окно с текстом исходного модуля).
Примечание. Закрыть текущее окно можно по Alt+F3.
Несколько раз нажать клавишу F6, посмотреть, как циклически меняется содержимое экрана (окна CPU,DUMP,CPU,...).
В положении CPU клавишей F5 увеличить размеры окна, несколько раз нажать клавишу Tab, посмотреть, как меняются активные подокна окна CPU, каковы их локальные меню, вызываемые по Alt+F10 и сворачиваемые по Esc, вернуться в подокно кода (команд).
Нажимая клавиши F7 или F8, выполнить по шагам команды, осуществляющие инициализацию сегментных регистров ds и es.
Просмотреть содержимое сегментов, найти там свои данные.
Записать в отчет значения адресов своих данных.
Контрольные вопросы.
Из чего состоит процесс ассемблирования программы?
Чем отличается трансляция от компоновки?
Можно в процессе ассемблирования обойтись без ключей?
Объясните назначение каждого из перечисленных файлов, получаемых при создании исполняемой программы на языке ассемблер *.asm, *.lst, *.map, *.exe, *.com.
Что такое "Турбоотладчик", расскажите основы пользования им?
Какая разница между сегментными регистрами es и ds?
Как отражаются es и ds в Турбоотладчике?
В чем особенность программы на языке ассемблера?
Есть у ассемблера своя собственная среда программирования?
Лабораторная работа №2 д Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичирективы языка ассемблера
Цель работы:
ознакомление со структурой программы на ассемблере;
дать понятие о директивах определения данных;
директивы DATA, CODE, Mode;
Теоретическая часть
Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких таких блоков-сегментов. Каждый сегмент содержит совокупность предложений языка, каждое из которых занимает отдельную строку кода программы.
Предложения ассемблера бывают четырех типов:
команды или инструкции, представляющие собой символические аналоги машинных команд. В процессе трансляции инструкции ассемблера преобразуются в соответствующие команды системы команд микропроцессора;
макрокоманды — оформляемые определенным образом предложения текста программы, замещаемые во время трансляции другими предложениями;
директивы, являющиеся указанием транслятору ассемблера на выполнение некоторых действий. У директив нет аналогов в машинном представлении;
строки комментариев, содержащие любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором.
Для простых программ, содержащих по одному сегменту для кода, данных и стека, хотелось бы упростить ее описание. Для этого в трансляторы MASM и TASM ввели возможность использования упрощенных директив сегментации. Но здесь возникла проблема, связанная с тем, что необходимо было как-то компенсировать невозможность напрямую управлять размещением и комбинированием сегментов. Для этого совместно с упрощенными директивами сегментации стали использовать директиву указания модели памяти MODEL, которая частично стала управлять размещением сегментов и выполнять функции директивы ASSUME (поэтому при использовании упрощенных директив сегментации директиву ASSUME можно не использовать). Эта директива связывает сегменты, которые в случае использования упрощенных директив сегментации имеют предопределенные имена, с сегментными регистрами (хотя явно инициализировать ds все равно придется).
Синтаксис директивы MODEL показан на рис. 1.
Рис. 1 Синтаксис директивы MODEL
Обязательным параметром директивы MODEL является модель памяти. Этот параметр определяет модель сегментации памяти для программного модуля. Предполагается, что программный модуль может иметь только определенные типы сегментов, которые определяются упомянутыми нами ранее упрощенными директивами описания сегментов. Эти директивы приведены в таблице 1.
Таблица 1. Упрощенные директивы определения сегмента
Формат директивы |
Назначение |
.CODE [имя] |
Начало или продолжение сегмента кода |
.DATA |
Начало или продолжение сегмента инициализированных данных. |
.STACK [размер] |
Начало или продолжение сегмента стека модуля. Параметр [размер] задает размер стека |
Наличие директиве .Code параметра [имя] говорит о том, что возможно определение нескольких сегментов этого типа. С другой стороны, наличие нескольких видов сегментов данных обусловлено требованием обеспечить совместимость с некоторыми компиляторами языков высокого уровня, которые создают разные сегменты данных для инициализированных и неинициализированных данных, а также констант.
При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, к которым можно обращаться во время работы программы, с тем, чтобы получить информацию о тех или иных характеристиках данной модели памяти (см. табл.2).
Таблица 1. Модели памяти
Модель |
Тип кода |
Тип данных |
Назначение модели |
TINY |
Near |
Near |
Код и данные объединены в одну группу с именем DGROUP. Используется для создания программ формата .com. |
SMALL |
Near |
Near |
Код занимает один сегмент, данные объединены в одну группу с именем DGROUP. Эту модель обычно используют для большинства программ на ассемблере |
MEDIUM |
Far |
Near |
Код занимает несколько сегментов, по одному на каждый объединяемый программный модуль. Все ссылки на передачу управления — типа far. Данные объединены в одной группе; все ссылки на них — типа near |
COMPACT |
Near |
Far |
Код в одном сегменте; ссылка на данные — типа far |
LARGE |
Far |
Far |
Код в нескольких сегментах, по одному на каждый объединяемый программный модуль |
Директивы определения сегментов .STACK, .CODE и .DATA определяют, соответственно, сегмент стека, сегмент кода и сегмент данных. Например, директива:
.STACK 200h
определяет стек размером в 200h (512) байт. Что касается стека, то это все, что вы сможете сделать. Необходимо просто убедиться, что в вашей программе имеется директива .STACK, и Турбо Ассемблер выделит для вас стек. Для обычных программ вполне подходит стек размером 200h, хотя в программах, интенсивно использующих стек (например, в программах, содержащих рекурсивные вызовы) может потребоваться стек большего размера.
Директива .CODE отмечает начало сегмента кода. Вы можете посчитать, что для Турбо Ассемблера достаточно очевидно, что все ваши инструкции относятся к сегменту кода. На самом деле Турбо Ассемблер позволяет вам (с помощью стандартных директив определения сегментов) использовать несколько сегментов кода, а директива .CODE указывает Турбо Ассемблеру, в какой именно сегмент надо поместить ваши инструкции. Определение сегмента кода еще проще, чем определение сегмента стека, так как аргументы для директивы .CODE указывать не требуется. Например:
.
.
.Code
sub ax,ax ; установить аккумулятор в значение 0
mov cx,100 ; число выполняемых циклов
.
.
Директива .DATA несколько более сложна. Как можно понять, директива .DATA отмечает начало сегмента данных. В этом сегменте следует размещать ваши переменные памяти. Например:
.
.Data
TopBoundary DW 100
Counter DW ?
ErrorMessage DB 0dh,0dh, '***Ошибка***',0dh,0ah,'$'
.
Это довольно просто. Вся "сложность" директивы .DATA заключается в том, что до того, как вы будете обращаться к ячейкам памяти в сегменте, определенном с помощью директивы .DATA, нужно явно загружать сегментный регистр DS идентификатором @data. Так как сегментный регистр можно загрузить из регистра общего назначения или ячейки памяти, но в него нельзя загрузить константу, регистр DS обычно загружается с помощью последовательности из двух инструкций:
.
mov ax,@data
mov ds,ax
.
(Вместо регистра AX можно использовать любой общий регистр). Данная последовательность инструкций устанавливает DS таким образом, чтобы он указывал на сегмент данных, который начинается по директиве .DATA.
Директивы определения данных позволяют определить переменные в памяти различного размера:
DB - 1 байт
DW - 2 байта = 1 слово
DD - 4 байта = 1 двойное слово
DQ - 8 байт = 1 четвертное слово
DT - 10 байт