Лекция по программированию

Автор работы: Пользователь скрыл имя, 11 Января 2011 в 19:34, лекция

Краткое описание

Язык ассемблера - это один из самых старых из всех существующих языков программирования. Когда-то это был один из основных языков программирования, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Появились более удобные средства общения с компьютером. Но в отличии от других языков ассемблер не умирал, более того он это не смог сделать в принципе.

Содержимое работы - 1 файл

LECTS.DOC

— 893.00 Кб (Скачать файл)
  • регистр флагов eflsgs/flags
  • регистр указателя команды eip/ip

Используя эти  регистры,  можно  получить  информацию  о результатах выполнения  команд программы и влиять на состояние самого МП. Регистр флагов - регистр разрядностью 32-16 бит..

31 ... 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
0 ... ГО VIP VIF АС VM RF 0 NT IOPL OF SF SF SF SF ZF 0 AF 0 PF 1 CF

    Рассмотрим    некоторые    наиболее    часто    используемые    в    программах    любого    языка

    программирования  флаги.

    Все флаги можно разделить на три  группы:

    1. 8 флагов состояния. Эти флаги могут изменяться после выполнения машинных команд, 
      таких как арифметические операции (сложение, вычитание и т.д.), операции сравнения и 
      т.д. После формирования регистра флагов, их можно использовать для анализа результата и 
      изменения хода выполнения программы в зависимости от полученного результата.
  1. 1 флаг управления (df), который используется цепочными командами (работа со строками).
    1. 5 системных флагов, управляющих вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом i8086. Не рекомендуется прикладным программам модифицировать без необходимости эти флаги, т.к. в большинстве случаев это приводит к прерываниям работы программы.
 
мнем  оника флага флаг номер бита
      содержание  и назначение
1. cf флаг переноса 0 1-арифметическая  операция произвела перенос из  старшего бита результата. Старшим  является 7-й, 15-й или 31-й бит в зависимости от размерности операнда. 0 - переноса нет
2. pf флаг паритета 2 1-8 младших разрядов результата содержат четное число единиц 0-8 младших разрядов результата содержат нечетное число единиц.
3. af вспомогательный флаг переноса 4 Используется   для   команд,   работающих   с   BCD-числами. Фиксирует факт заема из младшей тетрады результата. 1-   в     результате     операции     сложения     был произведен перенос из разряда 3 в старший разряд или при вычитании был заем в разряд 3 младшей   тетрады   из   значения   в   старшей тетраде. 2-   0 - переносов и заемов не было.
4. zf флаг нуля 6 1-результат  нулевой 0- результат не нулевой
5. sf флаг знака 7 Отражает состояние  старшего бита результата (биты 7, 15 или 31 для 8-, 16- или 32-разрядных операндов, соответственно) 1-старший бит результата равен 1 0 - старший бит результата равен 0
6. of флаг

переполнения

11 флаг of используется для фиксирования факта потери

значащего бита при арифметических операциях 1-  в результате  операции  происходит  перенос (заем) в (из) старшего, знакового бита результата (биты 7, 15 или 31 для 8-, 16- или 32-разрядных операндов, соответственно) 0-в результате операции не происходит переноса (заема) в (из) старшего, знакового бита результата.

    Указатель команд — это регистр eip/ip. В этом регистре всегда находится адрес команды, которая должна быть выполнена следующей. Более точно, в этом регистре находится адрес той команды, отсчитанный от начала сегмента команд, на начало которого указывает регистр CS. Поэтому абсолютный адрес этой команды определяется парой cs и ip. Менять содержимое данного регистра можно только командами перехода.

Структура программы на ассемблере.

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

  • Вспомним, что ассемблер является символичным аналогом машинного языка, поэтому он относится к машинно-зависимым языкам. Поэтому программа написанная на ассемблере, должна отражать все особенности архитектуры МП: организацию памяти, способы адресации операндов, правила использования регистров и т.д. Из-за необходимости учета подобных особенностей ассемблер уникален для каждого типа МП.
  • Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами  памяти.  Программа может  состоять  из  одного  или  нескольких  таких  блоков- сегментов. Каждый сегмент содержит совокупность предложений языка, каждое из которых занимает отдельную строку кода программы.
  • Предложения ассемблера бывают четырех типов:

      о   команды,    или   инструкции,    представляющие    собой    символические    аналоги машинных команд. В процессе трансляции инструкции ассемблера преобразуются в соответствующие команды МП о   макрокоманды   -   оформляемые   определенным   образом   предложения   текста

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

    Комментарии игнорируются транслятором. Рассмотрим формат команды ассемблера: [Метка:] Мнемокод [операнд] [;комментарий]

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

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

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

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

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

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

    Например:

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

    Для работы с данными их помещают в  сегмент данных.

Описание  сегмента данных осуществляется с помощью директивы DATA - начало сегмента данных   данные  .CODE

Классификация операндов.

    1- Постоянные и непосредственные операнды- число, строка, имя или выражение, имеющие некоторое фиксированное значение.

    MOV ax,5

    2- Адресные операнды- задают физическое расположение   операнда в памяти с помощью указания двух составляющих адреса: сегмента и смещения .

MOV AX,0000H

MOV DS,AX

MOV AX,DS:0000H ; адресный операнд

    3- Перемещаемые операнды — любые символьные имена, представляющие некотрые адреса памяти.

.data

adb10

.code

lea si,a; a - перемещаемый операнд

    4- Счетчик адреса — специфический вид операнда. Он обозначается $. Когда транслятор ассемблера встречает $ в исходной программе этот символ то подставляет вместо него текущее значение счетчика адреса. Значение счетчика адреса, или как его иногда называют счетчика   размещения,   представляет   собой   смещение   текущей   машинной   команды относительно начала сегмента кода.

Jmp $+3 ; переход на mov

cld

mov al,1

  1. Регистровый операнд — это просто имя регистра.
  2. Базовый и индексный операнды — используется для косвенной адресации
  3. Структурные операнды - используется для доступа к конкретному элементу сложного типа данных, называемых структурой.

    Записи  — используется для доступа к битовому полю некоторой записи.

Объявив данные нужно уметь обращаться к  ним. Существует множество способов доступа к ним. Сами операнды могут находится в регистрах, в самих командах, в памяти или портах в/в Рассмотрим 7 основных режимов адресации

  1. Регистровая адресация
  2. Непосредственная адресация
  3. Прямая адресация
  4. Косвенная регистровая адресация
  5. Адресация по базе
  6. Прямая адресация с индексированием
  7. Адресация по базе с индексированием

МП по формату записи операнда определяет тип адресации 

    Режимы  адресации
    Формат  операнда
    Регистр сегмента
Регистровый регистр (кроме  ip) Не используется
Непосредственный данные Не используется
Прямой сдвиг метка DS DS
Косвенный регистровый [BX] [BP] [DI] [SI] DS SS DS DS
По  базе [BX]+сдвиг [BP]+ сдвиг DS CS
Прямой  индексированием [DI]+сдвиг [SI]+сдвиг DS DS
По  базе с индексированием [D[][SI]+сдвиг [BX][SI]+сдвиг [BP][SI]+сдвиг [BP][DI]+сдвиг DS DS

SS SS

Информация о работе Лекция по программированию