Студопедия

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

Разделы сайта

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






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Макрокоманды






    Директивы Ассемблера 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 разряда вправо
           





    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.