Главная страница
Навигация по странице:

  • Теоретическая часть Система регистров процессора

  • Регистр флагов FL

  • Процедуры формирования программы Начальной процедурой создания программы на языке Ассемблера является ввод исходного текста программы в файл с расширением .

  • Комментарии

  • Знаковое умножение: Команда IMUL

  • Функция 01h (Считать символ из STDIN с эхом, ожиданием и проверкой на Ctrl+Break)

  • Вход: АН 01h Выход

  • Функция 02h (Вывести символ на STDOUT с проверкой на Ctrl+Break)

  • Функция 08h (Считать символ из STDIN без эха, с ожиданием и проверкой на Ctrl+Break)

  • Функция 09h (Записать строку в STDOUT с проверкой на Ctrl+Break)

  • новое. Лабораторная работа 1 Трансляция, компоновка и отладка программ


    Скачать 280.5 Kb.
    НазваниеЛабораторная работа 1 Трансляция, компоновка и отладка программ
    Анкорновое.doc
    Дата22.09.2017
    Размер280.5 Kb.
    Формат файлаdoc
    Имя файлановое.doc
    ТипЛабораторная работа
    #10447

    Лабораторная работа № 1

    Трансляция, компоновка и отладка программ
    Цель работы: Целью работы является освоение инструментальных средств создания программ на языке ассемблера.
    Теоретическая часть
    Система регистров процессора
    Структурные схемы компьютеров мало чем отличаются у разных моделей компьютеров. У всех компьютеров есть оперативная память, процессор, внешние устройства. Различными являются способы, средства и используемые ресурсы, с помощью которых компьютер функционирует как единый механизм. Совокупность функциональных программно-управляемых свойств компьютера называют архитектурой.

    Архитектура ЭВМ – это абстрактное представление ЭВМ, которое отражает структурную, схемотехническую и логическую организацию. Приступить к изучению языка ассемблера любого компьютера имеет смысл только после выяснения того, какая часть из вышеперечисленных аспектов архитектуры оставлена видимой и доступной для программирования. Это так называемая программная модель компьютера. На рисунке 1 приведена программная модель микропроцессора Intel. Как видно из приведенной модели, ее основу составляют регистры общего назначения, состояния и ряд других. В разных моделях компьютеров одной и той же фирмы-производителя количество и разрядность регистров могут существенно изменяться.


    Универсальные регистры AX, BX, CX, DX имеют разрядность 16 бит (2 байта) и могут использоваться для временного хранения любых данных, при этом можно работать с каждым регистром целиком, а можно отдельно с каждым его байтом. Старшие байты РОН имеют имена AH, BH, DH, CH, а младшие – AL, BL, DL, CL. Регистры AL, AH образуют соответственно младший и старший байты условного регистра AX.

    Кроме того, каждый из РОН может использоваться как специальный регистр при выполнении некоторых команд программы:

    регистр АХ, аккумулятор, используется при умножении и делении слов, в операциях ввода-вывода и в некоторых операциях над строками;

    регистр AL используется при выполнении аналогичных операций над байтами, а также при преобразовании десятичных чисел и выполнении над ними арифметических операций;

    регистр AH используется при умножении и делении байтов;

    регистр BX, базовый регистр, часто используется при адресации данных в памяти;

    регистр CX, счетчик, используется как счетчик числа повторений цикла и в качестве номера позиции элемента данных при операциях над строками. Регистр CL используется как счетчик при операциях сдвига и циклического сдвига на несколько битов;

    регистр DX, регистр данных, используется при умножении и делении слов. Кроме этого используется в операциях ввода-вывода как номер порта.

    В новых версиях процессор используются расширенные 32-битные регистры. Обозначаются путем прибавления буквы E. Например EAX.

    В микропроцессорах Intel программы и данные хранятся в отдельных областях памяти - сегментах, с объемом до 64 КБ (килобайт). Одновременно микропроцессор может иметь дело с 4 сегментами, начальные адреса которых содержатся в сегментных регистрах CS, DS, SS, ES. Эти регистры выполняют следующие функции:

    - регистр сегмента команд CS указывает на сегмент, содержащий текущую исполняемую программу. Для вычисления адреса следующей подлежащей исполнению команды процессор складывает значение CS умноженное на 16 с указателем команд IP;

    - регистр сегмента стека SS указывает на текущий сегмент стека - области памяти предназначенной для временного хранения данных и адресов;

    - регистр сегмента данных DS указывает на текущий сегмент данных, который обычно содержит используемые в программе переменные;

    - регистр дополнительного сегмента ES указывает на текущий дополнительный сегмент, который используется при выполнении операций над строками.

    Регистры смещений IP, SP,BP, SI, DI используются для хранения относительных адресов ячеек памяти внутри сегментов (иначе говоря, смещений относительно начала сегментов):

    • регистр IP хранит смещение адреса текущей команды программы;

    • регистр SP указывает на вершину стека – смещение относительно начала стека;

    • в регистр BP записывается начальный адрес поля памяти, непосредственно отведенного под стек;

    • регистры SI и DI предназначены для хранения адресов индексов источника и приемника данных при операциях над строками и другими структурами данных.

    Регистр флагов FL представляет собой 16-битовый регистр, где фиксируется информация о текущем состоянии процессора.

    15 0













    OF

    DF

    IF

    TF

    SF

    ZF




    AF




    PF




    CF

    Рисунок 1 – Регистр флагов

    Флаг OF называется флагом переполнения и OF=1 свидетельствует о наличии ошибки в операциях над числами со знаком.

    Флаг направления DF используется в командах работы со строками. При DF=1 регистр индекса, используемый в командах работы со строками, увеличивается на 1 при каждом следующем выполнении команды, при DF=0 – регистр индекса на 1 уменьшается.

    Флаг прерывания IF обычно он устанавливается в 1 и такое его значение позволяет исполняемой программе пользователя реагировать на прерывания. Однако, когда вызывается программа обработки прерывания, флаг IF устанавливается в 0, чтобы никакие другие прерывания не могли помешать текущей обработке прерывания.

    Флаг TF называется флагом трассировки, при его значении, равном 1, разрешается выполнение программы по шагам.

    Флаг знака SF устанавливается в 1, если в результате выполнения операции над числами со знаком, получается отрицательное число.

    Флаг нуля ZF устанавливается в 1, если результатом операции является нулевое значение.

    Флаг вспомогательного переноса АF используется в двоично-десятичной арифметике. Этот флаг устанавливается в 1, если результат такой операции не является десятичной цифрой.

    Флаг четности РF устанавливается в 1, если результат операции имеет четное количество битов, равных 1, в двоичном представлении результата.

    Флаг СF называется флагом переноса и в него заносится перенос (или заем) из знакового (старшего) разряда числа.

    Процедуры формирования программы
    Начальной процедурой создания программы на языке Ассемблера является ввод исходного текста программы в файл с расширением .asm. При этом может быть использован любой текстовый редактор, сохраняющий текст в виде стандартных кодов ASCII, например, редактор NC или блокнот. Основное требование к редактору, заключается в том, чтобы он (редактор) не вставлял посторонних символов (специальных символов форматирования).

    Следующим шагом формирования программы является компиляция, которая носит специфическое название ассемблирование.

    Результатом выполнения этого этапа является программа в машинных кодах с расширением .obj, или, иначе, объектная программа, уже “понятная” микропроцессору. Естественно перевод состоится лишь в том случае, если исходный текст программы не содержит ошибок.

    Однако объектная программа еще не является законченной и исполняемой, т.к. в ней определены не все адреса (программа не является “перемещаемой”) и не объединены части (блоки) программы, которые могут транслироваться отдельно с целью более простой отладки. Преобразование объектной программы в исполняемую (компоновка) выполняется загрузчиком (редактором связей) LINK.

    Только после этого получается исполняемый файл.

    Порядок действий в FASM

    1. Создайте новый файл и сохраните его с расширением .asm

    2. Выберите пункт меню Run Program.

    3. Просмотрев полученные результаты, закройте окно исполняемого файла.

    Синтаксис команд
    Рассмотрим формат команды ассемблера: [Метка:] Мнемокод [операнд] [;комментарий]

    Обязательным здесь является только мнемокод. В зависимости от команды может не быть операндов, может быть один или два операнда.

    Метка - служит для присвоения имени команде. На эту метку можно будет ссылаться из любой части программы. Она может содержать до 31 символа и заканчиваться двоеточием и содержать символы алфавита от a до Z. и от a до z, цифры от 0 до 9 и символы ?, ., @,, _, $. Метка не должна начинаться с цифры. Если используется «.», то она должна быть первым символом метки. Имя метки не должно совпадать с названием команд. В метку не должны вставляться пробелы.

    Комментарии должны быть отделены от команд ;. Это комментарии к команде, программе и блоку команд.

    Мнемокод - это имя команды МП.

    Поле операндов в поле операндов может быть0, 1 или 2 операнда в зависимости от типа команды. Операнд - часть команды, макрокоманды или директивы ассемблера, обозначающие объекты, над которыми производятся действия. Операнды ассемблера описываются выражениями с числовыми и текстовыми константами, метками и идентификаторами переменных с использованием знаков операций и некоторых зарезервированных слов.

    Если в команде 2 операнда, то первый операнд называется приемником, а второй источником.

    Например:

    MOV AX, CX ; содержимое регистра cx перемещается в ax
    Команда Mov

    Команда пересылки данных. Копирует содержимое источника в приёмник, источник не изменяется.

    Например: mov ax, 1 присваивает регистру ax значение 1.

    Операнды команды mov могут быть как регистрами, так и переменными, но одновременно оба операнда не могут быть переменными.

    Примеры показывают все пять возможных ситуаций:

    • регистр-регистр;

    mov ax,bx

    mov ah,al

    • память-регистр;

    mov [000ah],ax

    • регистр-память;

    mov ax, [000ah]

    • регистр- непосредственное значение;

    mov ax,279
    Сложение и вычитание

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

    Примеры показывают все пять возможных ситуаций:

    • сложение/вычитание регистр-регистр;

    add ax,bx

    add ah,al

    • сложение/вычитание память-регистр;

    sub [000ah],ax

    • сложение/вычитание регистр-память;

    add ax, [000ah]

    • сложение/вычитание регистр- непосредственное значение;

    add ax,279

    sub ch,3

    Поскольку прямой операции память-память не существует, данная операция выполняется через регистр.

    Умножение

    Операция умножения для беззнаковых данных выполняется командой MUL, а для знаковых - IMUL. Ответственность за контроль над форматом обрабатываемых чисел и за выбор подходящей команды умножения лежит на самом программисте. Существуют две основные операции умножения:

    "Байт на байт". Один из множителей находится в регистре AL, а другой в байте памяти или в однобайтовом регистре. После умножения произведение находится в регистре AX. Операция игнорирует и стиpает любые данные, которые находились в регистре AH.

    "Слово на слово". Один из множителей находится в регистре AX, а другой - в слове памяти или в регистре. После умножения произведение находится в двойном слове, для которого требуется два регистра: старшая (левая) часть произведения находится в регистре DX, а младшая (правая) часть в регистре AX. Операция игнорирует и стирает любые данные, которые находились в регистре DX.

    В единственном операнде команд MUL и IMUL указывается множитель. Рассмотрим следующую команду:

    Пример:

    mov bx,10

    mov al,2

    mul bx ;ax=2*10=20=0014h: ah=00h al=14h

    Знаковое умножение: Команда IMUL

    Команда IMUL умножает знаковые числа.

    mov ax,8

    mov bx,-1

    imul bx ; dx:ax=-8=0fffffff8h=0014h: dx=0ffffh ax=0fff8h

    Таким образом, если множимое и множитель имеет одинаковый знаковый бит, то команды MUL и IMUL генерируют одинаковый результат. Но, если сомножители имеют разные знаковые биты, то команда MUL вырабатывает положительный результат умножения, а команда IMUL - отрицательный.

    Деление

    Операция деления для беззнаковых данных выполняется командой DIV, a для знаковых - IDIV. Ответственность за подбор подходящей команды лежит на программисте. Существуют две основные операции деления:

    Деление "слова на байт". Делимое находится в регистре AX, а делитель - в байте памяти или в однобайтовом регистре. После деления остаток получается в регистре AH, а частное -в AL. Так как однобайтовое частное очень мало (максимально+255 для беззнакового деления и +127 для знакового), то данная операция имеет ограниченное использование.

    Деление "двойного слова на слово". Делимое находится в регистровой паре DX:AX, а делитель - в слове памяти или в регистре. После деления остаток получается в регистре DX, а частное в регистре AX. Частное в одном слове допускает максимальное значение +32767 для беззнакового деления и +16383 для знакового.

    В единственном операнде команд DIV и IDIV указывается делитель.

    Пример

    Mov ax,100

    Mov bh,2

    Div bh ; 100 div 2=50, ah=0 al=50
    Система прерываний

    Для работы в режиме DOS необходимо пользоваться системой прерываний.

    Программа, запрашивающая сервис DOS, должна подготовить всю необходимую информацию в регистрах и управляющих блоках, указать в регистре AH номер желаемой функции DOS и затем вызвать прерывание INT 21H.

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

    Функция 01h (Считать символ из STDIN с эхом, ожиданием и проверкой на Ctrl+Break)

    Вход:

    АН

    01h




    Выход:

    AL

    С клавиатуры


    Эта функция считывает (ожидает) символ со стандартного входного устройства - STDIN (например, с клавиатуры) и отображает этот символ на стандартном выходном устройстве - STDOUT (например, на мониторе). При считывании символа его отображение на устройстве вывода называют "эхом". При распознавании нажатия сочетания клавиш Ctrl+Break выполняется прерывание INT 23h.
    Функция 02h (Вывести символ на STDOUT с проверкой на Ctrl+Break)

    Вход:

    АН

    02h

    DL

    символ, выводимый на устройство стандартного вывода

    Выход:

    Нет

    ---


    Эта функция посылает символ из регистра DL на устройство стандартного вывода. В DL можно записать как ASCII-код символа, так сам символ. В последнем случае символ заключается в одинарные кавычки.
    Функция 08h (Считать символ из STDIN без эха, с ожиданием и проверкой на Ctrl+Break)

    Вход:

    АН

    08h

    Выход:

    AL

    код символа


    Эта функция считывает (ожидает) символ из стандартного входного устройства и возвращает этот символ в регистр AL.

    Функция 09h (Записать строку в STDOUT с проверкой на Ctrl+Break)

    Вход:

    АН

    09h

    DS:DX

    адрес строки

    Выход:

    Нет

    ---


    Эта функция выводит на стандартное устройство вывода (например, на монитор) строку символов. Адрес строки (первого символа строки) должен быть предварительно записан в DS:DX. Строка должна ОБЯЗАТЕЛЬНО заканчиваться символом $ (24h), который не будет выведен в STDOUT.

    Практическая часть

    1. Запустите среду программирования Fasm.

    2. Создайте отдельную папку для выполнения задания. В созданной папке создайте файл с расширением .asm

    3. Наберите код программы выводящей на экран строку.



    Сохраните и запустите программу на исполнение командой Run.

    1. Для вывода числа на экран наберите следующий макрос. И выведите число 100 на экран.



    1. Напишите программу, которая находит значение следующей функции:




    1. Выполните индивидуальное задание




    Номер варианта

    Задание










































    Содержание отчета

    Отчет лабораторной работы представляется в печатном виде.

    Отчет должен содержать:

    - титульный лист;

    - вариант индивидуального задания;

    - текст программы.
    Контрольные вопросы

    1. Нарисуйте структуру регистров общего назначения и перечислите их.

    2. Регистр флагов FL. Описание флагов.

    3. Процедуры формирования программы.

    4. Синтаксис команды.

    5. Назначение метки команды.

    6. Поле операндов.

    7. Команда mov.

    8. Сложение и вычитание.

    9. Умножение.

    10. Деление.

    11. Система прерываний.
    написать администратору сайта