Использование операторов в блоках __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 */
Завершение блока, относящегося только к системам Майкрософт