|
Ушел с форума
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 10.11.2013, 18:47 [ТС] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ГЛАВА 6 Допустим, Вы пишете на языке ассемблера компьютерную игрушку. Через какое-то время Вам понадобилось изменить правила игры и повысить или понизить порог очков (100), после превышения которого партия считается оконченной. Число 100 упоминается несколько раз в разных местах Вашего файла, и постоянно менять все операторы довольно хлопотно. Замену нельзя выполнить автоматической командой текстового редактора «найти и заменить», так как число 100 может встречаться в разных местах программы и обозначать не только предел набранных очков. Поэтому лучше всего описать число 100 как константу и в дальнейшем обращаться к ней по имени. В языке ассемблера используют константы, которые подобно переменным имеют имена. Единственное их отличие от переменных заключается в том, что им нельзя присвоить новое значение во время выполнения программы. Имя константы может быть более выразительным и в ряде случаев более коротким, чем ее значение. При многократном использовании такой константы в программе экономится время набора текста программы. Изменение значения именованной константы связано с изменением только одного оператора, тогда как в случае использования числовых значений этой константы такое исправление пришлось бы делать многократно.СИНТАКСИС АССЕМБЛЕРА (часть 3/3) Директивы эквивалентности и присваивания Директива эквивалентности Константы в языке ассемблера описывают с помощью директивы EQU (EQUAL, равно). Синтаксис директивы: <имя> EQU <операнд> Обязательно должны быть указаны имя и операнд, причем только один. Директивой EQU автор программы заявляет, что указанному операнду он дает указанное имя и требует, чтобы все вхождения данного имени в текст программы ассемблер заменял на этот операнд. Например, если есть директива STAR EQU ‘*’, то ассемблер будет рассматривать предложение N DB STAR как предложение N DB ‘*’, другими словами, STAR и ‘*’ — это одно и то же. Директива EQU носит чисто информационный характер и по нему ассемблер ничего не записывает в конечную программу. Поэтому директиву EQU можно ставить в любое место программы. Операнд — имя Если в правой части директивы указано имя регистра, переменной, константы и тому подобное, тогда имя слева объявляется синонимом данного имени и все последующие вхождения в текст программы этого имени-синонима ассемблер будет заменять на имя, указанное справа.Пример:
Операнд — константное выражение Пример:
Например, директива X DB N DUP(?) эквивалентна директивеX DB 100 DUP(?) Случаи, когда полезно применение констант, такие же, как в языках высокого уровня. Например, в качестве констант рекомендуется описывать размеры массивов, поскольку в таком случае легко настроить программу на работу с массивом любого другого размера — для этого достаточно внести изменение лишь в директиву EQU, описывающую константу. Если в константном выражении используются имена других констант, то они (эти константы) должны быть описаны раньше данной директивы EQU, иначе ассемблер, просматривающий текст программы сверху вниз, не сможет вычислить значение этого выражения.Операнд — любой другой текст Пример:
Директива присваивания «=» Синтаксис директивы: <имя> = <константное выражение>Эта директива определяет константу с именем, указанным в левой части, и с числовым значением, равным значению выражения справа. В отличие от констант, определенных по директиве EQU, данная константа может менять свое значение, обозначая в разных частях текста программы разные числа. Пример:
Целочисленные выражения Операнды являются элементарными компонентами, из которых формируется часть машинной команды, обозначающая объекты, над которыми выполняется операция. В более общем случае операнды могут входить в более сложные образования, называемые выражениями. Целочисленные выражения представляют собой комбинации целочисленных значений и операторов, рассматриваемые как единое целое. Результатом целочисленных вычислений выражения может быть адрес некоторой ячейки памяти или некоторое константное (абсолютное) значение. В процессе вычисления выражения получается 32-битное число, в диапазоне от 0 до 0FFFFFFFFh.
В таблице указаны операторы ассемблера в порядке убывания старшинства. Операторы ассемблера в порядке убывания старшинства Значениями константных выражений всегда являются 32-битовые целые числа (исключениями являются директивы DQ, DF, DP, DT, которыми можно явно указывать 32-битовые и более числа).
Константные выражения К простейшим константным выражениям относятся:
X DB (3*K-1)/2 DUP(?) ;массив из 44 байтов Операндами арифметических операторов должны быть константные выражения. Язык ассемблер разрешает вычитать один адрес из другого, в результате Вы получите число, а не адрес. Пример: X DW 1,2,3,4,5 Y DB ? SIZE_X EQU Y-X ;SIZE_X=10 Вычитание адресов используется обычно для определения расстояния (числа байтов) между этими адресами. Результатом действия арифметических операторов на константные выражения будет 32-битное число. Например: 2*80000000h=00000000h а не 100000000h. Адресные выражения Значениями адресных выражений являются 32-битовые адреса.К простейшим адресным выражениям относятся:
B DD $ ;эквивалентно B DD 400104h Чаще всего счетчик размещения используется для вычисления размера памяти занимаемой каким-то массивом. Пример: X DW 40 DUP(?) SIZE_X EQU $-X ;SIZE_X = 80 Здесь $ обозначает адрес первого байта за массивом X, из этого адреса и вычитается начальный адрес массива. Мнемоника команд MMX, SSE, SSE2 Когда разберёшься как по какому принципу строятся мнемонические команды — тогда всё станет легко. Вот что присутствует в мнемонике:SIMD для работы с вещественными числами: [h] — horizontal операции op — код операции [op] — код операции2 для сложных инструкций [L|h] — обозначает какая часть приёмника/источника подвержена операции op: low|high [[L|h]] — если присутствует, то обозначает куда будет помещён результат операции op в зависимости от предыдущей мнемоники. Возможно: L->h, h->L [a|u] — aligned|unaligned. Говорит о требованиях к выравниванию операнда(ов) в памяти: a — выравнивание на границу в 16 байт требуется, u — не требуется [nt] — non temporal. Говорит о некэшируемости операндов в памяти [s|p] — scalar/packed операция op над данными (для h префикса только p) s|d — single/double precision. Размерность данных в операндах. (float/double) [2] — «to». Возникает при операциях op конвертации. [s|p] — scalar/packed вид данных операнда. Возникает 2-й раз в операциях конвертации после «2» [s|d] — single/double precision. Размерность данных в операндах. (float/double). Возникает 2-й раз в операциях конвертации после «2» и вида данных операции op [[h|L]] — high|low. Присутствует, если используется мнемоника DUP (смотри ниже). Указывает расположение данных в операндах источниках для выполнения операции op [dup] — duplicate. Может возникнуть при дублировании частей операндов источников в операнде приёмнике после выполнении операции op Примеры: addps, haddps, addsubpd, movhlps, andps, movaps, movntpd, movshdup... SIMD для работы с целыми числами: [p] — packed. Присутствует всегда за исключением малого количества некоторых операций op [h] — horizontal операции op — код операции [op] — код операции2 в сложных операциях [s|us] — signed|unsigned saturation. Тип насыщение при операции op: знаковое|беззнаковое. Если отсутствует, то без насыщения (wrap around арифметика) [L|h] — low|high. Обозначает, какая часть приёмника/источника подвержена операции op [nt] — non temporal. Говорит о некэшируемости операндов в памяти [b|w|d|q|dq] — byte|word|dword|qword|dqword. Размер упакованных операндов источников [[2]] — «to». Может возникнуть при операции op над данными при разных типах операндов источника и приёмника: MMX и XMM регистров. «2» говорит о направлении действия операции op над данными. Возможно: Q2DQ, DQ2Q [[b|w|d|q|dq]] — byte|word|dword|qword|dqword. Размер упакованных данных операции op. Осуществляется преобразование от меньшей разрядности операций (смотри предыдущую мнемонику) к большей (см. эту). Возможно от b->w, w->d, d->q... Если отсутствует, то размер результата упакованных данных остаётся неизменным (т.е. см. предыдущую мнемонику) [a|u] — aligned|unaligned. Говорит о требованиях к выравниванию операнда(ов) в памяти: a — выравнивание на границу в 16 байт требуется, u — не требуется Примеры: paddb, phsubw, psubusb, punpckhbw, pand, movntdqa, movdqu... Контрольные вопросы
6
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Новые блоги и статьи
|
|||
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|