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

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

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

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

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

LECTS.DOC

— 893.00 Кб (Скачать файл)

                Адресация

    Для получения данных рассмотрим подробнее  все виды адресации

    1- Регистровая и непосредственная адресация.

    При регистровой адресации МП извлекает операнд из регистра(или загружает его в регистр). MOV AX,CX

    Непосредственная   адресация   позволяет  Вам  указывать   8-   или   16-битовое   значение константы в качестве операнда-источника. Эта константа содержится в команде., а не в регистре или в ячейке памяти.. MOV CX,500

    При таком способе адресации необходимо помнить о диапазоне чисел, соответствующих 8-или 16-битовых значений.

    Ассемблер всегда расширяет знак при пересылке  непосредственных значений в операнд-приемник.

    2-  Прямая адресация.

    При прямой адресации исполнительный адрес  является составной частью команды. Обычно прямая адресация применяется, если операндом служит метка.

MOV AX, TABLE

Существует абсолютная и относительная прямая адресация.

    • Относительная прямая адресация. Используется в командах перехода
    • Абсолютная прямая адресация. В этом случае эффективный адрсе является 
      частью машинной команды, но формируется этот адрсе только из значения 
      поля смещения в команде.

            3-  Косвенная регистровая

При косвенной  регистровой адресации исполнительный адрес операнда содержится в базовом регистре BX, в регистре указателя BP или индексном регистре (SI или DI) Косвенные регистровые операнды надо заключать в квадратные скобки, чтобы отличить их от регистровых операндов. MOVAX,[BX]

Для загрузки адреса в BX используется операция OFFSET(смещение) к адресу ячейки

памяти.

MOV BX, OFFSET TABLE

MOVAX,[BX]

            4- Адресация по базе.

При адресации  по базе Ассемблер вычисляет исполнительный адрес с помощью сложения значения сдвига с содержимым регистров BXи BP.

Регистр BX удобно использовать при доступе к структурированным записям данных, расположенным в разных областях памяти. В этом случае базовый адрес помещается в базовый регистр BX и доступ к ее отдельным элементам осуществляется по их сдвигу относительно базы. MOVAX,[BX]+4 MOV AX,4[BP] MOVAX,[BP+4]

          5- Прямая адресация с индексированием.

При прямой адресации  с индексированием исполнительный адрес вычисляется как сумма

значений сдвига и индексного регистра (DI или SI). Этот тип адресации удобен для доступа

к элементам таблицы, когда сдвиг указывает на начало таблицы, а индексный элемент к

элементам таблицы, когда сдвиг указывает на начало таблицы, а индексный регистр - на ее

элемент.

MOV DI,2

MOV AL,B_TABLE[DI]

Загрузится 3-й  элемент таблицы.

          6- Адресация по базе с индексированием

При адресации  по базе с индексированием исполнительный адрес вычисляется как сумма

значений базового регистра, индексного регистра и, возможно, сдвига.

В этом режиме адресации  складывается два отдельных смещения, то он удобен при

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

а значение сдвига и индексного регистра суть смещения по строке и столбцу.

MOV AX,SMECH[BX][DI]

Начальный адрес  в BX, в DI сдвиг блока(номер строки), а SMECH - сдвиг

Примеры:

MOVAX,[BX+2+DI]

MOVAX,[DI+BX+2}

MOVAX,[BX+2][DI]

MOVAX,[BX][DI+2]

Псевдооператор  определения сегмента

Для работы с данными необходимо уметь определять сегменты и данные в них. Пример определения сегмента данных:

DATASEG SEGMENT PARA PUBLIC DATA

ADB?

В DB 10,20,30,40

CDW

DATASEG ENDS

где DATASEG - имя сегмента данных или адрес начала сегмента данных

SEGMENT - псевдооператор определения сегмента

Формат  псеводооператора следующий

имя_сег  SEGMENT [тип подгонки] [тип_связи] ['класс'] [ тип размера памяти]

имя_сег  ENDS

[тип  подгонки] - сообщает компоновщику о том, что нужно обеспечить размещение начала сегмента на заданной границе. Это важно, т.к. при правильном выравнивании доступ к данным в процессорах i80x86 выполняется быстрее. Допустимы следующие значения:

  • BYTE - выравнивание не выполняется. Сегмент может начинаться с любого адреса памяти.
  • WORD - сегмент начинается  по  адресу,  кратному двум,  т.е.  последний (младший) значащий бит физического адреса равен 0 (выравнивание на границу слова)
  • DWORD - сегмент начинается по адресу, кратному четырем, то есть два последних (младших) значащих бита равным 0 (выравнивание на границу двойного слова)
  • PARA - сегмент начинается по адресу кратному 16, т.е. последняя шестнадцатеричная цифра адреса должна быть 0h (выравнивание на границу параграфа)
  • PAGE    -    сегмент    начинается    по    адресу,    кратному    256,    т.е.    две    последние шестнадцатеричные цифры должны быть 00h (выравнивание на границу странице 256 байт)
  • MEMPAGE  -  сегмент начинается  по  адресу,   кратному  4Кбайт,  т.е.   три  последние шестнадцатеричные  цифры  должны  быть  000h  (адрес следующей страницы  памяти размером 4Кбайт).

[тип_связи] (Атрибут комбинирования  сегментов) - сообщает компоновщику, как нужно комбинировать сегменты различных модулей, имеющие одно и то же имя. По умолчанию атрибут комбинирования сегмента принимает значение PRIVATE. Значения атрибутов могут быть:

  • PRIVATE - сегмент не будет объединяться с другими сегментами же именем вне данного модуля.
  • PUBLIC - заставляет компоновщик соединить все сегменты с одинаковым именем. Новый объединенный сегмент будет целым и непрерывным. Все   адреса (смещения) объектов, а это могут быть, в зависимости от типа сегмента, команды или данные, будут вычисляться относительно начала этого нового сегмента.
  • COMMON - располагает все сегменты с одним и тем же именем по одному адресу. Размер полученного в результате сегмента будет равен размер самого большого сегмента.
  • AT xxxx - располагает сегмент по абсолютному адресу параграфа (параграф   - объем памяти,  кратный  16;  поэтому последняя цифра адреса равна 0).  Абсолютный адрес параграфа задается выражением xxx.

    STACK   -   определение   сегмента   стека.    Заставляет   компоновщик   соединять   все одноименные сегменты и вычислять адреса в этих сегментах относительно регистра ss. Регистр sp устанавливается на конец объединенного сегмента стека. Если сегмент стека создан, а комбинированный тип  STACK не используется, программист должен явно загрузить в регистр ss адрес сегмента (подобно регистру ds)

['класс'] - это заключенная в кавычки строка, помогающая компоновщику определить соответствующий порядок следования сегментов при сборке программы из сегментов нескольких модулей. Компоновщик объединяет вместе в памяти все сегменты с одним и тем же именем класса.

[ тип размера памяти] - Для процессоров i80386 и выше сегменты могут быть 16- или 32-разрядными. Это влияет прежде всего на размер сегмента и порядок формирования физического адреса.

  • USE 16 - это означает, что сегмент допускает 16 разрядную адресацию.   (Такой сегмент может содержать до 64Кбайт кода или данных)
  • USE32 - сегмент будет 32 разрядным. При формировании физического адреса может использоваться  32-разрядное смещение.  Поэтому такой сегмент может содержать до 4Гбайт кода или данных.

Существуют упрощенные директивы определения сегмента.

.CODE [ИМЯ] - начало сегмента кода

.DATA - начало сегмента данных

.CONST - начало и продолжение сегмента постоянных данных.

.DATA? - начало и продолжение сегмента неинициализированных данных.

.STACK - начало и продолжение сегмента стека модуля

Псевдооператоры DB, DW, DD

DB - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует один или несколько байт.

Формат:

[имя] DB выражение[,…]

DW - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует двухбайтовые слова.

Формат:

[имя] DW выражение[,…]

DD - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует четырехбайтовые слова.

Формат:

[имя] DD выражение[,…]

DF - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует шестибайтовые слова.

Формат:

[имя] DF выражение[,…]

DP - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует шестибайтовые слова.

Формат:

[имя] DP выражение[,…]

DQ - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует восьмибайтовые слова.

Формат:

[имя] DQ выражение[,…]

DT - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует десятибайтовые слова.

Формат:

[имя] DT выражение[,…]

Пример:

    .DATA

ADB 10

В DB 10 DUP (?)

С DB 4 DUP (0)

DDW?

.CODE

MOV @AX, @DATA

MOVDS,AX

MOV AX, OFFSET A

            Лекция 4. Команды пересылки данных

Эти команды  осуществляют обмен данными и  адресами между регистрами и ячейками памяти или портами ввода-вывода.

К этой группе относятся следующие команды:

MOV<операнд-приемник>,<операнд-источник>

Существуют  ограничения на использования данной команды:

  • Нельзя осуществлять пересылку из одной области памяти в другую. Если возникает такая необходимость,   то   нужно   использовать   в   качестве   промежуточного   буфера  любой доступный в данный момент регистр общего назначения нельзя загрузить в сегментный регистр значение непосредственно из памяти..
  • нельзя  пересылать  содержимое  одного регистра в  другой  сегментный регистр.   Это объясняется тем, что в системе команд нет соответствующего кода операции. Выполнить такую операцию можно  через регистр общего  назначения, mov ax,ds

    mov es,ax

    • нельзя использовать сегментный регистр cs в качестве операнда-приемника. Это объясняется тем, что в паре регистров cs:ip всегда содержится адрес команды, которая должна выполняться следующей. Изменение данного регистра означает фактически операцию перехода, а не команду пересылки.

      Для организации работы со стеком используются следующие команды.

Стек - память организованная по принципу «первым  пришел последним ушел». Чаще всего  стек используется при вызовах процедуры при использовании команды CALL. В этом случае адрес возврата, который извлекается после выполнения процедуры.

Стек  имеет следующую структуру. Адрес  стека находится в указателе  стека sp.  Адрес, который содержится в sp называется вершиной стека. Стек «растет» по направлению к младшим адресам (к ячейке 0), т.е. первое слово помещенное в стек имеет наибольший адрес, следующее на 2 байта ниже. Если нам необходимо получить доступ к элементам не на вершине, а внутри стека, то в этом случае необходимо использовать регистр ebp- это регистр указателя базы кадра стека, где можно записать необходимый адрес стека.

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