Dd определение данных


Директивы определения данных

Языки высокого уровня обычно являются типизированными. Каждая переменная имеет тип, который накладывает ограничения на операции над переменной и на использование в одном выражении переменных разных типов. Кроме того, языки высокого уровня позволяют работать со сложными типами, таким как указатели, записи/структуры, классы, массивы, строки, множества и т.п.

Язык Паскаль имеет достаточно жёсткую структуру типов. Присваивания между переменными разных типов минимальны, над указателями определены только операции присваивания, взятия значения и получение адреса. Поддерживается много сложных типов.

Язык С, который создавался как высокоуровневая замена языку ассемблера, имеет гораздо менее жёсткую структуру типов. Все целочисленные типы совместимы, тип char, конечно, хранит символы, но также сопоставим с целыми типами, логический тип отсутствует в принципе (для языка С это именно так!), над указателями определены операции сложения и вычитания. Сложные типы, такие как массивы, строки и множества, не поддерживаются.

Что касается языка ассемблера, то тут вообще вряд ли можно говорить о какой-либо структуре типов. Команды языка ассемблера оперируют объектами, существующими в оперативной памяти, т.е. байтом и его производными (слово, двойное слово и т.д.). Символьный, логический тип? Какая глупость! Указатели? Вот тебе 4 байта и делай с ними, что хочешь. В итоге, конечно, и можно сделать, что хочешь, только предварительно стоит хорошо подумать, что из этого получится.

Соответственно, в языке ассемблера существует 5 (!) директив для определения данных:

  • DB (define byte) – определяет переменную размером в 1 байт;
  • DW (define word) – определяет переменную размеров в 2 байта (слово);
  • DD (define double word) – определяет переменную размером в 4 байта (двойное слово);
  • DQ (define quad word) – определяет переменную размером в 8 байт (учетверённое слово);
  • DT (define ten bytes) – определяет переменную размером в 10 байт.

Все директивы могут быть использованы как для объявления простых переменных, так и для объявления массивов. Хотя для определения строк, в принципе, можно использовать любую директиву, в связи с особенностями хранения данных в оперативной памяти лучше использовать директиву DB.

Синтаксис директив определения данных следующий:

Операнд задаёт начальное значение переменной. В качестве операнда может использоваться число, символ или знак вопроса, с помощью которого определяются неинициализированные переменные.

Если в качестве операнда указывается строка или если указано несколько операндов через запятую, то память отводится под несколько переменных указанного типа, т.е. получается массив. При этом именованным оказывается только первый элемент, а доступ к остальным элементам массива осуществляется с помощью выражения + .

Для того чтобы не указывать несколько раз одно и то же значение, при инициализации массивов можно использовать конструкцию повторения DUP.

a db 10011001b ; Определяем переменную размером 1 байт с начальным значением, заданным в двоичной системе счисления

b db ‘!’ ; Определяем переменную в 1 байт, инициализируемую символом ‘!’

d db ‘string’,13,10 ; Определяем массив из 8 байт

e db ‘string’,0 ; Определяем строку из 7 байт, заканчивающую нулём

f dw 1235o ; Определяем переменную размером 2 байта с начальным значением, заданным в восьмеричной системе счисления

g dd -345d ; Определяем переменную размером 4 байта с начальным значением, заданным в десятичной системе счисления

h dd 0f1ah ; Определяем переменную размером 4 байта с начальным значением, заданным в шестнадцатеричной системе счисления

i dd ? ; Определяем неинициализированную переменную размером 4 байта

j dd 100 dup (0) ; Определяем массив из 100 двойных слов, инициализированных 0

k dq 10 dup (0, 1, 2) ; Определяем массив из 30 учетверённых слов, инициализированный повторяющимися значениями 0, 1 и 2

l dd 100 dup (?) ; Определяем массив из 100 неинициализированных двойных слов

К переменным можно применить две операции – offset и type. Первая определяет адрес переменной, а вторая – размер переменной. Однако размер переменной определяется по директиве, и даже если с директивой, например, DD определён массив из нескольких элементов, размер всё равно будет равен 4.

Команды

Команды языка ассемблера – это символьная форма записи машинных команд. Команды имеют следующий синтаксис:

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

Метки нужны для ссылок на команды из других мест, например, в командах перехода. Компилятор языка ассемблера заменяет метки адресами команд.

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

Операнды команды, если они есть, отделяются друг от друга запятыми.

Операнды команд

В качестве операндов команд языка ассемблера могут использоваться:

  • регистры, обращение к которым осуществляется по именам;
  • непосредственные операнды – константы, записываемые непосредственно в команде;
  • ячейки памяти – в команде записывается адрес нужной ячейки.

Для задания адреса существуют следующие возможности.

  • Имя переменной, по сути, является адресом этой переменной. Встретив имя переменной в операндах команды, компилятор понимает, что нужно обратиться к оперативной памяти по определённому адресу. Обычно адрес в команде указывается в квадратных скобках, но имя переменной является исключением и может быть указано как в квадратных скобках, так и без них. Например, для обращения к переменной x в команде можно указать x или [x].
  • Если переменная была объявлена как массив, то к элементу массива можно обратиться, указав имя исмещение. Для этого существует ряд синтаксических форм, например: [ ] и[ + ] (см. раздел 5). Однако следует понимать, что смещение – это вовсе не индекс элемента массива. Индекс элемента массива – это его номер, и этот номер не зависит от размера самого элемента. Смещение же задаётся в байтах, и при задании смещения программист сам должен учитывать размер элемента массива.
  • Адрес ячейки памяти может храниться в регистре. Для обращения к памяти по адресу, хранящемуся в регистре, в команде указывается имя регистра в квадратных скобках, например: [ebx]. Как уже говорилось, в качестве регистров базы рекомендуется использовать регистры EBX, ESI, EDI и EBP.
  • Адрес может быть вычислен по определённой формуле. Для этого в квадратных скобках можно указывать достаточно сложные выражения, например, [ebx + ecx] или [ebx + 4 * ecx].

В описаниях команд языка ассемблера для обозначения возможных операндов используют сокращения, состоящие из буквы r (для регистров), m (для памяти) или i (для непосредственного операнда) и числа 8, 16 или 32, указывающего размер операнда. Например:

add r8/r16/r32, r8/r16/r32 ; Сложение регистра с регистром

add r8/r16/r32, m8/m16/m32 ; Сложение регистра с ячейкой памяти

add r8/r16/r32, i8/i16/i32 ; Сложение регистра с непосредственным операндом

add m8/m16/m32, r8/r16/r32 ; Сложение ячейки памяти с регистром

add m8/m16/m32, i8/i16/i32 ; Сложение ячейки памяти с непосредственным операндом

Команды языка ассемблера обычно имеют 1 или 2 операнда, или не имеют операндов вообще. Во многих, хотя не во всех, случаях операнды (если их два) должны иметь одинаковый размер. Команды языка ассемблера обычно не работают с двумя ячейками памяти.


Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Да какие ж вы математики, если запаролиться нормально не можете. 8426 — | 7330 — или читать все.

Директивы определения данных

Читайте также:

  1. C. Производят обработку данных.
  2. II ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
  3. VI. Вопросы для определения законченности стратегии
  4. А3. Ввести данные об отпуске материала в базу данных, распечатать оборотные ведомости.
  5. Алгоритм определения валютно-правового статуса ценных бумаг
  6. Анализ данных в Excel
  7. Анализ данных и подготовка заключительного доклада
  8. Анализ данных и подготовка заключительного отчета
  9. Анализ данных по землевладению
  10. Анализ данных с помощью команд Подбор параметра и Поиск решения
  11. Анализ данных. Подбор параметра, поиск решения в табличном процессоре.
  12. Анализ исходных данных по надфундаментной конструкции

Для описания переменных в языке ассемблера использу­ются директивы определения данных.

Директива DB(Define Byte, определить байт) определяет данные разме­ром в байт:

Встречая директиву DB, ассемблер вычисляет операнды и записывает их значения в последовательные байты памяти. Первому из байтов дается имя, по которому на него можно потом ссылаться.

Существует два основных способа задания операндов директивы DB:

— неинициализированное начальное значение ? (знак неопределенного значения);

— константное выражение со значением от -128 до 255.

По этой директиве переменной X отводится один байт памяти, в который ничего не записывается. Ассемблер запомнит адрес переменной и когда он встретится в тексте, заменит его на дан­ный адрес (выполнит трансляцию имен). Адрес ячейки, выделенной переменной с именем X, принято называть значе­нием имени X (в отличие от содержимого ячейки по этому адресу).

По описанию переменной ассемблер определяет, сколько байт занимает переменная в памяти. Этот размер называется типом переменной. Значение (адрес) и тип (размер) переменной однозначно определяют ячейку, обозна­чаемую именем.

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

Значением оператора является размер (в байтах) ячейки, выделенной под переменную с указанным именем. Если переменная описана по директиве DB, то для ее имени значение оператора равно 1. В языке ассемблера есть стандартная константа с именем BYTE и значением 1:

ТУРЕ X = BYTE = 1

Для определения переменной с начальным значением в качестве операнда в директиве DB указывается выражение, которое ассемблер вычислит, и значение которого запишет в ячейку памяти. В наиболее распространенном случае начальное значение байтовой переменной задается в виде числа с величиной от -128 до 255:

В DB -2 ; 0FEh (256-2=254)

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

В качестве начального значения перемен­ной можно указать символ, записав его чис­ловой код, либо сам символ в кавычках. Например, в кодировке ASCII код символа «*» равен 2Ah, поэтому следующие две директивы эквивалентны:

Во втором случае ассемблер определит код символа и запишет его в ячейку памяти.

С помощью директивы DB можно описать двоично-десятичные числа:

PACK DB 01h, 23h ; число 123 в упакованном формате

UNPACK DB 1, 2, 3 ; число 123 в неупакованном формате

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

Другим более удобным способом описания является применение ASCII-чисел – записи чисел в виде символьных строк (например, ‘123’). В кодировке ASCII символьные цифры от ‘0’ до ‘9’ имеют коды от 30h до 39h. Поэтому преобразования таких символьных чисел в двоично-десятичные выполняется путем выделения младшего полубайта кода, а обратное преобразование – путем сложением с 30h.

С помощью директивы DB можно описать массив. Например, байтовый массив A из 8 элементов с начальным значением 0 для каждого из них можно определить так:

A db 0, 0, 0, 0, 0, 0, 0, 0

Директиву можно записать иначе:

В качестве операнда здесь использована конструкция повторе­ния, в которой сначала указывается коэффициент повторения, а затем служебное слово DUP (duplicate, копировать) и в круглых скобках повторяемая величина:

k — константное выражение с положительным значением, n ³ 1;

рi — любой допустимый операнд директивы DB (возможна вновь конструкция повторения).

Данная запись является сокращением для k раз повторенной последовательности указанных в скобках операндов.

Вложенность конструкций DUP позволяет задать многомерные массивы. Например, байтовая матрица А размера 5×10 (10 байт в строке, 5 строк) имеет вид:

A DB 5 DUP(10 DUP(?))

Директива DW(Define Word, определить слово) определяет переменную размером в слово.

Рассмотрим допустимые виды ее операндов.

Определение неинициализированной переменной:

В примере ассемблер отводит под переменную А слово памяти и переменная не получает начального значе­ния. Тип переменной равен 2, т.е. занимает два байта.

В языке ассемблера есть стандартная константа с именем WORD и значением 2:

TYPE а = WORD = 2

Операндом директивы может быть константное выражение со значением от -32768 до 65535.

Под переменную B отводится слово памяти, и в ячейку записывается число, которые становится ее начальным значени­ем. Как для директивы DB, неотрицательные числа записываются в память как числа без знака, а отрицательные числа – в дополнительном коде. Поэтому числа, которые могут быть заданы как операнды директивы DW, должны быть в диапазоне [-2 15 , 2 16 -1]. Числа размером в слово хранятся в памяти в обратном порядке.

В качестве операнда директивы DW может быть указано адресное выражение, т.е. выражение, значением которого является адрес:

В примере ассемблер запишет в слово, выделенное, под переменную B, адрес переменной A, который становится начальным значением переменной B.


В правой части директивы DW можно указать любое число операндов, а также конструкцию повторения:

Директива DD(Define Double Word, определить двойное слово) определяет переменную, под которую отводится двойное слово. Пере­менная имеет тип DWORD (значением константы является число 4).

Определение неинициализированной переменной:

Под переменную А выделяется двойное слово и переменная А не получает начального значения.

Операндом директивы может быть константное выражение со значение от -2 31 до 2 32 -1.

Переменная В получает начальное значение, причем это зна­чение ассемблер записывает в память в обратном порядке.

Операндом директивы может быть число в диапазоне от -2 15 до 2 16 -1. Все выражения вычисляются в области 16-битовых чисел (по модулю 2 16 ). Например, по директиве:

A DD 8000h+8002h

начальным значением переменной A будет число 2, а не число 10002h.

В качестве операнда директивы DD может быть указано адресное выражение. В этом случае операнд определяет абсолютный адрес.

Конструкция повторения DUP:

DW 10 DUP(?), 12345h

Директива эквивалентности EQU(Equal, равно) позволяет определить константу и имеет следующий синтаксис:

Директива аналогична описанию константы в языке Паскаль. Она определяет, что операнду дается имя, и требует, чтобы все вхождения имени в текст программы ассемблер заменял на этот операнд. Директива EQU носит информационный характер, по ней ассемблер ничего не записывает в машинную программу. Поэтому директиву EQU можно использовать в любом месте программы.

Если в правой части директивы указано имя регистра, переменной или константы, тогда имя слева объявляется синонимом данного имени и все последующие вхождения в текст программы этого имени-синонима ассемблер будет заменять на имя, указанное справа, например:

C DW В ; эквивалентно С DW A

Имена-синонимы обычно используются для введения обозначений. Например, если регистр аккумулятора используется для хранения суммы, то его можно обозначить как SUM:

и далее использовать более наглядное имя.

Операндом директивы EQU может быть константное выражение, например:

Если в правой части директивы EQU находится константное выражение, тогда указанное слева имя принято называть именем константы. Значением такой константы объявляется значение выражения. Например, N – константа со значением 100, К – со значением 199. Все последующие вхождения в текст имени константы ассемблер будет заменять на значение этой константы.

Операндом может быть любой текст:

Именно на этот текст будет заме­няться каждое вхождение данного имени в программу. Такой вариант директивы EQU обычно используется, чтобы ввести более короткие обозначения для часто встречающихся длинных текстов.

Директива присваиванияопределяет константу с именем, указанным в левой части и с числовым значением, равным значению выражения справа:

Илон Маск рекомендует:  Что такое код fdf_close

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

A DW C ; эквивалентно A DW 10

В DB C ; эквивалентно В DB 12

Дата добавления: 2014-11-16 ; Просмотров: 2497 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Диаграмма описания данных (DD)

Диаграмма описания данных (DD) служат для определения структуры данных, передаваемых вдоль маршрута взаимодействия. Диаграмма описания данных связана с конкретной СО диаграммой и может содержать описание одного или нескольких типов данных.

DD диаграммы могут использоваться для указания типов данных.

Запись отображает совокупность компонентов различных типов данных, которые структурированы и сгруппированы по наименованиям полей. В диаграмме описания данных, построенной для этой задачи (см. рис. 2) располагается 4 записи. Каждая запись имеет свое наименование:

Каждая запись, например, группа студентов имеет наименование полей код группы, название, курс, семестр. Каждое поле характеризуется своим типом — числовым, текстовым и т.д.

Тип полей — текстовый имеют поля такие как, например, название и т.д. для записи группа студентов. Тип полей — числовой имеют, как правило, такие поля как курс, кол-во часов и т.п.

модель данные access запрос

Рисунок 2. Диаграмма описания данных (DD)

3. Установление отношений

Таблицы связаны между собой таким образом, что информация из одной таблицы доступна для другой. Эти отношения устанавливаются за счет того, что в разных таблицах содержатся поля с одинаковыми значениями. Необязательно, чтобы имена соответствующих полей были одинаковыми; достаточно соблюдать однозначное соответствие значений. Для того чтобы установить отношения между таблицами, необходимо установить связи между теми полями, в которых содержится общая информация.

Рисунок 3. Отображения связей между таблицами базы данных

Каскадное обновление связанных полей.

Опция дает возможность изменять содержимое поля связи. Если изменить содержимое ключевого поля в первичной таблице, Access проверяет корректность значения в этом поле (в первичной таблице не должно быть одинаковых записей) и изменяет значения соответствующих полей во всех связанных таблицах. Таким образом, изменение значений ключевого поля в первичной таблице распространяется на все связанные таблицы.

Каскадное удаление связанных записей.

Опция дает возможность удалять записи в связанных таблицах при удалении соответствующей записи в первичной таблице. При удалении записи в первичной таблице сначала Access удалит все связанные с ней записи в дочерних таблицах, а затем запись в первичной таблице. Эта опция очень полезна при удалении серий связанных данных.

Assembler

Изучение с «нуля»


О комментариях

Поиск

Архив блога

  • ▼2009 (47)
    • ►апреля (1)
    • ▼мая (31)
      • А на каком основании?
      • Разговор по понятиям
      • Сегментная адресация памяти
      • Регистры процессора 8086
      • Архитектура ЭВМ
      • Первый шаг
      • Второй шаг
      • Ассемблер Ы :)
      • Установка и настройка
      • Синтаксис ассемблера
      • Практика ассемблирования
      • Здравствуйте, я ваша тётя!
      • Точка входа
      • Hello Turbo Debugger :)
      • Игры с Turbo Debagger
      • Вспоминаем первый шаг
      • Синтаксис ассемблера. Метки
      • Синтаксис ассемблера. Директива SEGMENT
      • Синтаксис ассемблера. Директива ASSUME
      • Игры с сегментами
      • Опять игры с сегментами
      • Директива MODEL
      • Goodbye debugger :)
      • И снова «Здравствуй МИР!»
      • Стек
      • Директивы END, PROC, ENDP
      • Стек и подпрограммы
      • Игры со стеком
      • Опять играем со стеком
      • Представление данных
      • Описание данных
    • ►июня (15)

Линки

Ярлыки

  • антиотладка (1)
  • архитектура эвм (1)
  • данные сложного типа (4)
  • двоичная система (1)
  • директива ASSUME (1)
  • директива END (1)
  • директива >(1)
  • директива LABEL (1)
  • директива MODEL (2)
  • директива PROC (1)
  • директива RECORD (1)
  • директива REPT (1)
  • директива SEGMENT (5)
  • директива STRUC (1)
  • директива UNION (1)
  • директивы описания данных (6)
  • книги по ассемблеру (1)
  • косвенная адресация (1)
  • косвенная адресация со смещением (1)
  • метки (1)
  • непосредственная адресация (1)
  • оператор mask (1)
  • оператор w >(1)
  • подпрограммы (2)
  • практика ассемблирования (3)
  • практика отладки (4)
  • практика программирования (9)
  • прямая адресация (1)

  • реальный режим (1)
  • регистровая адресация (1)
  • регистры процессора 8086 (1)
  • режимом реального адреса (1)
  • сегментная адресация (1)
  • синтаксис ассемблера (11)
  • системы счисления (1)
  • способы адресации (6)
  • точка входа (1)
  • установка (1)
  • шестнадцатеричная система (1)
  • assemblers (1)
  • BCD (2)
  • binary-coded decimal (2)
  • debug.exe (2)
  • masm 6.15 (2)
  • Program Segment Prefix (1)
  • PSP (1)
  • R-режим (1)
  • Real Address Mode (1)
  • stack (4)
  • tasm 5.0 (2)
  • Turbo Debagger 5.0 (2)

Описание данных

Практически любая программа содержит в себе перечень данных, с которыми она работает. Это могут быть символьные строки, предназначенные для вывода на экран; числа, определяющие ход выполнения программы или участвующие в вычислениях; адреса подпрограмм, обработчиков прерываний или просто тех или иных полей программы; специальные коды, например, коды цвета выводимых на экран символов и т.д. Кроме данных, определяемых в тексте программы, в программу часто входят зарезервированные поля, предназначенные для заполнения по ходу выполнения программы, например, результатами вычислений или путем чтения из файла. Все эти данные и зарезервированные поля должны быть определены в составе сегмента данных программы (в принципе они могут быть определены, и часто определяются, не в сегменте данных, а в сегменте команд, но здесь мы не будем касаться этого вопроса).

Формат описания данных:

[имя] Dn выражение

Имя элемента данных не обязательно (это указывается квадратными скобками), но если в программе имеются ссылки (обращения) на некоторый элемент, то это делается посредством имени .
Имена данных могут включать латинские буквы, цифры ( не в качестве первого знака имени ) и некоторые специальные знаки, например, знаки подчеркивания (_), доллара ($) и коммерческого at (@). Длину имени некоторые ассемблеры ограничивают (например, ассемблер MASM — 31 символом), другие — нет, но в любом случае слишком длинные имена затрудняют чтение программы. С другой стороны, имена данных следует выбирать таким образом, чтобы они отражали назначение конкретного данного, например counter для счетчика или filename для имени файла:

counter dw 10000
filename db ‘a:\myfile.001’

Для определения данных используются, главным образом, три директивы ассемблера: db ( define byte , определить байт) для записи байтов, dw ( define word , определить слово) для записи слов и dd ( define double , определить двойное слово) для записи двойных слов. Кроме перечисленных, имеются и другие директивы, например df ( define fanvord , определить поле из 6 байт), dq ( define quadword , определить четверное слово) или dt ( define tcraword , определить 10-байтовую переменную), но они используются значительно реже.

Выражение может содержать числовое данное , например:

или знак вопроса для неопределенного значения, например

Выражение может содержать несколько числовых данных , разделенных запятыми и ограниченными только длиной строки:

FLD3 DB 11, 12, 13, 14, 15, 16, .

Ассемблер определяет эти данные в виде последовательности смежных байт. Ссылка по имени FLD3 указывает на первое число, 11, по FLD3+1 — на второе, 12. (FLD3 можно представить как FLD3+0). Например команда

загружает в регистр AL значение 14 (шест. 0E).

Выражение допускает также повторение константы в следующем формате:

[имя] Dn число-повторений DUP (выражение)

Следующие три примера иллюстрируют повторение:

DW 10 DUP(?) ;Десять неопределенных слов
DB 5 DUP(14) ;Пять байт, содержащих шест.14
DB 3 DUP(4 DUP(8));Двенадцать восьмерок

В третьем примере сначала генерируется четыре копии десятичной 8 (8888), и затем это значение повторяется три раза, давая в результате двенадцать восьмерок.

Выражение может содержать символьную строку или числовое данное .

Символьная строка используется для описания данных, таких как, например, имена людей или заголовки страниц. Содержимое строки отмечается одиночными кавычками, например, ‘PC’ или двойными кавычками — «PC». Ассемблер переводит символьные строки в объектный код в обычном формате ASCII. Символьная строка определяется только директивой DB , в которой указывается более два или более символов в нормальной последовательности слева направо. Следовательно, директива DB представляет единственно возможный формат для определения символьных данных.

Числовое данное используются для арифметических величин, для адресов памяти и т.п. Ассемблер преобразует все числовые данные в шестнадцатеричные и записывает байты в объектном коде в обратной последовательности — справа налево.
Значения числовых данных можно записывать в формате различных систем счисления ; чаще других используются десятичная и шестнадцатеричная запись:


size dw 256 ;В ячейку size записывается
;десятичное число 256
setb7 db 80h ;В ячейку setb7 записывается
;16-ричное число 80h

Необходимо отметить неточность приведенных выше комментариев. В памяти компьютера могут храниться только двоичные коды. Если мы говорим, что в какой-то ячейке записано десятичное число 128, мы имеем в виду не физическое содержимое ячейки, а лишь форму представления этого числа в исходном тексте программы. В слове с именем size фактически будет записан двоичный код 0000000100000000, являющийся двоичным эквивалентом десятичного числа 256. Во втором случае в байте с именем setb7 будет записан двоичный эквивалент шестнадцатеричного числа 80h, который составляет 10000000 (т.е. байт с установленным битом 7, откуда и получила имя эта ячейка).

Форматы записи числовых данных

Десятичный формат допускает десятичные цифры от 0 до 9 и обозначается последней буквой D , которую можно не указывать , например, 125 или 125D. Несмотря на то, что ассемблер позволяет кодирование в десятичном формате, он преобразует эти значения в шестнадцатеричный объектный код. Например, десятичное число 125 преобразуется в 7Dh.

Шестнадцатеричный формат допускает шестнадцатеричные цифры от 0 до F и бозначается последней буквой H . Так как ассемблер полагает, что с буквы начинаются идентификаторы, то первой цифрой шестнадцатеричного данного должна быть цифра от 0 до 9. Например, 2EH или 0FFFH, которые ассемблер преобразует соответственно в 2E и FF0F (байты во втором примере записываются в объектный код в обратной последовательности).

Двоичный формат допускает двоичные цифры 0 и 1 и обозначается последней буквой B . Двоичный формат обычно используется для более четкого представления битовых значений в логических командах AND, OR, XOR и TEST.

Восьмеричный формат допускает восьмеричные цифры от 0 до 7 и обозначается последней буквой Q или O, например, 253Q. На сегодня восьмеричный формат используется весьма редко.

При записи символьных и числовых данных следует помнить, что, например, символьная строка, определенная как DB ’12’, представляет символы ASCII и генерирует шестнадцатеричное значение 3132h, а числовое данное, определенное как DB 12, представляет десятичное число и генерирует шестнадцатеричное 0Ch.

Присвоение данным символических имен позволяет обращаться к ним в программных предложениях, не заботясь о фактических адресах этих данных. Например, команда

занесет в регистр АХ содержимое ячейки size (число 256), независимо от того, в каком месте сегмента данных эта ячейка определена, и в какое место физической памяти она попала. Однако программист, использующий язык ассемблера, должен иметь отчетливое представление о том, каким образом назначаются адреса ячейкам программы, и уметь работать не только с символическими обозначениями, но и со значениями адресов. Для обсуждения этого вопроса рассмотрим пример сегмента данных, в котором определяются данные различных типов. В левой колонке укажем смещения данных (в шестнадцатеричной форме), вычисляемые относительно начала сегмента.

data segment
0000h counter dw 10000
0002h pages db «Страница 1»
000Ch numbers db 0, 1, 2, 3, 4
0011h page_addr dw pages
data ends

Сегмент данных начинается с данного по имени counter, которое описано, как слово (2 байт) и содержит число 10000. Очевидно, что его смещение равно 0. Поскольку это данное занимает 2 байт, следующее за ним данное pages получило смещение 2. Данное pages описывает строку текста длиной 10 символов и занимает в памяти столько же байтов, поэтому следующее данное numbers получило относительный адрес 2 + 10 = 12 = Ch. В поле numbers записаны 5 байтовых чисел, поэтому последнее данное сегмента с именем page_addr размещается по адресу Ch + 5 = 11h.
Ассемблер, начиная трансляцию сегмента (в данном случае сегмента данных) начинает отсчет его относительных адресов. Этот отсчет ведется в специальной переменной транслятора (не программы!), которая называется счетчиком текущего адреса и имеет символическое обозначение знака доллара ($). По мере обработки полей данных, их символические имена сохраняются в создаваемой ассемблером таблице имен вместе с соответствующими им значениями счетчика текущего адреса. Другими словами, введенные нами символические имена получают значения, равные их смещениям. Таким образом, с точки зрения транслятора counter равно 0, pages — 2, numbers — Ch и т.д. Поэтому предложение

page_addr dw pages

трактуется ассемблером, как

и приводит к записи в слово с относительным адресом 11h числа 2 (смещения строки pages).

Приведенные рассуждения приходится использовать при обращении к «внутренностям» объявленных данных. Пусть, например, мы хотим выводить на экран строки «Страница 2», «Страница 3», «Страница 4» и т.д. Можно, конечно, все эти строки описать в сегменте данных по отдельности, но это приведет к напрасному расходу памяти. Экономнее поступить по-другому: выводить на экран одну и ту же строку pages, но модифицировать в ней номер страницы. Модификацию номера можно выполнить с помощью, например, такой команды:

Здесь мы «вручную» определили смещение интересующего нас символа в строке, зная, что все данные размещаются ассемблером друг за другом в порядке их объявления в программе. При этом, какое бы значение не получило имя pages, выражение pages + 9 всегда будет соответствовать байту с номером страницы.
Таким же приемом можно воспользоваться при обращении к данному numbers, которое в сущности представляет собой небольшой массив из 5 чисел. Адрес первого числа в этом массиве равен просто numbers, адрес второго числа — numbers + 1, адрес третьего — numbers + 2 и т.д. Следующая команда прочитает последний элемент этого массива в регистр DL:

Какой смысл имело объединение ряда чисел в массив numbers? Да никакого, если к этим числам мы все равно обращаемся по отдельности. Удобнее было объявить этот массив таким образом:

nmb0 db 0
nmbl db 1
nmb2 db 2
nmb3 db 3
nmb4 db 4

В этом случае для обращения к последнему элементу не надо вычислять его адрес, а можно воспользоваться именем nmb4. Если, с другой стороны, мы хотим работать с числами, как с массивом, используя индексы отдельных элементов (о чем речь будет идти позже), то присвоение массиву общего имени представляется естественным. Получение последнего элемента массива по его индексу выполняется с помощью такой последовательности команд:

mov SI,4 ;Индекс элемента в массиве
mov DL,numbers[SI] ;Обращение по адресу
;numbers + содержимое SI

Иногда желательно обращаться к элементам массива ( обычно небольшого размера ) то с помощью индексов, то по их именам. Для этого надо к описанию массива, как последовательности отдельных данных, добавить дополнительное символическое описание адреса начала массива с помощью директивы ассемблера label (метка):

numbers label byte
nmb0 db 0
nmbl db 1
nmb2 db 2
nmb3 db 3
nmb4 db 4

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

numbers label word
nmb0 dw 0
nmbl dw 1
nmb2 dw 2
nmb3 dw 3
nmb4 dw 4

В чем состоит различие двух последних описаний данных? Различие есть, и весьма существенное. Хотя в обоих случаях в память записывается натуральный ряд чисел от 0 до 4, однако в первом варианте под каждое число в памяти отводится один байт, а во втором — слово. Если мы в дальнейшем будем изменять значения элементов нашего массива, то в первом варианте каждому числу можно будет задавать значения от 0 до 255, а во втором — от 0 до 65535.
Выбирая для данных способ их описания, необходимо иметь в виду, что ассемблер выполняет проверку размеров используемых данных и не пропускает команды, в которых делается попытка обратиться к байтам, как к словам, или к словам — как к байтам. Рассмотрим последний вариант описания массива numbers. Хотя под каждый элемент выделено целое слово, однако реальные числа невелики и вполне поместятся в байт. Может возникнуть искушение поработать с ними, как с байтами, перенеся предварительно в байтовые регистры:

Илон Маск рекомендует:  Установка под unixhp ux

mov AL,nmb0 ;Переносим nmb0 в AL
mov DL,nmbl ;Переносим nmb1 в AL
mov CL,nmb2 ;Переносим nmb2 в AL

Так делать нельзя . Транслятор сообщит о грубой ошибке — несоответствии типов, и не будет создавать объектный файл. Однако довольно часто возникает реальная потребность в операциях такого рода. Для таких случаев предусмотрен специальный атрибутивный оператор byte ptr ( byte pointer , байтовый указатель ), с помощью которого можно на время выполнения одной Команды изменить размер операнда:

mov AL,byte ptr nmb0
mov DL,byte ptr nmbl
mov CL,byte ptr nmb2

Эти команды транслятор рассматривает, как правильные. Но следует заметить, что эта команда будет указывать на младший байт в слове (nmb0, nmb1 и т.д.).
Часто возникает необходимость выполнить обратную операцию — к паре байтов обратиться, как к слову. Для этого надо использовать оператор word ptr:

okey db ‘OK’

mov AX,word ptr okey

Здесь оба байта из байтовой переменной okey переносятся в регистр АХ. При этом первый по порядку байт, т.е. байт с меньшим адресом, содержащий букву «О», отправится в младшую половину АХ — регистр AL, а второй по порядку байт, с буквой «К», займет регистр АН.
До сих пор речь шла о данных, которые, в сущности, являлись переменными, в том смысле, что под них выделялась память и их можно было модифицировать. Язык ассемблера позволяет также использовать константы, которые являются символическими обозначениями чисел и могут использоваться всюду в тексте программы, как наглядные эквиваленты этих чисел:

maxsize = 0FFFFh
.
mov CX,maxsize
mov CX,0FFFFh

Последние две команды полностью эквивалентны.
При определении констант допустимо выполнение арифметических операций. Пусть нам надо задать позицию символа (или строки символов) на экране. Учитывая, что каждый символ записывается в видеопамяти в двух байтах (в первом — код ASCII символа, а во втором — его атрибут), строка экрана имеет длину 80 символов, а высота экрана составляет 25 строк, то для вывода некоторого символа в середину экрана его смещение в видеопамяти от начала видеостраницы можно определить следующим образом:

Такая запись достаточно наглядна, и ее легко модифицировать, если мы решим вывести символ в какую-то другую область экрана.
Константами удобно пользоваться для определения длины текстовых строк:

mes db ‘Ждите’
mes_len = $-mes

В этом примере константа mes_len получает значение длины строки mes (в данном случае 5 байт), которая вычисляется как разность значения счетчика текущего адреса после определения строки и ее начального адреса mes. Такой способ удобен тем, что при изменении содержимого строки достаточно перетранслировать программу, и та же константа mes_len автоматически получит новое значение.

ДИРЕКТИВА ОПРЕДЕЛЕНИЯ БАЙТА (DB)

Из различных директив, определяющих элементы данных, наиболее полезной является DB (определить байт). Символьное выражение в директиве DB может содержать строку символов любой длины. Числовое выражение в директиве DB может содержать одну или более однобайтовых констант. Один байт выражается двумя шестнадцатеричными цифрами. Если интерпретировать числовые значения, описанные директивой DB, как содержащие знак, то наибольшее положительное шестнадцатеричное число в одном байте это 7F, все «большие» числа от 80 до FF представляют отрицательные значения. В десятичном исчислении эти пределы выражаются числами +127 и -128.

ДИРЕКТИВА ОПРЕДЕЛЕНИЯ СЛОВА (DW)

Директива DW определяет элементы, которые имеют длину в одно слово (два байта). Символьное выражение в DW ограничено двумя символами, которые ассемблер представляет в объектном коде так, что, например, ‘PC’ становится ‘CP’. Для определения символьных строк директива DW имеет ограниченное применение.
Два байта представляются четырьмя шестнадцатеричными цифрами. Если интерпретировать числовые значения, описанные директивой DW, как содержащие знак, то наибольшее положительное шестнадцатеричное число в двух байтах это 7FFF; все «большие» числа от 8000 до FFFF представляют отрицательные значения. В десятичном исчислении эти пределы выражаются числами +32767 и -32768.
Для форматов директив DW, DD и DQ ассемблер преобразует константы в шестнадцатеричный объектный код, но записывает его в обратной последовательности.
Таким образом десятичное значение 12345 преобразуется в шестнадцатеричное 3039, но
записывается в объектном коде как 3930.

ДИРЕКТИВА ОПРЕДЕЛЕНИЯ ДВОЙНОГО СЛОВА (DD)

Директива DD определяет элементы, которые имеют длину в два слова (четыре байта). Если интерпретировать числовые значения, описанные директивой DD , как содержащие знак, то, наибольшее положительное шестнадцатеричное число в четырех байтах это 7FFFFFFF. Все «большие» числа от 80000000 до FFFFFFFF представляют отрицательные
значения. В десятичном исчислении эти пределы выражаются числами +2147483647 и -2147483648.
Ассемблер преобразует все числовые константы в директиве DD в шестнадцатеричное представление, но записывает объектный код в обратной последовательности. Таким образом десятичное значение 12345 преобразуется в шестнадцатеричное 00003039, но
записывается в объектном коде как 39300000.
Символьное выражение директивы DD ограничено двумя символами.

ДИРЕКТИВА ОПРЕДЕЛЕНИЯ УЧЕТВЕРЕННОГО СЛОВА (DQ)


Директива DQ определяет элементы, имеющие длину четыре слова (восемь байт). Наибольшее без знаковое значение может быть FFFFFFFFFFFFFFFF, что равно десятичному 18446744073709551615. Отрицательные и положительные значения считайте сами :).

ДИРЕКТИВА ОПРЕДЕЛЕНИЯ ДЕСЯТИ БАЙТ (DT)

Директива DT определяет элементы данных, имеющие длину в десять байт.
Назначение этой директивы связано с упакованным двоично-десятичным форматом данных.

Ну и на последок, кусок кода с моими экспериментами:

Теги dl, dt и dd, список описаний

А вот и новая запись блога про «болезни» верстальщика, которыми вы не заразитесь, если внимательно пройдёте этот курс. У каждой болезни есть описание, а у некоторых их даже несколько. Для разметки такой информации лучше всего подойдёт последний вид списков — список описаний.

Список описаний хорош для разметки вопросов-ответов, наименований и определений, категорий и тем. Он создаётся с помощью трёх тегов:

  • (сокращение от «description list») обозначает сам список описаний;
  • (сокращение от «description term») обозначает термин;
  • (сокращение от «description definition») обозначает описание или определение.

Теги и пишутся внутри .

Каждый список может содержать один или несколько терминов и одно или несколько описаний для каждого термина. Пример кода:

По умолчанию браузер добавляет небольшой отступ слева от определений.

  • index.html Сплит-режим
  • style.css Сплит-режим

День четвёртый. Как я чуть не заболел

Сегодня я узнал, что верстальщиком быть опасно. Когда ты только начинаешь свой путь, ты ещё неопытен и легко можешь заразиться какой-нибудь болезнью. Вот некоторые из опасностей, которые могут подстерегать:

Диватоз Острый страх семантики Таблицефобия Избегание таблиц Стремление сверстать таблицу на дивах Классянка Навязывание классов каждому тегу Тут могла быть ваша реклама Подвал сайта

Dd определение данных

Поскольку в UNIX очень многие объекты являются файлами, спектр применения dd гораздо шире, чем кажется на первый взгляд. Регулярно возникает необходимость не просто скопировать файл или несколько файлов (для чего предназначена утилита cp), а скопировать первые n байт файла, пропустить m байт от начала, прочитать файл с дефектного носителя, транслировать содержимое файла в ASCII, «развернуть» порядок байт в файле (Little-Endian vs. Big-Endian), [1] просто скопировать очень большой файл или все вместе взятое. Для этой цели и служит dd.

Кроме всего прочего, данная утилита позволяет скопировать регионы из файлов «сырых» устройств, например, сделать резервную копию загрузочного сектора жёсткого диска, или прочитать фиксированные блоки данных из специальных файлов, таких, как /dev/zero или /dev/random. [2]

Название утилиты dd иногда в шутку расшифровывают, как «disk destroyer», «data destroyer» или «delete data», так как утилита позволяет производить низкоуровневые операции на жёстких дисках — при малейшей ошибке, такой, как реверс параметров if и of, можно потерять часть данных на диске (или даже все данные) [1] .

Некоторые параметры

При написании статьи были использованы материалы man dd, описывающие версию dd от GNU. Версии dd на других операционных системах могут отличаться.

Базовые параметры

  • if=файл — читает данные из файла вместо стандартного ввода.
  • of=файл — пишет данные в файл вместо стандартного вывода.
  • bs=n — размер блока.
  • ibs=nn и obs=nn — задаёт, сколько байтов нужно считывать или записывать за раз.
  • count=n — сколько блоков скопировать.
  • seek=n — сколько блоков пропустить от начала в результирующем файле.
  • skip=n — сколько блоков от начала файла пропустить перед началом копирования.
  • conv=фильтр,фильтр — применить фильтры конвертации.
  • ascii — сконвертировать в ASCII из EBCDIC…
  • ebcdic — …и наоборот.
  • block — выравнивание блоков.
  • lcase — преобразовать к нижнему регистру.
  • ucase — преобразовать к верхнему регистру.
  • swab — менять местами пары байт.
  • noerror — игнорировать ошибки ввода-вывода.

Примеры использования

Работа с CD/DVD-дисками и образами

Создать образ CD/DVD, используя большой размер блока. Игнорировать ошибки:

Записать ISO-образ «image.iso» на устройство sdb вместе с его загрузочным сектором и форматированием раздела в файловую систему образа (как правило, ISO 9660 или UDF):

Работа с файлами

Скопировать файл foo в файл bar:

Скопировать файл foo в файл bar, пропустив первые 10 КБ из файла foo:

Порезать 10-мегабайтный файл foo на 2 по 5 МБ:

Склеить четыре 100-мегабайтных файла в один:

или же (для сбора файла из большого количества кусков):

Примеры выше показывают возможности dd, на практике, обычно, используется cat

Вывести на экран (в /dev/stdout) первые 256 байт файла foo:

Предыдущая команда годится только для просмотра текстового файла. Содержимое бинарного файла рекомендуется смотреть так:

Резервное копирование и удаление данных

Скопировать один раздел жёсткого диска на другой жёсткий диск, игнорируя ошибки ввода-вывода:

Сделать копию главной загрузочной записи (MBR) первого жёсткого диска:

Просмотреть содержимое главной загрузочной записи (MBR) первого жёсткого диска:


Копировать всё, кроме метки, с диска на магнитную ленту:

Копировать всё, не перезаписывая метку, с магнитной ленты на диск:

Уничтожить содержимое устройства /dev/sdg, заполнив его «нулями» из /dev/zero:

Узнать статус выполнения операции:

Варианты dd, ориентированные на восстановление

Программы с открытым исходным кодом для восстановления включают dd_rescue и dd_rhelp, которые работают вместе, savehd7 и GNU ddrescue.

Antonio Diaz Diaz (разработчик GNU ddrescue) сравнивает [3] варианты dd для задач восстановления:

Стандартная утилита dd осуществляет линейное чтение диска, и это может занять много времени или даже сжечь накопитель без восстановления чего-либо, если ошибки расположены вначале жесткого диска. dd_rescue делает то же самое, что и dd, только более эффективно. dd_rhelp — это сложный shell-скрипт, который запускает dd_rescue много раз, стараясь стратегически копировать накопитель, но это очень неэффективно.

  • dd_rhelp сначала извлекает все доступные к чтению данные и сохраняет их в файл, вставляя нули вместо байтов, которые не смог прочесть. Потом утилита пытается повторно прочитать некорректные данные и обновить этот файл.
  • GNU ddrescue может быть использована для копирования данных прямо на новый диск по необходимости, как и dd.

См. также

Примечания

  1. 12Sam ChessmanHow and when to use the dd command?. CodeCoffee. Архивировано из первоисточника 21 января 2012.Проверено 19 февраля 2008.
  2. Dd — LQWiki. LinuxQuestions.org. Архивировано из первоисточника 21 января 2012.Проверено 19 февраля 2008.
  3. Interview With GNU DDRescue’s Antonio Diaz Diaz. Blue-GNU. Архивировано из первоисточника 15 апреля 2008.Проверено 6 декабря 2008.

Ссылки

  • dd(1) — страница справки man по пользовательским командам GNU/Linux (англ.)
  • dd: Команда, которая не похожа на другие
  • Реализация dd под Windows
Программное обеспечение для работы с файловыми системами оптических дисков
Windows
Команды Unix
POSIX.1-2008
Утилиты POSIX.1-2008 admin • alias • ar • asa • at • awk • basename • batch • bc • bg • c99 • cal • cat • cd • cflow • chgrp • chmod • chown • cksum • cmp • comm • command • compress • cp • crontab • csplit • ctags • cut • cxref • date • dd • delta • df • diff • dirname • du • echo • ed • env • ex • expand • expr • false • fc • fg • file • find • fold • fort77 • fuser • gencat • get • getconf • getopts • grep • hash • head • iconv • id • ipcrm • ipcs • jobs • join • kill • lex • link • ln • locale • localedef • logger • logname • lp • ls • m4 • mailx • make • man • mesg • mkdir • mkfifo • more • mv • newgrp • nice • nl • nm • nohup • od • paste • patch • pathchk • pax • pr • printf • prs • ps • pwd • qalter • qdel • qhold • qmove • qmsg • qrerun • qrls • qselect • qsig • qstat • qsub • read • renice • rm • rmdel • rmdir • sact • sccs • sed • sh • sleep • sort • split • strings • strip • stty • tabs • tail • talk • tee • test • time • touch • tput • tr • true • tsort • tty • type • ulimit • umask • unalias • uname • uncompress • unexpand • unget • uniq • unlink • uucp • uudecode • uuencode • uustat • uux • val • vi • wait • wc • what • who • write • xargs • yacc • zcat
GNU Coreutils
Файловые утилиты chgrp • chown • chmod • cp • dd • df • dir • dircolors • install • ln • ls • mkdir • mkfifo • mknod • mv • rm • rmdir • shred • sync • touch • vdir
Текстовые утилиты cat • cksum • comm • csplit • cut • expand • fmt • fold • head • join • md5sum • nl • od • paste • ptx • pr • sha1sum • sort • split • sum • tac • tail • tr • tsort • unexpand • uniq • wc
Shell-утилиты basename • chroot • date • dirname • du • echo • env • expr • factor • false • groups • hostid • id • link • logname • nice • nohup • pathchk • pinky • printenv • printf • pwd • readlink • seq • sleep • stat • stty • tee • test • true • tty • uname • unlink • users • who • whoami • yes
Форматы архивов (сравнение по типу)
Только архивирование
Только сжатие

bzip2 • compress • gzip • LZMA • LZW • lzop • rzip • SQ • XZ

Язык определения данных – DDL

Язык определения данных решает задачи создания и удаления объектов базы данных. По стандартам SQL-92 к таким объектам относятся:

Каждый объект в базе однозначно описывается его именем и имеет владельца. Подавляющее число операторов DDL начинается с ключевых слов CREATE (создать) или DROP (удалить).

Создание базы данных – CREATE DATABASE

Существующий на настоящее время стандарт не обязывает разработчиков СУБД создавать базы данных каким-то определённым образом. Синтаксис создания баз данных варьируется от поставщика к поставщику. Так в синтаксисе сервера InterBase операция создания новой базы данных выглядит примерно следующим образом:

CREATE DATABASE ‘C:\Data\IB\NewBase’

LENGTH=100 USER имя_пользователя PASSWORD пароль

Microsoft SQL Server для создания новой базы данных «по минимуму» потребует следующих строк кода:

CREATE DATABASE NewBase

ON (NAME = NewBase,FILENAME = ‘c:\mssql7\data\NewBase.mdf’)

В СУБД ORACLE база данных формируется во время инсталляции системы, а пользовательские объекты размещаются в этой БД. В состав СУБД INGRES включена утилита CREATEDB с помощью которой создаётся новая база данных.

Уничтожение базы данных – DROP DATABASE

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

DROP DATABASE имя_базы_данных [. n]

Создание схемы – CREATE SCHEMA

Операцию CREATE SCHEMA можно считать альтернативой CREATE DATABASE . Схема представляет собой комбинацию связанных друг с другом объектов базы данных – таблиц, представлений, доменов, и т.п. В минимальной нотации оператор определения схемы выглядит следующим образом:


CREATE SCHEMA [имя схемы | AUTORIZATION имя_создателя]

CREATE SCHEMA mydatabase AUTORIZATION Ivanov

Удаление схемы – DROP SCHEMA

Синтаксис удаления схемы выглядит следующим образом:

DROP SCHEMA имя_схемы [ RESTRICT | CASCADE ]

Здесь ключевое слово RESTRICT (вызывается по умолчанию) указывает на то, что перед удалением схема должна быть пустой, иначе удаление будет отменено. Для уничтожения схемы содержащей объекты нам потребуется другой ключ – CASCADE .

Ставропольский государственный университет, кафедра КБ

Создание таблицы – CREATE TABLE

После создания базы данных можно переходить к созданию таблиц. Ниже представлен общий формат оператора CREATE TABLE :

CREATE [ TEMPORARY] TABLE имя_таблицы

определение поля ::= имя_поля <имя домена | тип данных [размер]>[ограничение поля…]

[ DEFAULT значение по умолчанию] [ COLLATE имя сравнения]

Минимальная конструкция, нацеленная на создание простейшей таблицы должна включать операторы CREATE TABLE , имя создаваемой таблицы и перечень полей с их размерами и типами. В следующем примере создаётся таблица Peoples, включающая в пять полей. Первое поле целочисленное, второе, третье и четвёртое поля символьные и последнее поле предназначено для хранения даты.

CREATE TABLE Peoples (Peoples_ID Int,

LName Char(30), Born Date)

В таблице может быть одно или несколько определений поля. Определение поля обязательно должно включать имя поля, тип данных и при необходимости размер поля. В различных диалектах SQL могут различаться названия типов полей и формат хранения данных (например, даты и времени). По умолчанию столбцы таблицы допускают помещение в них значения NULL .

Ограничения поля и таблицы Таблица 8.6

Запрет на вставку в поле значения NULL .

Значение поля должно быть уникальным.

Значение поля должно быть уникальным, оно не может содержать NULL , в

таблице это ограничение может использоваться только один раз.

Ограничение-проверка на допустимое значение поля. В скобках за опера-

тором CHECK указывается предикат, проверяющий допустимость значе-

Оба ограничения весьма похожи, единственное различие между ними в

том, что FOREIGN KEY – ограничение внешнего ключа для таблицы, а

REFERENCES – ограничение внешнего ключа для поля. В случае установ-

ки ограничения для таблицы сразу за FOREIGN KEY в скобках необходи-

мо указать перечень столбцов, относящихся к ключу. В остальном синтак-

сис одинаков. Ограничения внешнего ключа требуют, чтобы все значения,

присутствующие во внешнем ключе, соответствовали значениям роди-

тельского ключа, т.е. внешний ключ должен иметь ссылочную целост-

Приведённый ниже пример создаёт на сервере базы данных таблицу DInfo. В качестве первичного ключа назначается поле DKey, символьное поле DName должно быть не пу-

Ставропольский государственный университет, кафедра КБ

стым. Поле IzmKey допускает только ввод значений существующих в поле IzmKey другой таблицы Izmer.

CREATE TABLE DInfo

Установка значения по умолчанию производится при помощи оператора DEFAULT . Таким образом, обеспечивается автоматический ввод в столбец некоторого значения, если его явным образом не укажет пользователь в момент вставки новых данных.

CREATE TABLE tmp

Временные таблицы существуют только на время текущего сеанса SQL и по окончании его автоматически удаляются. При создании временной таблицы требуется указать параметр TEMPORARY . В зависимости от того создаём мы глобальные временные таблицы или локальные временные таблицы можно (но не обязательно) использовать ключевые слова GLOBAL или LOCAL соответственно.

CREATE GLOBAL TEMPORARY TABLE TmpTable (IntValue INT, FloatValue FLOAT)

Оператор COLLATE предназначен для явного указания порядка сортировки в таблице. Дело в том, что наборы символов, используемые в языке SQL, обычно отсортированы по коду каждого символа, т.е. набор строчных символов следуют после прописных символов (как, например, в наборе символов ASCII). Если Вас такая ситуация не устраивает, то Вы должны самостоятельно создать объект сортировки ( CREATE COLLATION ) в базе данных и сослаться на него в таблице.

Удаление таблицы – DROP TABLE

Оператор предназначен для удаления таблиц.

DROP TABLE имя_таблицы CASCADE | RESTRICT

Если определён параметр RESTRICT , то на удаляемую таблицу не должно быть ни каких ссылок в ограничениях или просмотрах (представлениях). Таким образом СУБД обеспечивает целостность данных и таблица не будет удалена если она связана с другими объектами базы данных. Параметр CASCADE осуществляет каскадное удаление всех ссылающихся на таблицу объектов (таблиц, ограничений, просмотров).

Минимальный набор команд не требует использования параметра CASCADE | RESTRICT .


Изменение структуры таблицы – ALTER TABLE

Предложение ALTER TABLE вносит изменения в определение уже существующей таблицы.

ALTER TABLE имя_таблицы

Ставропольский государственный университет, кафедра КБ

Добавляет в таблицу новый столбец. Новый столбец определяется

так же, как в операторе CREATE TABLE .

Используется для создания или отмены значения по умолчанию

Удаляет из таблицы столбец. При использовании параметра

RESTRICT перед удалением столбца СУБД проверит наличие

ссылок на него из других таблиц, представлений и т.п, и если та-

кие ссылки есть, то столбец не будет удалён. Наоборот, при ис-

пользовании параметра CASCADE вместе со столбцом будут уда-

лены все объекты, ссылающиеся на него.

Предложение ADD будет добавлять к таблице новое ограничение.

Удаляет уже существующие ограничения. Если в предложении

задан параметр RESTRICT, то в этот момент столбец не должен

использоваться как родительский ключ для внешнего ключа дру-

гой таблицы. Если передаётся параметр CASCADE , то внешние

ключи, имеющие ссылки или ограничения FOREIGN KEY будут

Для того, чтобы добавить к таблице книг ещё один столбец, способный хранить целое число воспользуйтесь следующим примером:

ALTER TABLE Book ADD COLUMN BookPages INT

Для изменения типа уже существующего столбца:

ALTER TABLE Book ALTER COLUMN BookPages FLOAT

И, наконец, для удаления столбца:

ALTER TABLE Book DROP COLUMN BookPages

Определение представления – CREATE VIEW

Представление (вид) – это хранимое определение набора инструкций SELECT , задающего таблицы и способ их объединения, столбцы и накладывающего ограничения на выводимые строки которые нужно выбрать при вызове данного представления.

Если объяснить проще, то представление это удачный способ отображения информации, хранимой в СУБД. Причём настолько удачный, что пользователям может казаться, что они работают с реальными таблицами. Представление используется для организации доступа к одной таблице, части таблицы или нескольким таблицам. К представлению, как и к обычной таблице, можно обратиться, используя ключевое слово SELECT .

CREATE VIEW имя_таблицы [(список столбцов)]

AS ( SELECT оператор

[ WITH [ CASCADED | LOCAL ] CHECK OPTION ])

Ряд примеров создания представлений на основе одной таблицы предложен ниже. Простейшее однотабличное представление, возвращающее все поля из таблицы Writer.

CREATE VIEW View_Writer_1 ( AS

SELECT * FROM Writer WHERE Wrt_Key>100)

Создание представления на основе объединения нескольких таблиц. Выводятся только три поля.

CREATE VIEW View_Writer_2

Ставропольский государственный университет, кафедра КБ

SELECT Writer.Surname, Writer.FName, Book.Book FROM Writer

INNER JOIN BOOK ON Book.Bk_Key= Writer.Bk_Key)

Выражение CRETAE VIEW создаёт представление таблицы или нескольких таблиц иногда называемых виртуальной таблицей. Определение представления содержит обычный запрос на базе оператора SELECT , но с некоторыми ограничениями: например нельзя использовать оператор ORDER BY , упорядочивающий набор строк. При объединении двух и более таблиц надо быть внимательным при совпадении имён полей таблиц. В таких случаях синтаксис SELECT * … (выбор всех полей) является недопустимым и совпадающее имя надо переименовать при помощи оператора AS . Также явный список имён полей после оператора SELECT необходимо описать в случае, если поля содержат вычисляемые значения или существуют объединённые поля с разными именами в соответствующих им таблицам.

Как правило, представления доступны только в режиме «только для чтения», однако если представление создано на основе одной единственной таблицы и не включает в себя операторы UNION , EXCEPT , INTERSECT , GROUP BY , HAVING , DISTINCT , то представ-

ление допускает операции вставки INSERT и редактирования UPDATE .

Удаление представления – DROP VIEW

DROP VIEW имя_представления CASCADE | RESTRICT

Минимальный синтаксис требует оператора DROP VIEW и имени представления.

DROP VIEW Temp_View

Если Вы используете ключевое слово RESTRICT , то на удаляемое представление не должно быть никаких ссылок, иначе операция удаления будет отменена. Параметр CASCADE напротив, осуществит каскадное удаление всех объектов связанных с данным представлением.

Создание индекса – CREATE INDEX

Индексы предназначены для обеспечения максимально быстрого поиска и сортировки данных в таблице. Физически индекс представляет собой уникальный набор значений и список указателей на страницы данных где эти значения находятся.

CREATE [ UNIQUE ] [ CLASTERED ] INDEX имя_индекса ON имя_таблицы (имя_столбца [,

В случае создания индекса с опцией UNIQUE СУБД прекращает допускать ввод повторяющихся значений в столбец (столбцы), включённые в определение индекса.

Кластерный индекс CLUSTERED – специальный индекс, заставляющий СУБД хранить данные в таблицах именно в том порядке, который задаёт этот индекс. В таблице может быть определён только один кластерный индекс.

CREATE UNIQUE INDEX siName ON WRITER (SurName, FName, LName)

Использование кластерного индекса способствует значительному сокращению времени доступа к данным, поэтому основной индекс таблицы всегда стоит определять

В различных диалектах СУБД синтаксис создания индекса несколько разнится. Например, в InterBase допускается создавать индексы, осуществляющие сортировку данных в обратной последовательности при помощи ключа DESCENDING .

Ставропольский государственный университет, кафедра КБ

CREATE DESCENDING INDEX siName_ZA ON WRITER (SurName, FName, LName)

Удаление индекса – DROP INDEX

DROP INDEX имя_индекса

Синтаксис удаления индекса включает в себя ключевые слова DROP INDEX и непосредственно имя таблицы и индекса, разделённые точкой.

Создание процедуры – CREATE PROCEDURE

В стандартном наборе инструкций SQL-92 команды, позволяющей создавать или удалять хранимую процедуру, мы не обнаружим. Вместе с тем практически все SQL серверы поддерживают технологию хранимых процедур, поэтому в материал посвящённый SQL92 входят инструкции CREATE PROCEDURE и DROP PROCEDURE .

Ниже предложена синтаксическая конструкция, позволяющая создать хранимую процедуру.

CREATE PROCEDURE имя_процедуры

[параметр1 тип_параметра, …, параметрN тип_параметра]

Например, создавая процедуру для добавления строки в таблицу БД Microsoft SQL Server (диалект Transact-SQL) мы бы написали следующий текст запроса:

CREATE PROCEDURE stp_InsertRecord

@Param1 INT , @Param2 VARCHAR (30), @Param3 BIT , @PrimaryKey INT OUTPUT

INSERT INTO MyTable (Field1, Field2, Field3) VALUES (@Param1, @Param2, @Param3)

SET @PrimaryKey =@@IDENTITY

Ещё один пример процедуры, в результате выполнения возвращающей набор данных, но в этот раз на диалекте сервера InterBase:

CREATE PROCEDURE stp_SelectRecord (ParamDate DATE)

SELECT * FROM DayTable WHERE FieldDate ;

Удаление процедуры – DROP PROCEDURE

Хранимая процедура удаляется командой DROP PROCEDURE .

DROP PROCEDURE имя_процедуры

Создание триггера – CREATE TRIGGER

Триггер – это программа, описанная на языке SQL и выполняющаяся в момент возникновения события, обычно связанного с вставкой, удалением или изменением данных.

Ставропольский государственный университет, кафедра КБ

Диаграмма описания данных (DD)

Диаграмма описания данных (DD) служат для определения структуры данных, передаваемых вдоль маршрута взаимодействия. Диаграмма описания данных связана с конкретной СО диаграммой и может содержать описание одного или нескольких типов данных.

DD диаграммы могут использоваться для указания типов данных.

Запись отображает совокупность компонентов различных типов данных, которые структурированы и сгруппированы по наименованиям полей. В диаграмме описания данных, построенной для этой задачи (см. рис. 2) располагается 4 записи. Каждая запись имеет свое наименование:

Каждая запись, например, группа студентов имеет наименование полей код группы, название, курс, семестр. Каждое поле характеризуется своим типом — числовым, текстовым и т.д.

Тип полей — текстовый имеют поля такие как, например, название и т.д. для записи группа студентов. Тип полей — числовой имеют, как правило, такие поля как курс, кол-во часов и т.п.

модель данные access запрос

Рисунок 2. Диаграмма описания данных (DD)

3. Установление отношений

Таблицы связаны между собой таким образом, что информация из одной таблицы доступна для другой. Эти отношения устанавливаются за счет того, что в разных таблицах содержатся поля с одинаковыми значениями. Необязательно, чтобы имена соответствующих полей были одинаковыми; достаточно соблюдать однозначное соответствие значений. Для того чтобы установить отношения между таблицами, необходимо установить связи между теми полями, в которых содержится общая информация.

Рисунок 3. Отображения связей между таблицами базы данных

Каскадное обновление связанных полей.

Опция дает возможность изменять содержимое поля связи. Если изменить содержимое ключевого поля в первичной таблице, Access проверяет корректность значения в этом поле (в первичной таблице не должно быть одинаковых записей) и изменяет значения соответствующих полей во всех связанных таблицах. Таким образом, изменение значений ключевого поля в первичной таблице распространяется на все связанные таблицы.

Каскадное удаление связанных записей.

Опция дает возможность удалять записи в связанных таблицах при удалении соответствующей записи в первичной таблице. При удалении записи в первичной таблице сначала Access удалит все связанные с ней записи в дочерних таблицах, а затем запись в первичной таблице. Эта опция очень полезна при удалении серий связанных данных.

Dd определение данных

HTML-элемент создаёт ассоциативный список из одного или нескольких элементов-терминов , сопровождаемого одним или более элементами-описаний . Закрывающиеся теги и могут присутствовать, но не обязательны.

У одного может быть несколько , как в образце, где перечислены актёры главных ролей.

Несколько могут иметь общий , как в примере, где на пару вопросов дан один ответ.

Пустой

У или может отсутствовать содержимое, но нельзя писать без .

Содержимое и на одной строке

Два столбца CSS

Два столбца в паре «наименование — объект» можно сделать с помощью таблицы, flexbox, свойств float , position и columns . Но для , на мой взгляд, лучше всего подходит grid.

Dd определение данных

Язык:
Русский
English

Директивы встроенного ассемблера DB, DW и DD

Встроенный ассемблер поддерживает три директивы ассемблера: DB (определить байт), DW (определить слово) и DD (определить двойное слово).

Директива Тип операнда Диапазон значений Ассемблер генерирует
DB Константа 128..255 1 байт
Строка Любая длина Последовательность байтов,
символов соответствующих ASCII-кодам
каждого символа
DW Константа -32,768..65,535 1 слово
Указатель Близкий указатель(смещение)
DD Константа -2,147,483,648.. 1 двойное слово
4,294,967,295
Указатель Дальний указатель
(смещение:сегмент)

Данные, созданные директивами DB, DW и DD всегда хранятся в сегменте кода.

Чтобы создать неинициализированные или инициализированные данные в сегменте данных, используйте объявления в стандартных разделах Pascal Var или Const .

Вот примеры директив DB, DW и DD:

Директива Операнд Результат
DB 0FFH Один байт
DB 0,99 Два байта
DB ‘A’ Ord(‘A’)
DB ‘Hello. ‘, 0DH, 0AH Строка+CR/LF
DB 12, «Turbo Pascal» строка стиля Pascal

DW 0FFFFH Одно слово
DW 0,9999 Два слова
DW ‘A’ То же, что и DB ‘A’, 0
DW ‘BA’ То же, что и DB ‘A’, ‘B’
DW MyVar Смещение MyVar
DW MyProc Смещение MyProc

DD 0FFFFFFFFH Одно двойное слово
DD 0,999999999 Два двойных слова
DD ‘A’ То же, что и DB ‘A’, 0, 0, 0
DD ‘DCBA’ То же, что и DB ‘A’, ‘B’, ‘C’, ‘D’
DD MyVar Указатель на MyVar
DD MyProc Указатель на MyProc

Единственый вид символов, которые могут быть определены в ассемблерном операторе — это метки . Все переменные должны быть объявлены с использованием синтаксиса Pascal.

Илон Маск рекомендует:  Что такое код asp iiscustomlogmodule
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL