Что такое "=qm" в расширенном ассемблере

Я просматривал предоставленную Intel эталонную реализацию RDRAND инструкция. На этой странице приведено руководство по внедрению программного обеспечения для цифрового генератора случайных чисел (DRNG), а код взят из примеров программного кода для цифрового генератора случайных чисел.

Ниже приводится соответствующая часть от Intel. Он читает случайное значение и помещает его в val и устанавливает флаг переноса на успех.

char rc;
unsigned int val;

__asm__ volatile(
    "rdrand %0 ; setc %1"
    : "=r" (val), "=qm" (rc)
);

// 1 = success, 0 = underflow
if(rc) {
    // use val
    ...
}

Соори нужно спросить. Я не думаю, что это было описано в GNU Extended Assembler, и поиск "=qm" приводит к ложным попаданиям.

Что это "=qm" значит в расширенном ассемблере?

3 ответа

Решение

То, на что вы смотрите - это ограничение встроенного ассемблера. Вот этот (=qm) объединяет три флага, которые указывают:

  • =: Операнд только для записи - его предыдущее значение не имеет значения.
  • q: Операнд должен быть в регистре a, b, c, или же d (это не может быть в esi, например).
  • m: Операнд может быть помещен в память.

qm, вероятно, означает, что 1-байтовый 8-битный mem =qm будет допустимым ограничением для сохранения 1-байтового результата. Посмотрите, что хочет setc

http://web.itu.edu.tr/~aydineb/index_files/instr/setc.html

reg8 и mem8

поскольку мы знаем только регистры eax, ebx edx ecx .. a,b,c,d, которые могут быть использованы ссылкой q, потому что к ним можно обращаться с помощью младшего байта al dl cl... При объединении qm мы получаем mem8 . м означало память. Это то, что я имел в виду

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

Спикально я прочитал, что это для i7 Quadcore.

Это откуда вы взяли этот код?

Это простой индикатор значения для переменного синтаксиса.

Другие вопросы по тегам