Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Макрокоманды






Директивы Ассемблера I8080

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

Директивы подчиняются стандартному формату операторов Ассемблера, но содержимое их полей имеет некоторые особенности, например, в поле метки директив MACRO, EQU и SET должно обязательно находиться символическое наименование, которое не имеет заключительного двоеточия. В остальных директивах в поле метки может быть необязательная метка, аналогичная меткам машинных команд. Метка директивы относится к ячейке памяти, которая следует сразу же за последней ячейкой предшествующей машинной команды. Операнды директив необязательны.

Директива ORG.Директива ORG (начало) имеет следующий формат:

Метка Код Операнд Комментарий
[метка: ] ORG < выражение> ; Формат директивы ORG

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

При необходимости в программе может быть несколько директив ORG:

Метка Код Операнд Комментарий
  ORG 100H ; Задает абсолютный адрес 0100Н
  LXI H, AREA1 ; Адрес = 0100Н
  LXI D, AREA2 ; Адрес = 0103Н
  MOV A, M ; Адрес = 0106Н
W: ORG 200H ; Задает абсолютный адрес 0200Н
  RAL   ; Адрес = 0200Н
  ANA D ; Адрес = 0201Н

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

Метка Код Операнд Комментарий
  MOV A, M  
  RAL    
  JMP LOWER  
  ORG # +20  
LOWER: ORA A  

Директива END. Формат директивы END выглядит следующим образом:

Метка Код Операнд Комментарий
[метка: ] END   ; Формат директивы END

Эта директива информирует программу-Ассемблер о достижении физического конца входной программы. Разумеется, в каждой программе может быть только одна директива END, находящаяся в последней строке.

Директива EQU. Директива EQU (приравнять, присвоить) прямого присвоения имеет следующий формат:

Метка Код Операнд Комментарий
< имя> EQU < выражение> ; Формат директивы EQU

При выполнении директивы EQU программа-ассемблер присваивает значение выражения символическому наименованию, находящемуся в поле метки. Когда наименование встречается в поле операнда, программа-ассемблер подставляет вместо него присвоенное значение:

Метка Код Операнд Комментарий
MASK: ЕQU 0FH ; Значение MASK равно 15
  ***    
  ANI MASK  
  ***    
  CPI MASK  
  ***    
  MVI A, MASK  
  ***    

 

В командах ANI, CPI, MVI вместо MASK будет фигурировать код 00001111. Если по каким-либо причинам впрограмме нужно изменить значение MASK, для этого достаточно модифицировать операнд одной директив EQU и выполнить повторное ассемблирование программы.

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

 

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

 

Метка Код Операнд Комментарий
NAME SET   ; Значение NAME равно 15
  ***    
  MVI В, NAME ; Загрузка 15 в регистр В
  ***    
NAME SET 1FH ; Значение NAME становится 31
  ***    
  ADI NAME ; Прибавление 31
  ***    
  CPI NAME ; Сравнение с 31
  ***    

 

Директивы IF и ENDIF. Директивы условного ассемблирования IF (если) и ENDIF (конец если) применяются в Ассемблерных программах следующим образом:

 

Метка Код Операнд Комментарий
[метка: ] IF < выражение> ; Директивы условного ассемблирования
  ***    
  Операторы    
  ***    
[метка: ] ENDIF    

 

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

 

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

 

Метка Код Операнд Комментарий
[метка: ] DB < список> ; Формат директивы DB

 

Операнд директивы DB может быть последовательностью выражений, разделенных запятыми и имеющих 8-битные значения, либо цепочкой символов, заключенных в апострофы. При выполнении директивы DB значения выражений или коды символов запоминаются в смежных ячейках (байтах) памяти, начинающихся после ячейки предыдущей команды. Приведем примеры использования директивы DB:

 

Метка Код Операнд Комментарий
ARRAY: DB 3, 7, 15, 31 ; Запоминаются четыре значения
  ***    
  DB ‘HELLO’ ; Запоминаются пять символов
  ***    
       

 

Директива DW. Директива DW (определить слово – 2 байта) также относится к директивам определения и имеет такой же формат, как и директива DB. Однако здесь списком является последовательность выражений, имеющих 16-битные значения. При выполнении директивы DW вычисляется значение первого выражения и его младшие 8 бит запоминаются по текущему адресу, а старшие 8 бит запоминаются по адресу на единицу больше предыдущего. Затем вычисляется значение второго выражения, процедура запоминания повторяется для следующих ячеек памяти и т. д. Приведем примеры с директивой DW.

 

Метка Код Операнд Комментарий
ADDR: DW 0FF00H ; (ADDR) = 00Н,
      ; (ADDR+1) = FFH
DATA: DW 100Н, 200Н ; Инициализируются 4 ячейки

 

Директива DS. Директива DS (определить память) имеет следующий формат:

 

Метка Код Операнд Комментарий
[метка: ] DS < выражение>   ; Формат директивы DS

 

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

 

Метка Код Операнд Комментарий
ARRAY: DS   ; Резервируются 32 ячейки
TABLE: DS   ; Резервируются 64 ячейки

 

Макрокоманды

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

Рассмотрим сначала общие принципы использования макрокоманд на простых примерах. Пусть в прикладной программе несколько раз потребовалось передавать содержимое регистров (D, Е) в указатель стека SP. Одной командой осуществить такую передачу невозможно из-за отсутствия соответствующей команды в системе команд микропроцессора. Необходимая передача реализуется командами XCHG, SPHL. Они не модифицируют больше ни одного внутреннего регистра микропроцессора и не изменяют значений флажков. Определим приведенную последовательность команд как макрокоманду с мнемоникой SPDE:

Метк Код Операнд Комментарий
SPDE MACRO   ; Макрокоманда SPDE
  XCHG   ; Макрокоманда SPDE
  SPHL   ; передает содержимое (D, Е)
  ENDM   ; в указатель стека
  ***    
  SPDE   ; Передача из (D, Е) в SP
  ***    
  SPDE   ; Передача из (D, Е) в SP
  ***    

Отметим, что определяемая мнемоника SPDE фигурирует в поле метки, a MACRO и ENDM являются специальными директивами Ассемблера. После определения макрокоманды SPDE ее можно использовать как обычную команду, помещая в поле мнемоники всякий раз, когда возникает необходимость выполнения передачи SP< =(D, E).

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

Метка Код Операнд Комментарий
SHV MACRO    
LOОР: RRC   ; Макрокоманда SHV
  ANI 7FH ; простого сдвига
  DCR D ; аккумулятора вправо
  JNZ LOOP ; Константа сдвига в регистре D
  ENDM    
       

В следующем фрагменте содержимое ячейки с адресом ITEM сдвигается вправо на 3 бита:

Метка Код Операнд Комментарий
  LDA ITEM ; Загрузка в аккумулятор
  MVI D, 3 ; Задание числа сдвигов
  SHV   ; Сдвиг на 3 бита
  STA ITEM ; Запоминание в памяти

При выполнении данного фрагмента модифицируются значение флажка С (в команде RRC) и содержимое регистра D, являющегося счетчиком сдвигов. Можно расширить возможности макрокоманды SHV, если в определении ее не указывать ни конкретный регистр-счетчик, ни число сдвигов, а задавать их при каждом обращении к макрокоманде или вызове макрокоманды. Такая возможность достигается путем введения макрокоманд с формальными параметрами. Макрокоманда SHV с двумя параметрами (регистр-счетчик REG, число сдвигов VOL) определяется следующим образом:

Метка Код Операнд Комментарий
SHV MACRO REG, VOL ; Пример определения
  MVI REG, VOL ; макрокоманды SHV
LOOP: RRC   ; с двумя параметрами
  ANI 7FH ; (аргументами)
  DCR REG  
  JNZ LOOP  
  ENDM    

Теперь при обращении к SHV в разных местах прикладной программы можно использовать в качестве счетчика любой свободный внутренний регистр и задавать варьируемое число сдвигов. Например, для сдвига содержимого ячейки ITEM на 5 бит с регистром-счетчиком L следует записать:

Метка Код Операнд Комментарий
  LDA ITEM ; Сдвиг содержимого
  SHV L, 5 ; ячейки с адресом
  STA ITEM ; ITEM на пять разрядов вправо

Еще один пример обращения к SHV для сдвига содержимого ячейки VALUE на 2 бита с регистром-счетчиком Е:

Метка Код Операнд Комментарий
  LDA VALUE ; Сдвиг содержимого
  SHV Е, 2 ; ячейки с адресом
  STA VALUE ; VALUE на 2 разряда вправо
       

Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.009 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал