#c #linux #assembly #riscv
Вопрос:
В настоящее время я работаю над riscv64 linux на основе SiFive Freedom Unleashed SDK.
Я хотел бы реализовать инструкцию pause с помощью расширенной инструкции asm, встроенной в мой код на языке Си. Ниже приведен пример:
#include <stdio.h>
#include <stdlib.h>
int main(){
int a = 10;
__asm__ volatile("rep;nop;"::);
return 0;
}
Когда я попытался скомпилировать программу, ассемблер выдает ошибку, в которой говорится: «Ошибка: непризнанный код операции «представитель»».
Я попытался заменить его __asm__ __volatile__ ("pause"::);
, и возникла аналогичная ошибка: «Ошибка: непризнанный код операции «пауза»».
В соответствии с Руководством по набору инструкций RISC-V:
ПАУЗА кодируется как команда ЗАБОРА с pred=W, succ=0, fm=0, rd=x0 и rs1=x0
Поэтому я предполагаю, что правильный способ реализации начинается с __asm__ volatile("fence")
, но как реализовать ограничения (pred=W, succ=0, fm=0, rd=x0 и rs1=x0)?
Если мое понимание неверно, не мог бы кто-нибудь, пожалуйста, сказать мне, как реализовать инструкцию pause с расширенным asm?
Заранее спасибо.
Комментарии:
1.
rep;nop
это то, какpause
инструкция x86 ( felixcloutier.com/x86/pause ) может быть закодирован с помощью старых ассемблеров x86, которые не распознаютpause
мнемонику. Это мнемоника x86, а не RISC-V. Конечно, ассемблер RISC-V не распознаетrep
мнемоническую ( felixcloutier.com/x86/rep:repe:repz:repne:repnz ). Я бы посоветовал убрать это отвлечение от вашего вопроса.2. Я понимаю, почему ваш ассемблер RISC-V не распознает мнемонику RISC-V
pause
, если только она не новая или не требуется какая-march
-либо опция. (встроенный ассемблер clang trunk не справляется с этим: godbolt.org/z/o6rxK7GE5 ). Вы могли бы закодировать его вручную.word 0x...
.3. @PeterCordes: Спасибо за ваш ответ. Что касается кодирования вручную, вы имели в виду asm volatile(«.word 0x…»)?
4. Да, но, конечно, вам нужно проверить руководство RISC-V, чтобы выяснить, какое 32-разрядное шестнадцатеричное значение следует использовать, исходя из сведений о том, для каких полей и для
fence
каких .5. @PeterCordes re: кодирование вручную: приятно знать, что эквивалент установки множества переключателей и кнопки «загрузить» все еще доступен в эту современную эпоху. Я боялся, что это исчезло еще в 1970-х годах!