Синтаксис объявления меток.

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

  • Буквы (от A до Z и от a до z),
  • Цифры (от 0 до 9, не первым символом),
  • Знак вопроса (?)
  • Точка (.) (только первый символ),
  • Знак (@),
  • Подчеркивание (_),
  • Доллар ($)).

Примеры меток: COUNT, PAGE25, $E10.

Cинтаксис FASM не ограничивается объявлением простых меток. Сегодня мы рассмотрим дополнительную директиву для создания меток, а также научимся использовать локальные и анонимные метки. В синтаксисе FASM существует 3 основных способа объявления меток:

1. Имя метки, после которого ставится двоеточие. Это самый простой способ. Обычно так объявляются метки в коде.

exit_app:
    mov ax,4C00h
    int 21h

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

x db 5
y dw 34,1200,?
z rd 1

3. Объявление метки с помощью специальной директивы label. Более сложный, но зато самый гибкий способ. Директива label имеет следующий формат:

label <имя_метки> [размер] [at адрес]

У директивы может быть 3 параметра. Обязательным является только первый параметр — имя метки. Второй параметр — оператор размера (byte, word, dword). Он связывает с меткой размер переменной, аналогично тому, как это делают директивы объявления данных. Далее может быть указан оператор at и адрес метки. Адрес может представлять собой константу, числовое выражение или имя другой метки. Если адрес не указан, то для создания метки используется адрес того места, где она объявлена. Пример:

label m1              ;То же самое, что 'm1:'
label m2 byte         ;Похоже на 'm2 db ?', но память не резервируется
label m3 dword        ;Похоже на 'm3 dd ?', но память не резервируется
                      ;Все 3 метки указывают на один и тот же адрес!

Локальные метки

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

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

Анонимные метки

Анонимная метка — это метка с именем @@. В программе можно объявлять сколько угодно анонимных меток, но обратиться получится только к ближайшей. Для этого существуют специальные имена: вместо @b (или @r) FASM подставляет адрес предыдущей анонимной метки, а вместо @f — адрес следующей анонимной метки. Этого, как правило, достаточно, чтобы реализовать простой цикл, переход или проверку условия. Таким образом можно избавиться от большого количества «неанонимных» меток. Вот пример процедуры с использованием анонимных меток:

;Процедура преобразования десятичной строки в слово без знака
;  вход: AL - длина строки
;        DX - адрес строки, заканчивающейся символом CR(0Dh)
; выход: AX - слово (в случае ошибки AX = 0)
;        CF = 1 - ошибка
str_to_udec_word:
    push cx                 ;Сохранение всех используемых регистров
    push dx
    push bx
    push si
    push di
 
    mov si,dx               ;SI = адрес строки
    mov di,10               ;DI = множитель 10 (основание системы счисления)
    movzx cx,al             ;CX = счётчик цикла = длина строки
    jcxz .error             ;Если длина = 0, возвращаем ошибку
    xor ax,ax               ;AX = 0
    xor bx,bx               ;BX = 0
 
@@: mov bl,[si]             ;Загрузка в BL очередного символа строки
    inc si                  ;Инкремент адреса
    cmp bl,'0'              ;Если код символа меньше кода '0'
    jl .error               ; возвращаем ошибку
    cmp bl,'9'              ;Если код символа больше кода '9'
    jg .error               ; возвращаем ошибку
    sub bl,'0'              ;Преобразование символа-цифры в число
    mul di                  ;AX = AX * 10
    jc .error               ;Если результат больше 16 бит - ошибка
    add ax,bx               ;Прибавляем цифру
    jc .error               ;Если переполнение - ошибка
    loop @b                 ;Команда цикла
    jmp @f                  ;Успешное завершение (здесь всегда CF = 0)
 
.error:
    xor ax,ax               ;AX = 0
    stc                     ;CF = 1 (Возвращаем ошибку)
 
@@: pop di                  ;Восстановление регистров
    pop si
    pop bx
    pop dx
    pop cx
    ret

Советую локальные и анонимные метки использовать везде, где только возможно. Они делают код программы более понятным и не захламляют пространство имён.

 
Поделиться в facebook
Facebook
Поделиться в twitter
Twitter
Поделиться в vk
VK
Поделиться в google
Google+
Поделиться в email
Email

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Группа в VK

Помощь проекту

Обнаружили опечатку?

Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!

Свежие статьи

Похожие статьи

Команды работы с битами.

Команды работы с битами.

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

 
Основы создания макросов в Assembler.

Основы создания макросов в Assembler.

Макросы — это шаблоны для генерации кода. Один раз создав макрос, можно использовать его во многих местах в коде программы. Макросы делают процесс программирования на

 
Локальные переменные.

Локальные переменные.

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

 
Передача параметров через стек.

Передача параметров через стек.

В предыдущих уроках все параметры передавались процедурам через регистры. В этой статье мы рассмотрим другой способ — передачу параметров через стек. Часто этот способ оказывается

 

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: