2015-03-09 3 views
0

Недавно я наткнулся на эти инструкции ASM и попытался выяснить, что они делают. Я просмотрел несколько сборников ARM (например, THIS) и смог выяснить, что делают несколько инструкций.Что делают инструкции по сборке ARM?

Например, MRS (Move to Register from Status) копирует статус из PSR (Program Status Register) Зарегистрируйтесь на %0 (что, я считаю, регистрируется 0).

Я не могу понять, что такое : "=r" (Cs) и другие подобные инструкции.

UINT32 Cp; 
if((Cp & 0x1) == 0) 
{ 
    UINT32 Cs; 
    __asm 
    (
    " MRS %0, PSR\n" 
    "BIC %1, %2, #0x80\n" 
    "cpsie i" 
      : "=r" (Cs), "=r" (Cp) 
      : "r" (Cs) 
    ); 
} 

Может кто-нибудь объяснить это?

Редактировать 1: Это функция выпуска GlobalLock. cpsie i позволяет прерываниям.

ответ

4

Это не ассемблер, это встроенный ассемблер, встроенный в код C. Предположительно, есть какой-то контекст вокруг этого кода или где вы его нашли, что должно это предложить.

См., Например, документы GCC Extended Asm.

Этот встроенный модуль испускает ассемблер (который вы уже идентифицировали) в середине некоторого кода на C, а также сообщает компилятору, что сделал ассемблер: в частности, какие регистры были использованы или повреждены.

Последние две строки указывают, какие переменные используются в ассемблере, и как они влияют

  1. "=r" (Cs) - переменная Cs используется как выходной регистр, называемый %0 в коде сборки, и перезаписаны
  2. "=r" (Cp) - переменная Cp используется как выходной регистр, называемый %1 в коде сборки, и перезаписывается
  3. "r" (Cs) - CS используется в качестве входного регистра, называется %2 в коде сборки

%0/1/2 Обратите внимание, что это только позиции записей в списке ввода/вывода, начиная с нуля.

+0

Спасибо, бесполезно. Да, это внутри функции, которая должна очищать GlobalLock, и, как вы уже сказали, она кажется неправильной и не работает так, как она должна быть. Я пытаюсь выяснить, что не так, и попытаться это исправить. Я отредактирую свой вопрос, чтобы добавить больше контекста. Я не могу поддержать ваш ответ, поскольку у меня нет необходимой репутации. – Sarvavyapi

+0

У вас неверная интерпретация этих строк. Первая строка указывает, что как 'Cs', так и' Cp' используются как выходы регистров. Вторая строка, обозначенная как 'Cs', также используется в качестве входа регистра. –

+0

О да, привет, я совершенно неправильно понял, что – Useless

0

Те, кто похож на ассемблерные директивы. Из кода, который вы указали, похоже, что вы пытаетесь расшифровать язык ассемблера, выпущенный компилятором. Эти «инструкции», скорее всего, говорят о компиляторе, чтобы испускать коды операций, соответствующие целевой машине. Это позволяет компилятору front-end оставаться относительно простым, но позволяет компилятору испускать (и оптимизировать) конкретные инструкции для определенных целей.

Смежные вопросы