|
Ушел с форума
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
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча
Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове.
Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
|
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
|
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера»
Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит.
Придуман Биллом Госпером в 1970-х, опубликован в. . .
|
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb">
<style>
<!]>
</ style>
<g id="bush">
</ g>
</ svg>
function fn(){
let rost;/ / высота древа
let xx=165,yy=210,w=256;
|
|
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов,
содержащихся в реализации модуля. По-умолчанию все члены модуля доступны:
module Foo
let x = 10
let boo () = printfn "boo"
. . .
|
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible". . .
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|