Вроде бы как в нотации ATT $ перед операндом указывает на то, что надо использовать содержимое регистра, например:
add $2, $9, $8
Т.е. содержимое регистра 8 сложили с содержимым регистра 9, результат поместили в регистр 2.
Без амперсанда указывается непосредственно операнд, типа:
addiu $2, $9, 8
Т.е. 8 сложили с содержимым регистра 9, результат поместили в регистр 2.
Но с некоторыми командами сразу и не поймешь, что да как. Пример из доки:
unsigned mips_cycle_counter_read()
{
unsigned cc;
asm volatile("mfc0 %0, $9" : "=r" (cc));
return (cc << 1);
}
Получается, что $9 это указание читать из регистра номер 9 CP0? Т.е. я указываю не адрес/номер/смещение регистра из CP0, а именно его имя? Аналогично применяются команды mfc1, mfc2, rdhwr?
Просто, когда читаешь в доке, например, описание команды rdhwr, то складывается впечатление, что надо указывать номер загружаемого регистра. Я то и пробовал этот номер указывать либо непосредственно, либо через какой-нибудь регистр в ЦПУ. Таким макаром что-то не очень получалось.