Резюме:
word [ecx]
, когда размер операнда не подразумевается другим операндом. (В противном случае [ecx]
в порядке). word ptr [ecx]
, когда размер операнда не подразумевается другим операндом. (В противном случае [ecx]
в порядке). Каждый из них задыхается от синтаксиса другого.
ВНИМАНИЕ: Это очень странная область без каких-либо стандартов ISO или легкодоступные таблицы BNF; и я не специалист по прохождению через минные поля проприетарного синтаксиса MASM.
В вашем случае нет разницы, но оператор PTR может означать в других случаях:
http://www.c-jump.com/CIS77/ASM/Instructions/I77_0250_ptr_pointer.htm
В общем случае оператор оператора PTR принудительно обрабатывает выражение как указатель указанного типа:
blockquote>.DATA num DWORD 0 .CODE mov ax, WORD PTR [num] ; Load a word-size value from a DWORD
Я думаю, что существуют также ассемблерные требования (nasm / tasm / other asm), а использование «byte ptr» более переносимо.
Также проверьте раздел 4.2.16 в книге из Индии и разделы 8.12.3 (и 8.11.3 «Типовые конфликты») в «
ОБНОВЛЕНИЕ: спасибо Фрэнку Котлеру, кажется, что NASM «использует вариант синтаксиса сборки Intel» (wiki), который не включает операцию PTR.
UPDATE1: имеется оригинальная «РУКОВОДСТВО ПО ЭКСПЛУАТАЦИИ ЯЗЫКА ASM86» от Intel, 1981-1983, оператор PTR определен на pa ge 4-15:
Оператор PTR
Синтаксис: введите имя PTR
Описание: Оператор PTR используется для определения ссылки на память с помощью определенный тип. Ассемблер определяет правильную инструкцию для сборки на основе типа операндов в инструкции. Существуют определенные случаи, когда вы можете указать операнд, который не имеет типа. Эти случаи связаны с использованием числовых или регистровых выражений. Здесь оператор PTR используется для указания типа операнда. Следующие примеры иллюстрируют это использование:
blockquote>MOV WORD PTR [BX], 5 ;set word pointed to by BX = 5 INC DS:BYTE PTR 10 ;increment byte at offset 10 ;from DS
Эта форма также может использоваться для переопределения атрибута type переменной или метки. Если, например, вы хотели получить доступ к уже определенной переменной слова как два байта, вы могли бы закодировать следующее:
blockquote>MOV CL, BYTE PTR AWORD ;get first byte MOV CL, BYTE PTR AWORD + 1 ;get second byte
Значения полей:
Тип Это поле может иметь одно из следующих значений: BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR
name Это поле может быть: 1. Имя переменной. 2. Имя метки. 3. Адрес или регистр. 4. Целое число, которое представляет смещение.
blockquote>UPDATE2: Благодаря Uni из бета-накопителя Stuttgart! Существует оригинальное руководство MACRO-86 от Microsoft (1981). Страница 3-7:
Оператор PTR можно использовать другим способом, чтобы сохранить байт при использовании прямых ссылок. Если вы определили FOO как постоянную константу, вы можете ввести оператор:
blockquote>MOV [BX],FOO
Возможно, вы захотите сослаться на FOO как на немедленный байт. В этом случае вы можете ввести любой из операторов (они эквивалентны):
blockquote>MOV BYTE PTR [BX],FOO MOV [BX],BYTE PTR FOO
Эти утверждения указывают MACRO-86, что FOO является байтом немедленным. Создается меньшая команда.
blockquote>И страница 3-16:
Операторы переопределения
Эти операторы используются для переопределения сегмента , смещение, тип или расстояние между переменными и метками.
Указатель (PTR)
blockquote>
PTR Оператор PTR переопределяет тип (BYTE, WORD , DWORD) или расстояние (NEAR, FAR) операнда.
- новый атрибут; новый тип или новое расстояние.
- это операнд, атрибут которого должен быть переопределен.
Самое важное и частое использование для PTR заключается в том, чтобы убедиться, что MACRO-86 понимает какой атрибут должен иметь выражение. Это особенно верно для атрибута type. Всякий раз, когда вы размещаете ссылки в своей программе, PTR очищает расстояние или тип выражения. Таким образом, вы можете избежать фазовых ошибок.
Второе использование PTR заключается в доступе к данным по типу, отличному от типа определения переменной. Чаще всего это происходит в структурах. Если структура определена как WORD, но вы хотите получить доступ к элементу в виде байта, PTR является оператором для этого. Однако гораздо более простой способ - ввести второй оператор, который также определяет структуру в байтах. Это устраняет необходимость использования PTR для каждой ссылки на структуру. См. Директиву LABEL в разделе 4.2.1 «Директивы памяти».
Примеры:
blockquote>CALL WORD PTR [BX][SI] MOV BYTE PTR ARRAY, (something) ADD BYTE PTR FOO,9
После прочтения этого и поиска некоторых определений синтаксиса из этих документов я думаю, что запись PTR является обязательной. Использование
mov BYTE [ecx], 0
неверно в соответствии с руководством MACRO-86.