Программный счетчик ассемблера. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Программный счетчик ассемблера.



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

 

Смещение Имя Операция Операнд Адресный счетчик
00 flda dw 2542h 02
02 fldb db 36h 03
03 fldc dw 212eh 05
05 fldd dd 00000705h 09

 

Начальное значение адресного счетчика - 00. Так как поле flda занимает два байта, то для получения адреса следующего элемента адресный счетчик увеличивается до значения 02. Поле fldb занимает один байт, значит значение адресного счетчика увеличивается до значения 03 и т.д.. Для изменения значения адресного счетчика и соответственно адреса следующего определяемого элемента используется директива org.

 

Формат директивы:

ORG выражение

Выражение может быть абсолютным числом, но не символическим именем, и должно формировать двухбайтовое абсолютное число.

 

(слайд №8)

Рассмотрим следующие элементы данных, определенные непосредственно после поля fldd:

 

Смещение Имя Операция Операнд Адресный счетчик
    org 0 00
00 fldx db ? 01
01 fldy dw ? 02
03 fldz db ? 04
    org $+5 09

 

Первая директива org возвращает адресный счетчик в нулевое значение. Поля fldx, fldy и fldz определяют те же области памяти, что и поля flda, fldb и fldc:

 

Смещение: |   0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  | 8  |

|       |      |        |

flda   fldb   fldc            fldd

|  |         |

fldx  fldy fldz

Операнд, содержащий символ доллара ($), как во второй директиве org, имеет текущее значение адресного счетчика. Таким образом, операнд $+5 устанавливает адресный счетчик равным 04 + 5 = 09, что представляет собой то же значение, что и после определения поля fldd.

Метка fldc указывает на поле длиной в одно слово, находящееся по смещению 03, а метка fldz указывает на однобайтовое поле по тому же смещению:

mov ax,floc       ;Одно слово

mov al,fldz       ;oдин байт

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

 


(слайд №9)

Работа с макросами.

 


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

Использование макрокоманд позволяет:

  1. упростить и сократить исходный текст программы;
  2. сделать программу более понятной;
  3. уменьшить число возможных ошибок кодирования.

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

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

 

(слайд №10)

Простое макроопределение.

 

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

Макроопределение – это программный алгоритм действий макроса, описанный с использованием формальных параметров.

Макрорасширение – это тело макроопределения, сгенерированное компилятором со значениями фактических параметров и подставленное в сегмент кода вместо одноименной макрокоманды.

Макроопределение должно находиться до определения сегмента.

Директива macro указывает ассемблеру, что следующие команды до директивы endm являются частью макроопределения. Директива endm завершает макроопределение. Команды между директивами macro и endm составляют тело макроопределения.

Имена, на которые имеются ссылки в макроопределении должны быть определены где-нибудь в другом месте программы.

Описанная макрокоманда может использоваться в кодовом сегменте там, где необходимо. Когда ассемблер анализирует команду <имя_макроса>, он сначала просматривает таблицу мнемокодов и, не обнаружив там соответствующего элемента, проверяет макрокоманды. Так как программа содержит определение макрокоманды с нужным именем, по которому она вызывается в сегменте кода, ассемблер подставляет тело макроопределения, генерируя необходимые команды - макрорасширение.

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

 

Пример1:

init1 macro

assume                   cs:cseg,ds:dseg,ss:stack;es:dseg

push ds

sub ax,ax

push ax

mov ax,dseg

mov ds,ax

mov es,ax

endm

 

(слайд №11)



Поделиться:


Последнее изменение этой страницы: 2022-09-03; просмотров: 63; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.119.139.87 (0.01 с.)