Разместите нашу кнопку!

Новые статьи:

Programming articles

Создание сайтов на шаблонах

Множество вариантов работы с графикой на канве

Шифруем файл с помощью другого файла

Перехват API функций - Основы

Как сделать действительно хороший сайт

Создание почтового клиента в Delphi 7

Применение паскаля для решения геометрических задач

Управление windows с помощью Delphi

Создание wap сайта

Операционная система unix, термины и понятия

SQL враг или друг

Возникновение и первая редакция ОС UNIX

Оптимизация проекта в Delphi

Ресурсы, зачем нужны ресурсы

Термины программистов 20 века

Советы по созданию собственного сайта с нуля

Шифруем файл с помощью пароля

Фракталы - геометрия природы

Crypt - Delphi программа для шифрования

Рассылка, зачем она нужна и как ее организовать?

Учебник по C++ для начинающих программистов

Уроки для изучения ассемблера

Загадочный тип PCHAR

Средства по созданию сайтов

Операторы преобразования классов is и as

Borland Developer studio 2006. Всё в одном

Создание базы данных в Delphi, без сторонних БД


Software engineering articles



Assembler&Win32. Курс молодого бойца. Урок 6.

Символьные метки

    Одно из преимуществ ассемблера заключается в использовании символьных меток и меток данных (переменных). По сути оба типа меток - это символьные метки. На этом уроке я вам объясню, как надо пользоваться символьными метками и метками данных.
     Начну с более сложного - меток данных. В секции с данными с помощью директив db, dw, dd, dq вы резервируете память под данные соответствующего размера. Но надо неким образом получить доступ к этим данным. Для этого существуют символьные метки переменных. По существу метка возвращает смещение, на котором она находится. Метка виртуальна - в шестнадцатеричных кодах у неё нет эквивалента, она создана только для удобства программиста. При использовании метки под ней подразумевается некоторое смещение, на которую она указывает.
    Пример:
.data
PARAM dd 11223344h

.code
mov eax, [PARAM]
mov [PARAM], ebx
    По определению это правильный метод использования меток. После данных операций регистр eax будет равен 11223344. Но парадокс у операций:

mov eax, PARAM
mov PARAM, ebx

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

     .data
PARAM dw 1122h
PARAM1 db 12h
PARAM2 dd 12345678h

.code

     mov eax,0
     mov ebx, 0
     mov ecx,0
     mov edx, 0
     mov al, byte ptr [PARAM]
     mov bl, [PARAM1]
     mov ecx,[PARAM2]
     mov dx, word ptr [PARAM2]
     mov bh, byte ptr [PARAM2]


    После всех манипуляций состояние регистров будет таким:
     AL = 22
     BL = 12
     ECX = 12345678
     DX = 5678
     BH = 78

    Ещё один пример:

.data

PARAM1 dd 12345678h

.code
     mov ax, 8888h
     mov word ptr [PARAM1], ax
     mov ebx, [PARAM1]
     mov ecx, 0
     mov edx, 0
     mov cx, word ptr [PARAM1+2]
     mov [PARAM1], 089ABCDEFh
     mov dx, word ptr [PARAM1]

    После всех манипуляций состояние регистров будет таким:
     EBX = 12348888
     CX = 1234
     DX = CDEF

     Думаю здесь всё понятно. Размер копируемых данных по умолчанию равен размеру директивы, которая стоит после метки.
    Символьные метки отличаются от меток данных тем, что их можно описывать в любом месте программы. После символьной метки надо ставить двоеточие (как в других языках высокого уровня). Они также возвращают смещение, на котором стоят. Они используются при прыжках (о них расскажу позже), или с командой call. Команда call передаёт управление команде, которая находится на смещении, на которое указывает данная метка. Их также можно использовать вместо меток данных. Но при получении значения или его изменении надо обязательно указывать размер данных.
    Пример:
.data
metka:
PARAM1 dd 12345678h

.code
     mov ecx, 0
     mov ebx, 0
     mov ax, 0BEDAh
     mov word ptr [metka],ax
     mov bx, word ptr [metka]
     mov cx, word ptr [metka+2]
    После этих манипуляций состояние регистров будет такое:
     CX = 1234
     BX = BEDA

     Получение смещения метки.
    Для получения смещения метки есть специальный префикс offset. Вы, наверное, видели использование этого префикса в нашей первой программе. Вот пример использования префикса offset:
.data
PARAM1 dd 12345678h

.code
     mov eax, offset PARAM1 

    После этого в регистре eax будет находиться смещение метки PARAM1. При использовании префикса назначением также может быть ячейка памяти, у следующих команд будет тот же результат что и в первом случае:
     mov [PARAM1], offset PARAM1
     mov eax, [PARAM1]
     Альтернативой префиксу offset является команда lea. Пример:
     .data
metka:
PARAM1 dd 12345678h

.code
     lea eax, metka
    После этого в регистре eax будет находиться смещение метки metka. В команде lea можно получать смещение метки данных. Следующий пример будет иметь тот же результат что и предыдущий: 
     .data
metka:
PARAM1 dd 12345678h

.code
     lea eax, PARAM1

     Подходит к концу шестой урок. На следующем уроке мы узнаем, что такое прыжок: безусловный и условный.