Система программирования Turbo Pascal






Примеры непосредственных выражений:


const

dec =10;

.....

asm

mov ax, dec 

mov bx,0 

add cx,2*dec+l 

sub dh,- 5 

end;

Все остальные выражения относятся к ссылкам на память. Например:

const

dec: Word = 10; 

Step =12;

var

Х,Y: Byte;

asm

mov ax, dec

mov ex, [Step]

add ah,X mov Y,bl

mov ax,[bx] 

end;

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

В ходе компиляции программы вырабатывается так называемый объектный код, который затем преобразуется компоновщиком в готовую к работе программу. При создании объектного кода компилятор не может вычислить значения выражений типа «ссылка на память», так как не знает окончательного положения в памяти меток, переменных, подпрограмм. В результате он создает так называемое перемещаемое выражение, которое затем компоновщиком преобразуется в нужную ссылку на память.

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

Другое важное отличие ассемблерных выражений от выражений Турбо Паскаля заключается в способе интерпретации переменных. В выражениях Паскаля любая ссылка на переменную интерпретируется как текущее содержимое этой переменной. В ассемблерных выражениях это справедливо только тогда, когда все выражение в целом состоит из имени переменной. Во всех остальных случаях ссылка на переменную интерпретируется как адрес переменной. Например, выражение

х+10

в Паскале означает: «к содержимому переменной X прибавить 10». В ассемблерной команде это означает: .«к адресу (смещению) переменной X прибавить 10». Однако команда

mov ах,X

означает: «поместить в регистр АХ первые два байта переменной X». Если бы нам понадобилось загрузить в АХ адрес переменной X, мы должны были бы написать

mov ax,OFFSET X  

Замечу, что попытка «перехитрить» ассемблер командами типа

mov ax,X+0 mov ax,X+1-1

и т.п. не дает желаемого результата: ассемблер просто загружает в АХ содержимое переменной X.

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

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

Тип

Длина в памяти

BYTE

1

WORD

2

DWORD

4

QWORD

8

TBYTE

10

NEAR

-

FAR

-

Имена предопределенных типов можно использовать для приведения типов выражений. Например, если определены переменные

var

Flag: Boolean; 

X : Word;

то такие ассемблерные выражения недопустимы:

mov Flag,bx 

mov ah,X

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

mov ah,BYTE PTR X 

mov ah,Byte(X) 

mov ah,X.Byte

Во всех случаях в АН будет загружен первый (младший) байт переменной X. Встроенный ассемблер поддерживает операции, перечисленные в следующей таблице (в порядке убывания приоритета).

Операции встроенного ассемблера

Операция

Комментарий

&

Перекрытие идентификатора

0

Подвыражение

[]

Ссылка на память

. (точка)

Селектор структуры

HIGH LOW

Доступ к байту в слове

+ -

Унарные операции задания знака

 

Перекрытие сегмента

OFFSET SEG TYPE PTR *

 

/ MOD SHL SHR

 

+ -

Бинарные операции

NOT AND OR XOR

Операции над битами

Операция &

Осуществляет перекрытие идентификатора: следующий за знаком & идентификатор считается определенным в программе, даже если он совпадает с зарезервированным словом. Например:

var

Ch: Byte;

.......

mov ch,0 {Посылаем 0 в регистр СН} 

mov &Ch,0 {Посылаем 0 в переменную Ch}

Операция 0

Круглые скобки используются обычным для Паскаля образом - для изменения порядка исчисления выражения (подвыражение, ограниченное скобками, вычисляется в первую очередь). Если перед скобками стоит имя типа, все выражение приобретает указанный тип. Например:

mov ах,((1+2)*3+4)*5 {АХ = 65} 

mov bх,1+2*3+4*5 {ВХ = 27}

Операция[]

Определяет ссылку на память. Выражение внутри скобок вычисляется в первую очередь. Обычно оно связывается с регистрами BX, BP ,SI, DI и может использовать операции + и - для указания индексации. Например:

mov ah,100 mov ah,[100]

{АН = 100} {Загружаем в АН содержимое байта по адресу DS-.100}

Операция . (точка)

Селектор элемента структуры. Результат - сумма выражений до и после точки с типом второго выражения. Например: 

var

R: record

X: Word; У: Byte 

end;

.......

mov ax, R. X 

mov R.Y,al

Операции HIGH и LOW

HIGH возвращает старший, a LOW - младший байт выражения типа слова, следующего за символами операции. Выражение должно иметь абсолютное непосредственное значение. Например:

mov al,High $1000 {AL = $10}

Операция : (двоеточие)

Указывает ассемблеру, что выражение после операции должно относиться к сегменту, указанному до операции. Результат - ссылка на память со значением второго выражения. Например:

mov ax, [10] {AX = слово по адресу DS:10} 

mov ax,BS:[10] {АХ = слово по адресу BS:10}

Операция OFFSET

Возвращает смещение выражения, следующего за операцией. Результат имеет непосредственное значение. Например:

mov ах,Х {АХ = слово по адресу переменной X}

mov ax,offset X {АХ = смещение адреса X}

Операция SEG

Возвращает сегмент выражения, следующего за операцией. Результат имеет непосредственное значение.

Операция PTR

Осуществляет приведение типа. Результат - ссылка на память со значением выражения после операции и типом выражения до операции. Например:

Function Swap(X: Integer): Integer;

{Меняет местами байты в слове X}

begin 

asm

mov ax,X

mov BYTE PTR @Result,ah 

mov BYTE PTR @Result+l,al 

end; 

end;

Операции * и /

* - умножение, / - целочисленное деление. Оба выражения должны иметь непосредственные абсолютные значения, такое же значение имеет и результат операции. Например:

mov ax,2*2 {АХ = 4}

mov ах,17/3. {АХ = 5}

Операция MOD

Возвращает остаток от целочисленного деления. Оба выражения должны иметь непосредственные абсолютные значения, такое же значение имеет и результат операции. Например:

mov ах,17 mod 3 {АХ =2}

Операции SHL и SHR

Осуществляют логический сдвиг влево (SHL) или вправо (SHR) выражения, стоящего до операции, на количество разрядов, определяемое выражением после операции. Оба выражения должны иметь непосредственные абсолютные значения, такое же значение имеет и результат операции. Например:

mov ah,1 shl 7 {Ah = $80 = 128}

Бинарная операция +

Осуществляет сложение двух выражений. Выражения могут быть непосредственными значениями или ссылками на память, но только одно из них может быть перемещаемым. Если одно из выражений - ссылка на память, результат также определяет ссылку на память, а если одно из выражений - перемещаемое, результат будет перемещаемым.

Бинарная операция

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

Побитовые операции NOT, AND, OR, XOR

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









Содержание  Назад  Вперед