#rust #raspberry-pi #arm
Вопрос:
Я хотел запустить некоторые инструкции по сборке ARM в своем коде rust, так как я нацелен на raspberry pi. Проблема в том, что rust жалуется на следующее:
unsafe {
asm!("ldr r0, =0x3f200000");
}
Я получаю error: Only valid when first operand is register
. Но r0
является ли регистр ARM (?).
Кроме того, вместо использования необработанных адресов я хотел бы использовать константы, но я также не могу заставить это работать, и после прочтения документации rust по этому вопросу я все еще не могу понять предполагаемый синтаксис.
Комментарии:
1. Я не говорю на Rust (или aarch64), но, просматривая документы, мне интересно, могли бы вы сделать что-то вроде
let x: u64; unsafe { asm!("ldr {0}, =0x3f200000", out(reg) x); }
?2. Спасибо! Оба решения работают, принятый ответ и это, но я хотел бы знать, почему это работает, и использовать его для вставки констант в код вместо исходного адреса. ПРАВКА: Теперь я понимаю, что этот код помещает содержимое в адрес
0x3f200000
в переменную x правильно?3. «чтобы вставить константы» — По той ссылке, которую вы дали, я ожидаю, что вы могли бы сделать что-то вроде
asm!("ldr {0}, ={number}", out(reg) x, number = const 0x3f200000);
. Очевидно, я этого не пробовал. «этот код помещает содержимое по адресу 0x3f200000 в переменную x правильно?» — Это было бы моим ожиданием. Опять же, не программист aarch64. Что касается того, что находится по этому адресу? Google дал мне это , в котором есть несколько ссылок. Если вы собираетесь читать 64 бита, убедитесь, что то, что там хранится, имеет длину 64 бита, иначе вы в конечном итоге будете читать мусор.4. Я только что попробовал это сделать, и это работает, мне не нравится тот факт, что я не могу использовать эту константу где-либо еще в коде, хотя, думаю, именно так это и работает. И да, я забыл, что мне нужно было прочитать u64, но, к счастью, в последнем комментарии используется тип u64 переменной, которую задает код.
Ответ №1:
r0
является допустимым именем реестра в режиме Aarch32. Если вы используете Rust в режиме Aarch64, вам следует использовать ldr x0, =0x3f200000
или ldr w0, =0x3f200000