Вопрос

Можно ли получить доступ к 32-разрядным регистрам в C? Если это, как? И если нет, то есть ли способ встроить код сборки в C? Кстати, я использую компилятор Mingw, кстати. Заранее спасибо!

Это было полезно?

Решение

Если вы хотите только прочитать реестр, вы можете просто:

register int ecx asm("ecx");

Очевидно, это привязано к созданию осознания.

Другой способ использует встроенный сборник. Например:

asm("movl %%ecx, %0;" : "=r" (value) : );

Это магазины ecx значение в переменной value. Отказ Я уже разместил аналогичный ответ здесь.

Другие советы

Какие регистры вы хотите получить доступ?

Регистры общего назначения Обычно невозможно получить доступ к C. Вы можете объявить переменные регистра в функции, но это не указывает, какие конкретные регистры используются. Кроме того, большинство компиляторов игнорируют ключевое слово регистрации и оптимизируйте использование регистров автоматически.

В встроенных системах часто необходимо получить доступ Периферийные регистры (например, таймеры, контроллеры DMA, контакты ввода / вывода). Такие регистры обычно отображаются в память, поэтому их можно получить доступ от ...

Определяя указатель:

volatile unsigned int *control_register_ptr = (unsigned int*) 0x00000178;

или с помощью предварительно процессора:

#define control_register (*(unsigned int*) 0x00000178)

Или вы можете использовать сборку сборки.

Для использования язык ассемблера, есть (по крайней мере) три возможности:

  1. Отдельный исходный файл .asm, который связан с программой. Процедуры сборки вызываются из C вроде нормальных функций. Это, вероятно, является наиболее распространенным методом, и оно обладает тем преимуществом, что функции зависящие от HW отделены от кода приложения.
  2. Встроенная сборка
  3. Внутренние функции, которые выполняют индивидуальные языковые инструкции по сборке. Это имеет то преимущество, что инструкция по языку Ассамблеи может напрямую получить доступ к любым переменным C.

Вы можете встроить сборку в C

http://en.wikipedia.org/wiki/inline_assembler

Пример из Википедии

extern int errno;

int funcname(int arg1, int *arg2, int arg3)
{
  int res;
  __asm__ volatile(
    "int $0x80"        /* make the request to the OS */
    : "=a" (res)       /* return result in eax ("a") */
      "+b" (arg1),     /* pass arg1 in ebx ("b") */
      "+c" (arg2),     /* pass arg2 in ecx ("c") */
      "+d" (arg3)      /* pass arg3 in edx ("d") */
    : "a"  (128)       /* pass system call number in eax ("a") */
    : "memory", "cc"); /* announce to the compiler that the memory and condition codes have been modified */

  /* The operating system will return a negative value on error;
   * wrappers return -1 on error and set the errno global variable */
  if (-125 <= res && res < 0) {
    errno = -res;
    res   = -1;
  }  
  return res;
}

Я не думаю, что вы можете сделать их напрямую. Ты могу Встроенная сборка с кодом, как:

asm (
    "movl $0, %%ebx;"
    "movl $1, %%eax;"
); 

Если вы находитесь на 32-битном процессоре и используете адекватный компилятор, то да. Точное средство зависит от конкретной системы и компилятора, для которого вы программируете, и, конечно, это сделает ваш код как можно неотъемлемому.

В вашем случае, используя Mingw, вы должны посмотреть на Синтаксис встроенного монтажа GCC.

Вы можете конечно. «Mingw» (GCC) позволяет (как другие компиляторы) встроенную сборку, как уже показывают другие ответы. Какая сборка, это зависит от ЦП вашей системы (Проб. 99,99%, что это X86). Это делает вашу программу не портативной на других процессорах (не так уж плохо, если вы знаете, что вы делаете и почему).

Соответствующая страница, говорящая о сборке для GCC здесь и здесь, и если вы хотите, также здесь. Отказ Не забывайте, что он не может быть конкретным, поскольку это зависит от архитектуры (GCC может компилировать для нескольких процессоров)

Как правило, нет необходимости получать доступ к регистрами процессора из программы, написанной на языке высокого уровня: языки высокого уровня, такие как C, Pascal и т. Д., Где именно изобретены для аннотации в базовой машине и представляют программу больше независимый.

Я подозреваю, что вы пытаетесь что-то выполнить, но не знаете, как использовать обычный способ сделать это.

Многие доступ к регистрам скрыты на конструкциях более высокого уровня или в системе или библиотечных вызовах, которые позволяют избежать кодирования «грязной части». Расскажите нам больше о том, что вы хотите сделать, и мы можем предложить вам альтернативу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top