Республики казахстан южно-казахстанский экономико-технологический



бет13/15
Дата15.06.2016
өлшемі2.05 Mb.
#137969
түріПрограмма обучения студентов
1   ...   7   8   9   10   11   12   13   14   15

Директива assume определяет назначение сегментов программы сегментным регистрам, т.е. помогает ассемблеру преобразовать метки и адреса, сообщая, каким регистрам сегмента вы будете пользоваться при адресации этих меток. Например, директива:


assume DS:data

говорит ассемблеру, что сегмент data – это сегмент данных, и когда в программе будут использоваться метки из сегмента data, номер блока метки надо извлекать из регистра DS. Но чтобы это работало, надо чтобы в самом начале программы регистр DS указывал на начало сегмента data.

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


Сегмент кодов



16:CS


Сегмент данных



16:DS
1
Сегмент стека
6:SS

На схеме слева указаны значения адресов сегментов. Сегменту кодов отводится регистр CS, сегменту данных – регистр DS или ЕS, сегменту стека – регистр SS.



Директивы определения сегмента.

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

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

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

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

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

******** Встроенный ассемблер Borland Pascal поддерживает три директивы ассемблера:



  1. DB (определить байт),

  2. DW (определить слово),

  3. DD (определить двойное слово).

Каждая из них генерирует данные, соответствующие разделенным запятым операндам, которые следуют за директивой.

Директива DB генерирует последовательность байт. Каждый операнд может представлять собой выражение-константу со значением от -128 до 255, или строку символов любой длины. Выражение-константа генерирует 1 байт кода, а строки генерируют последовательность байт со значениями, соответствующим коду ASCII каждого символа.

Директива DW генерирует последовательность слов. Каждый операнд может представлять собой выражение-константу со значением от -32768 до 65535, или адресное выражение. Для адресного выражения встроенный ассемблер генерирует указатель ближнего типа, что есть слово, содержащие смещения адреса.

Директива DD генерирует последовательность двойных слов. Каждый операнд может представлять собой выражение-константу со значением от -2147483648 до 4294967295 или адресное выражение. Для адресного выражения встроенный ассемблер генерирует указатель дальнего типа, что есть слово, содержащие смещения адреса, за которым следует слово, содержащее сегментную часть адреса.

Данные, генерируемые по директивам DB, DW и DD, всегда записываются в сегмент кода, аналогично коду, генерируемому другими операторами встроенного ассемблера. Чтобы сгенерировать инициализированные или неинициализированные данные в сегменте данных, вам следует использовать обычные описания Паскаля типа var или const.

Приведем некоторые примеры директив DB, DW и DD:



ASM

DB 00FH {1 байт}

DB 0, 99 {2 байта}

DB 'A' {Ord('A’)}

DB 'Пример',0DH,OAH {строка, за которой следуют возврат

каретки и перевод строки}



DB12,"BorlandPascal" {строка Паскаля}

DW 0FFFFH {1 слово}

DW 0,9999 {2 слова}

DW 'A' {эквивалентноDB'A',0}

DW 'BA' {эквивалентно DB'A','B'}

DW MyVar {смещение MyVar}

DW MyProc {смещение MyProc}

DD 0FFFFFFFH {1 двойное слово}

DD 0,99999999 { 2 двойных слова}

DD 'A' {эквивалентноDB'A',0,0,0}

DD 'DBCA' {эквивалентно DS 'A','B','C','D'}

DD MyVar {указатель на MyVar}

DD MyProc {указатель на MyProc}

END;

В Турбо Ассемблере, когда перед идентификатором указывается DB, DW или DD, это приводит к генерации в том месте, где указана директива, переменной размером в байт, слово или двойное слово. Например, Турбо Ассемблер допускает следующее:



ByteVar DB ?

WordVar DW ?

...

mov al, ByteVar

mov bx, WordVar

Встроенный ассемблер не поддерживает такие описания переменных. В Borland Pascal единственным видом идентификатора, который можно определить в операторе встроенного ассемблера, является метка. Все переменные должны описываться с помощью синтаксиса Паскаля, и предыдущая конструкция соответствует следующему:

var

ByteVar: Byte;



WordWat: Word;

.

.



.

asm


mov al,ByteVar

mov bx,WordVar

end;

Операнды


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

Во встроенном ассемблере предопределенный смысл имеют следующие зарезервированные слова:


AH CL FAR SEG

AL CS HIGH SHL

AND CX LOW SHR

AX DH MOD SI

BH DI NEAR SP

BL DL NOT SS

BP DS OFFSET ST

BX DWORD OR TBYTE

BYTE DX PTR TYPE

CH ES WQORD WORD

XOR

Зарезервированные слова всегда имеют больший приоритет, чем определенные пользователем идентификаторы. Например, во фрагменте программы:



var

ch: Char;

...

asm

mov ch,1

end;

1 будет загружаться в регистр CH, а не в переменную CH. Для доступа к определенному пользователем имени нужно использовать амперсанд - операцию переопределения идентификатора (&).



asm

mov &ch,1

end;

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




Достарыңызбен бөлісу:
1   ...   7   8   9   10   11   12   13   14   15




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет