Поделиться через


Использование операторов в блоках __asm

Блок, относящийся только к системам Майкрософт

Блок __asm не может использовать определенные операторы C или C++, такие как << оператор. Однако операторы, используемые операторами C и MASM, такими как оператор *, интерпретируются как операторы языка сборки. Например, вне __asm блока квадратные скобки ([ ]) интерпретируются как вложенные подстроки массива, которые C автоматически масштабируются до размера элемента в массиве. Внутри блока __asm они отображаются как оператор индекса MASM, который создает немасштабируемое смещение в байтах из любого объекта данных или метки (а не просто массива). В следующем примере кода демонстрируется различие.

int array[10];

__asm mov array[6], bx ;  Store BX at array+6 (not scaled)

array[6] = 0;         /* Store 0 at array+24 (scaled) */

Первая ссылка на array не масштабируется, вторая — масштабируется. Обратите внимание, что оператор TYPE можно использовать для достижения масштабирования на основе константы. Например, следующие инструкции эквивалентны.

__asm mov array[6 * TYPE int], 0 ; Store 0 at array + 24

array[6] = 0;                   /* Store 0 at array + 24 */

Завершение блока, относящегося только к системам Майкрософт

См. также

Использование C или C++ в блоках __asm