Word и dword разница

Обновлено: 06.07.2024

AVI - это английская аббревиатура для Audio Video Interleaved, цифровой формат аудио и видео, разработанный Microsoft и соответствующий спецификации файлов RIFF. Первоначально он использовался в среде Microsoft Video Windows (VFW). / 98, OS / 2 и другие операционные системы напрямую поддерживают. Формат AVI позволяет чередовать и воспроизводить видео и аудио одновременно, поддерживает 256 цветов и сжатие RLE, но файл AVI не ограничивает стандарт сжатия, поэтому формат файла AVI используется только в качестве стандарта интерфейса управления. Сгенерированные AVI-файлы должны воспроизводиться с использованием соответствующего алгоритма распаковки.Простыми драйверами AVI-воспроизведения в основном являются Microsoft Video для Windows или Video1 в Windows 98/98 и Intel Indeo Video.

Перед введением файла AVI, мы должны сначала взглянуть на структуру файла RIFF. В файле AVI используется метод структуры файла RIFF. RIFF (Resource Interchange File Format) - это формат файла, определенный Microsoft для пользователей для управления мультимедийными данными в среде Windows. Wave audio, wave, MIDI и digital video AVI Все хранятся в этом формате. Фактические данные файла RIFF организованы в виде списков и кусков. Списки могут вкладывать списки и блоки. Весь файл RIFF можно рассматривать как базу данных, а его идентификатор блока данных - RIFF, который называется блоком RIFF. В файле RIFF может существовать только один блок RIFF. Блок RIFF содержит серию субблоков. Один из начальных блоков имеет идентификатор «Список» и называется блоком LIST. Блок LIST может содержать серию субблоков. Больше не может содержать подблоки.

Блоки RIFF и LIST имеют еще одно поле данных, называемое Тип формы или Тип списка, чем обычные блоки данных.

Блок 1.RIFF

  • Идентификатор чанка (строка "RIFF")
  • Chunk len (длина данных RIFF)
  • Тип чанка (тип формы или тип списка. Например: "AVI", "WAVE" . )
  • Данные чанка (фактические данные RIFF)


52 49 46 46: строка идентификатора фрагмента "RIFF"

48 51 D5 02: длина данных блока = 0X02D55148 = 47534408, начиная с типа блока. (Исключая идентификатор чанка, чанка и лен).

41 56 49 20: тип списка чанков типа «(строка) AVI», за которым следуют фактические данные RIFF.

Общий размер файла avi (размер блока RIFF) = длина фрагмента (значение) + 8 (идентификатор фрагмента (4 байта) + длина фрагмента (4 байта))

Блок 2.LIST

  • Идентификатор чанка (строка «LIST»)
  • Chunk len (длина данных LIST)
  • Тип чанка (тип формы или тип списка, такой как hdrl, strl, INFO, movi)
  • Данные чанка (LIST фактические данные)


4c 49 53 54 Chunk ID (строка «LIST»)

72 01 00 00 Chunk len (длина данных LIST), считая от типа Chunk.

68 64 72 6C Chunk type ("hdrl")

61 . Данные блока (LIST фактические данные)

Размер блока LIST = длина блока (значение) + 4 байта (идентификатор блока) + 4 байта (длина блока)

Если текущий список конкретно включает в себя, может быть вложенность списка. Как показано на скриншоте, выбранная часть представляет собой список hdrl, он содержит два списка strl, один аудио, одно видео, каждый список strl содержит strh и strf.

3. Обычные блоки (avih strh strf JUNK, idxl)

  • Идентификатор чанка (строка)
  • Chunk len (длина данных)
  • Данные чанка (данные)

61 76 69 68 Chunk ID (строка "avih")

38 00 00 00 Chunk len (длина данных = 56)

56 . Данные чанка

Размер блока Chunk = фактическая длина данных блока, исключая размер поля Chunk ID и самого поля Chunk len



  • Информационный блок - включает в себя общую информацию о файле, определяет формат данных, параметры, используемые алгоритмом сжатия и т. Д.
  • Блок данных - содержит фактический поток данных, то есть данные изображения и звуковой последовательности. Это тело файла и основная часть, которая определяет размер файла. Размер видеофайла равен скорости передачи файла, умноженной на продолжительность воспроизведения видео.
  • Блок индекса. Блок индекса содержит положение блока данных в файле, чтобы обеспечить произвольный доступ к данным в файле.

AVI-файл является наиболее сложным файлом RIFF, используемым в настоящее время, и может одновременно хранить аудио и видео данные синхронного исполнения. Тип формата блока RIFF AVI - AVI, который содержит 3 субблока, как описано ниже:

1. Информационный блок:

  • Блок LIST с идентификатором «hdrl» определяет формат данных файла AVI.
  • Блок LIST с идентификатором «hdrl» содержит два субблока, один - это субблок с идентификатором «avih», а другой - блок LIST с идентификатором «strl».

Блочная структура «Avih»: используется для записи глобальной информации о файлах AVI, таких как количество потоков, ширина и высота видеоизображений:

"Strl" подсписок :

  • В этом файле столько же потоков, сколько есть подстроков "strl".
  • Каждый список слов «strl» содержит как минимум один блок «strh» и один блок «strf».
  • Блок "strd" (который содержит некоторую информацию о конфигурации, требуемую кодеком) и блок "strn" (который содержит имя потока) являются необязательными.

Примечание: порядок, в котором появляется подсписок "strl", соответствует номеру медиа-потока. Например, первый список слов "strl" описывает первый поток (поток 0), а второй список слов "strl" описывает Это второй поток (Stream 1) и тд.

Блочная структура: Используется для описания информации заголовка потока данных, соответствующего этому блоку LIST "strl"

Блочная структура "Strf": Подблок «strf» следует за подблоком «strh», и его структура зависит от типа подблока «strh», как описано ниже:
Если субблок strh является потоком видеоданных, содержимое субблока strf является структурой BITMAPINFO, как показано ниже:

Если субблок strh является потоком аудиоданных, содержимое субблока strf является структурой WAVEFORMAT следующим образом:

Блочная структура "strd": Подблок "strd" следует за подблоком strf и хранит параметры, используемые драйвером сжатия. Он не обязательно существует и не имеет фиксированной структуры.

Поток данных AVI, определенный блоком списка «strl», последовательно связывает структуру заголовка потока данных в блоке «hdrl» LIST с данными в блоке «movi» LIST. Первая структура заголовка потока данных используется для потока данных 0, Два для потока данных 1 и так далее.

Блок данных

ID "Мови"Блок LIST содержит данные аудио- и видеопоследовательности AVI и используется для сохранения данных реального медиапотока (данных кадра видеоизображения или данных аудиосэмпла и т. Д.). Сохранить как:

  • Вложите блоки данных непосредственно в список "movi"
  • Сгруппируйте несколько блоков данных в список «rec» и расположите их в список «movi» (Примечание. При чтении содержимого файла AVI рекомендуется считывать все блоки данных в списке «rec» одновременно)

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

  • "Db" -сжатое видео
  • "Dc" -сжатое видео
  • "Pc" - используйте новую палитру
  • "Wb" - аудио и видео

Например:
Первый поток (Поток 0) - это аудио, а четырехсимвольный код, представляющий блок аудиоданных, - «00wb»;
Второй поток (Steam 1) представляет собой видео, а четырехсимвольный код, представляющий блок видеоданных, представляет собой «01db» или «01dc».
Для видеоданных новая палитра также может быть определена в середине последовательности данных AVI. Каждый измененный блок данных палитры характеризуется "xxpc" и новым тоном. Образцы определяются с использованием структуры данных AVIPALCHANGE. (Примечание: если палитра потока изменяется посередине, dwFlags в структуре AVISTREMAHEADER также следует пометить как AVISF_VIDEO_PALCHANGES в описании формата потока во времени.) Кроме того, блок текстовых данных может характеризоваться кодом произвольного типа.

Индексный блок

Идентификатор "idxl"Подблок, который определяет индексные данные блока LIST "movi", является необязательным блоком.
Наконец, блок списка «hdr» и блок списка «movi» являются необязательными индексными блоками файла AVI. Этот индексный блок индексирует каждый блок данных мультимедиа в файле AVI и записывает их смещение в файле (возможно, относительно списка «movi» или относительно начала файла AVI). Индексный блок характеризуется четырехсимвольным кодом «idxl», а индексная информация определяется структурой данных AVIOLDINDEXl.

Примечание. Если файл AVI содержит индексные блоки, он также должен включать метку AVI_HASINDEX в описании заголовка AVI, а также в dwFlags структуры AVIMAINHEADER.
Существует также специальный блок данных с четырехзначным кодом "JUNK”Для характеристики он используется для выравнивания (заполнения) внутренних данных, и приложение должно игнорировать фактическое значение этих блоков данных.


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

Первым делом необходимо выбрать систему счисления, наиболее подходящую для применения в конкретных устройствах. Для электронных устройств самой простой реализацией является двоичная система: есть ток - нет тока, или малый уровень тока - большой уровень тока. Хотя наиболее эффективной являлась бы троичная система. Наверное, выбор двоичной системы связан еще и с использование перфокарт, в которых она проявляется в виде наличия или отсутствия отверстия. Отсюда в качестве цифр для представления информации используются 0 и 1.

Таким образом данные в компьютере представляются в виде потока нулей и единиц. Один разряд этого потока называется битом. Однако в таком виде неудобно оперировать с данными вручную. Стандартом стало разделение всего потока на равные последовательные группы из 8 битов - байты или октеты. Далее несколько байтов могут составлять слово. Здесь следует разделять машинное слово и слово как тип данных. В первом случае его разрядность обычно равна разрядности процессора, т.к. машинное слово является наиболее эффективным элементом для его работы. В случае, когда слово трактуется как тип данных (word), его разрядность всегда равна 16 битам (два последовательных байта). Также как типы данных существую двойные слова (double word, dword, 32 бита), четверные слова (quad word, qword, 64 бита) и т.п.

Теперь мы вплотную подошли к представлению целых чисел в памяти. Т.к. у нас есть байты и различные слова, то можно создать целочисленные типы данных, которые будут соответствовать этим элементарным элементам: byte (8 бит), word (16 бит), dword (32 бита), qword (64 бита) и т.д. При этом любое число этих типов имеет обычное двоичное представление, дополненное нулями до соответствующей размерности. Можно заметить, что число меньшей размерности можно легко представить в виде числа большей размерности, дополнив его нулями, однако в обратном случае это не верно. Поэтому для представления числа большей размерности необходимо использовать несколько чисел меньшей размерности. Например:

  • qword (64 бита) можно представить в виде 2 dword (32 бита) или 4 word (16 бит) или 8 byte (8 бит);
  • dword (32 бита) можно представить в виде 2 word (16 бит) или 4 byte (8 бит);
  • word (16 бит) можно представить в виде 2 byte (8 бит);

Если A - число, B1..Bk - части числа, N - разрядность числа, M - разрядность части, N = k*M, то:


  • A = F1E2D3C4B5A69788 (qword)
  • A = 2 32 * F1E2D3C4 (dword) + 2 0 * B5A69788 (dword)
  • A = 2 48 * F1E2 (word) + 2 32 * D3C4 (word) + 2 16 * B5A6 (word) + 2 0 * 9788 (word)
  • A = 2 56 * F1 (byte) + 2 48 * E2 (byte) + . + 2 8 * 97 (byte) + 2 0 * 88 (byte)

Существуют понятия младшая часть (low) и старшая часть (hi) числа. Старшая часть входит в число с коэффициентом 2 N-M , а младшая с коэффициентом 2 0 . Например:


Байты числа можно хранить в памяти в различном порядке. В настоящее время используются два способа расположения: в прямом порядке байт и в обратном порядке байт. В первом случае старший байт записывается в начале, затем последовательно записываются остальные байты, вплоть до младшего. Такой способ используется в процессорах Motorola и SPARC. Во втором случае, наоборот, сначала записывает младший байт, а затем последовательно остальные байты, вплоть до старшего. Такой способ используется в процессорах архитектуры x86 и x64. Далее приведен пример:


Используя подобные целочисленные типы можно представить большое количество неотрицательных чисел: от 0 до 2 N -1, где N - разрядность типа. Однако, целочисленный тип подразумевает представление также и отрицательных чисел. Можно ввести отдельные типы для отрицательных чисел от -2 N до -1, но тогда такие типы потеряют универсальность хранить и неотрицательные, и отрицательные числа. Поэтому для определения знака числа можно выделить один бит из двоичного представления. По соглашению, это старший бит. Остальная часть числа называется мантиссой.

Если старший бит равен нулю, то мантисса есть обычное представление числа от 0 до 2 N-1 -1. Если же старший бит равен 1, то число является отрицательным и мантисса представляет собой так называемый дополнительный код числа. Поясним на примере:


Как видно из рисунка, дополнительный код равен разнице между числом 2 N-1 и модулем исходного отрицательного числа (127 (1111111) = 128 (10000000) - |-1| (0000001)). Из этого вытекает, что сумма основного и дополнительного кода одного и того же числа равна 2 N-1 .

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

В итоге можно составить таблицу наиболее используемых целочисленных типов данных:

Другими словами, BYTE - это тип без знака, WORD - беззнаковый короткий тип, а DWORD - беззнаковый длинный тип.

В VC ++ 6.0 1 байт символа, short - 2 байта, int и long - 4 байта, поэтому можно считать, что переменные, определяемые BYTE, WORD, DWORD, - это 1 раздел, 2 байта, 4 слова. Раздел.

То есть: BYTE = unsigned char, WORD = unsigned short, DWORD = unsigned long

DWORD обычно используется для сохранения адреса или сохранения указателя

Разница между словом и словом

Определение WORD и DWORD в основном для: 1. Легко трансплантировать; 2. Более строгая проверка типов

WORD фиксируется на 2 байта, DWORD фиксируется на 4 байта

Int, с разными операционными системами, имеет разное количество байтов, в 32-битной операционной системе - 4 байта, в 16-битной операционной системе - 2 байта

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

Интеллектуальная рекомендация


Michael.W Поговорите о Hyperledger Fabric. Проблема 20 - Подробная индивидуальная сортировка узла с пятью порядками с исходным кодом для чтения.

Michael.W Поговорите о Hyperledger Fabric. Проблема 20 - Подробная индивидуальная сортировка узла с пятью порядками с исходным кодом чтения Fabric Файл исходного кода одиночного режима находится в ord.


Мяу Пасс Матрица SDUT

Мяу Пасс Матрица SDUT Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description Лянцзян получил матрицу, но эта матрица была особенно уродливой, и Лянцзян испытал отвращение. Чт.


Гессенская легкая двоичная структура удаленного вызова

Hessian - это легкая двоичная структура удаленного вызова, официальный адрес документа, в основном он включает протокол удаленного вызова Hessian, протокол сериализации Hessian, прокси-сервер клиента .


TCP Pasket и распаковка и Нетти Solutions

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

Типы данных на языке ассемблера и подробные определения данных

Ассемблер распознает набор основных внутренних типов данных (внутренние типы данных) и описывает их типы в соответствии с размером данных (байты, слова, двойные слова и т. Д.), Подписаны ли они, являются ли они целым или действительным числом. Эти типы в значительной степени перекрываются: например, тип DWORD (32-битное целое число без знака) может быть заменен типом SDWORD (32-битное целое число со знаком).

Некоторые люди могут сказать, что программист использует SDWORD, чтобы сообщить читателю, что это значение подписано, но это не обязательно для ассемблера. Ассемблер оценивает только размер операнда. Поэтому, например, программисты могут указывать только 32-разрядные целые числа как типы DWORD, SDWORD или REAL4.

В следующей таблице приведен список всех внутренних типов данных.Символы IEEE в некоторых записях относятся к стандартному формату вещественных чисел, опубликованному IEEE Computer Society.

Заявление об определении данных

Оператор определения данных (оператор определения данных) резервирует место для хранения переменных в памяти и присваивает дополнительное имя. Оператор определения данных определяет переменную в соответствии с внутренним типом данных (таблица выше).

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

[name] directive initializer [,initializer]…

Ниже приводится пример оператора определения данных:

count DWORD 12345

  • Имя: необязательное имя, присвоенное переменной, должно соответствовать спецификации идентификатора.
  • Псевдо-инструкция: псевдо-инструкция в операторе определения данных может быть BYTE, WORD, DWORD, SBTYE, SWORD или другими типами, перечисленными в приведенной выше таблице. Кроме того, это также может быть традиционная директива определения данных, как показано в следующей таблице.

В определении данных должно быть хотя бы одно начальное значение, даже если значение равно 0. Остальные начальные значения, если есть, разделяются запятыми. Для целочисленных типов данных начальное значение (инициализатор) представляет собой целочисленную константу или целочисленное выражение, которое соответствует типу переменной, например BYTE или WORD.

Если программист не хочет инициализировать переменную (присвоить значение случайным образом), символ? Можно использовать в качестве начального значения. Все начальные значения, независимо от их формата, ассемблер преобразует в двоичные данные. Начальные значения 0011, 0010b, 32h и 50d имеют одинаковое двоичное значение.

Добавьте переменную в программу AddTwo

Программа AddTwo была представлена ​​в предыдущем разделе «Сложение и вычитание целых чисел», а теперь создана ее новая версия, которая называется AddTwoSum. Эта версия вводит переменную сумму, которая появляется в полном листинге программы:

Вы можете установить точку останова в строке 13, выполнять по одной строке за раз и пошагово выполнять программу в отладчике. После выполнения строки 15 наведите указатель мыши на сумму переменной, чтобы просмотреть ее значение. Или откройте окно Watch.Процесс открытия выглядит следующим образом: выберите Windows в меню Debug (в сеансе отладки), выберите Watch и выберите один из четырех доступных вариантов (Watch1, Watch2, Watch3 или Watch4). Затем с помощью мыши выделите переменную суммы и перетащите ее в окно Watch. На следующем рисунке показан пример, где большая стрелка указывает текущее значение суммы после выполнения строки 15.

Определите данные BYTE и SBYTE

Начальное значение вопросительного знака (?) Делает переменную неинициализированной, что означает присвоение значения переменной во время выполнения:

Необязательное имя - это метка, которая определяет смещение от начала переменной, содержащей раздел, до переменной. Например, если value1 находится по смещению 0000 сегмента данных и занимает один байт в памяти, то value2 автоматически находится по смещению 0001:

value1 BYTE 10h
value2 BYTE 20h

val1 DB 255; беззнаковый байт
val2 DB -128; Байт со знаком

1) Несколько начальных значений

Если в одном определении данных используется несколько начальных значений, его метка указывает только смещение первого начального значения. В следующем примере предположим, что смещение списка равно 0000. Тогда смещение 10 равно 0000, смещение 20 равно 0001, смещение 30 равно 0002, а смещение 40 равно 0003:

list BYTE 10,20,30,40

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

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

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

2) Определить строку

Чтобы определить строку, заключите ее в одинарные или двойные кавычки. Наиболее распространенный тип строки - использование нулевого байта (значение 0) в качестве конечного тега, который называется строкой с завершающим нулем. Этот тип строки используется во многих языках программирования:

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

greeting1 BYTE 'G', 'o', 'o', 'd'….etc.

Это очень долго. Строку можно разделить на несколько строк, и нет необходимости добавлять метку к каждой строке:

Шестнадцатеричные коды 0Dh и 0Ah также называются CR / LF (возврат каретки и перевод строки) или символы конца строки. При записи стандартного вывода они перемещают курсор в левую часть строки рядом с текущей строкой.

Символ продолжения строки () соединяет две строки исходного кода в оператор, и он должен быть последним символом строки. Следующие утверждения эквивалентны:

greeting1 BYTE "Welcome to the Encryption Demo program "
и
greeting1
BYTE "Welcome to the Encryption Demo program "

Оператор DUP использует целочисленное выражение в качестве счетчика для выделения пространства хранения для нескольких элементов данных. Этот оператор очень полезен при выделении места для хранения строк или массивов. Он может использовать инициализированные или неинициализированные данные:

Определите данные WORD и SWORD

Директивы WORD (слово определения) и SWORD (слово со знаком определения) выделяют место для хранения одного или нескольких 16-битных целых чисел:

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

Массив 16-битных слов создается путем перечисления элементов или с помощью оператора DUP. Следующий массив содержит набор значений:

myList WORD 1,2,3,4,5

На рисунке ниже представлена ​​схематическая диаграмма массива в памяти при условии, что смещение начальной позиции myList равно 0000. Поскольку каждое значение занимает два байта, приращение его адреса равно 2.

Оператор DUP предоставляет удобный способ объявления массивов:

массив WORD 5 DUP (?); 5 значений, не инициализировано

Определите данные DWORD и SDWORD

Псевдоинструкции DWORD (определение двойного слова) и SDWORD (определение двойного слова со знаком) выделяют место для хранения одного или нескольких 32-битных целых чисел:

Традиционная псевдо-инструкция DD также может использоваться для определения данных двойного слова:

DWORD также можно использовать для объявления переменной, содержащей 32-битное смещение другой переменной. Как показано ниже, pVal содержит смещение val3:

pVal DWORD val3

32-битный массив двойных слов

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

myList DWORD 1,2,3,4,5

На следующем рисунке показана схематическая диаграмма этого массива в памяти.Предположим, что смещение начальной позиции myList равно 0000, а приращение смещения равно 4.

Определить данные QWORD

Псевдо-инструкция QWORD (определить четыре слова) выделяет место для хранения 64-битных (8 байтов) значений:

quad1 QWORD 1234567812345678h

Традиционная псевдо-инструкция DQ также может использоваться для определения данных из четырех слов:

quad1 DQ 1234567812345678h

Определить сжатые данные BCD (TBYTE)

Intel хранит сжатое двоично-десятичное (BCD, двоично-десятичное) целое число в 10-байтовом пакете. Каждый байт (кроме самого старшего) содержит две десятичные цифры. В младших 9 байтах памяти каждый полубайт хранит десятичное число. В старшем байте самый старший бит представляет бит знака числа. Если старший байт равен 80h, число отрицательное; если старший байт равен 00h, число положительное. Диапазон целых чисел: от -999 999 999 999 999 999 до +999 999 999 999 999 999.

Пример В следующей таблице перечислены шестнадцатеричные байты хранения положительных и отрицательных десятичных чисел 1234, в порядке от младшего до самого старшего байта:

Десятичное значение Байты памяти
+1234 34 12 00 00 00 00 00 00 00 00
-1234 34 12 00 00 00 00 00 00 00 80

MASM использует псевдо-инструкцию TBYTE для определения сжатых переменных BCD. Начальное значение константы должно быть в шестнадцатеричном формате, поскольку ассемблер не будет автоматически преобразовывать начальное десятичное значение в код BCD. В следующих двух примерах показаны допустимые и недопустимые выражения десятичного числа -1234:

Второй пример недействителен, поскольку MASM кодирует константы как двоичные целые числа вместо сжатия целых чисел BCD.

Если вы хотите закодировать действительное число в сжатый код BCD, вы можете использовать инструкцию FLD для загрузки действительного числа в стек регистров с плавающей запятой, а затем использовать инструкцию FBSTP для преобразования его в сжатый код BCD. Эта инструкция округляет значение до ближайшего Целое число:

Если posVal равно 1,5, результирующее значение BCD равно 2.

Определить тип с плавающей запятой

В следующей таблице описано минимальное количество значащих цифр и приблизительные диапазоны стандартных вещественных типов:

тип данных эффективное число Приблизительный диапазон
Короткий реальный номер 6 1.18x 10-38 to 3.40 x 1038
Длинное действительное число 15 2.23 x 10-308 to 1.79 x 10308
Действительное число повышенной точности 19 3.37 x 10-4932 to 1.18 x 104932

Псевдо-инструкции DD, DQ и DT также могут определять действительные числа:

Ассемблер MASM включает такие типы данных, как wal4 и real8, которые указывают на то, что значение является действительным числом. Чтобы быть более точным, эти значения представляют собой числа с плавающей запятой с ограниченной точностью и диапазоном. С математической точки зрения точность и размер действительных чисел неограниченны.

Программа сложения переменных

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

Обратите внимание, что три переменные инициализированы ненулевыми значениями (строки с 9 по 11). Добавьте переменные в строки 16-18. Набор инструкций x86 не позволяет напрямую добавлять одну переменную к другой переменной, но позволяет добавлять одну переменную в регистр. Вот почему EAX используется как аккумулятор в строках 16-17:

mov eax,firstval
add eax,secondval

После строки 17 EAX содержит сумму firstval и secondval. Затем в строке 18 добавьте третье значение к сумме в EAX:

Наконец, в строке 19 сумма копируется в переменную с именем sum:

В качестве упражнения всем рекомендуется запускать эту программу в сеансе отладки и проверять каждый регистр после выполнения каждой инструкции. Окончательная сумма должна быть 53335333 в шестнадцатеричной системе.

Если во время сеанса отладки вы хотите, чтобы переменная отображалась в шестнадцатеричном формате, выполните следующие действия: наведите указатель мыши на переменную или зарегистрируйтесь в течение 1 секунды, пока под курсором мыши не появится серый прямоугольник. Щелкните прямоугольник правой кнопкой мыши и выберите во всплывающем меню «Шестнадцатеричный формат».

Little endian

Процессор x86 хранит и извлекает данные в памяти в обратном порядке (от младшего к большему). Младший байт сохраняется в первом адресе памяти, присвоенном данным, а остальные байты сохраняются в последующих последовательных ячейках памяти. Рассмотрим двойное слово 12345678h. Если он сохраняется по смещению 0000, 78h сохраняется в первом байте, 56h сохраняется во втором байте, а оставшиеся байты сохраняются по смещениям адресов 0002 и 0003, как показано на следующем рисунке. .

Некоторые другие компьютерные системы используют прямой порядок байтов (от старшего к младшему). На следующем рисунке показано, что 12345678h хранится в обратном порядке, начиная со смещения 0000.

Объявить неинициализированные данные

.DATA? Директива объявляет неинициализированные данные. При определении большого количества неинициализированных данных директива .DATA? Уменьшает размер компилятора. Например, следующий код является допустимым утверждением:

С другой стороны, скомпилированная программа, сгенерированная следующим кодом, будет иметь дополнительные 20 000 байтов:

Гибридный ассемблер кода и данных позволяет переключать код и данные в программе туда и обратно. Например, вы хотите объявить переменную, чтобы ее можно было использовать только в локальной области программы. В следующем примере между двумя операторами кода вставляется переменная с именем temp:

Хотя присутствие оператора temp прерывает поток исполняемых инструкций, MASM поместит temp в раздел данных и отделит его от раздела кода, который остается скомпилированным. Однако в то же время смешивание директив .code и .data может затруднить чтение программы.

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