Pregunta

¿Es posible acceder a los registros de 32 bits en C? Si es así, ¿cómo? Y si no es así, ¿hay alguna forma de código Asamblea incrustar en C? I `m usando el compilador MinGW, por cierto. Gracias de antemano!

¿Fue útil?

Solución

Si sólo desea leer el registro, puede simplemente:

register int ecx asm("ecx");

Es evidente que está ligado a la instanciación.

Otra forma es utilizar inline montaje. Por ejemplo:

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

Esto almacena el valor ecx en el value variable. Ya he publicado una respuesta similar aquí .

Otros consejos

¿Qué registros que desea acceder?

registros Aplicaciones generales normalmente no se puede acceder a partir de C. Se pueden declarar variables de registro en una función, pero que no especifica qué registros específicos utilizados. Además, la mayoría de los compiladores ignoran la palabra clave de registro y optimizar el uso de registro de forma automática.

En sistemas embebidos, a menudo es necesaria para acceder periférica registros (tales como temporizadores, controladores de DMA, I / O pins). Tales registros son normalmente asignado en memoria, por lo que se puede acceder desde C ...

mediante la definición de un puntero:

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

o mediante el uso de pre-procesador:

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

O bien, puede utilizar la rutina Asamblea.

Para poder utilizar El lenguaje ensamblador , hay (al menos) tres posibilidades:

  1. Un archivo fuente asm separada que está vinculado con el programa. Las rutinas de montaje son llamados desde C como funciones normales. Este es probablemente el método más común y tiene la ventaja de que las funciones HW-dependiente se separan del código de aplicación.
  2. En-línea de montaje
  3. funciones intrínsecas que se ejecutan las instrucciones en lenguaje ensamblador individuales. Esto tiene la ventaja de que la instrucción de lenguaje ensamblador puede acceder directamente a cualquier variable C.

Puede incrustar el montaje en C

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

ejemplo de Wikipedia

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;
}

No creo que se puede hacer directamente. Usted puede do línea de montaje con un código como:

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

Si usted está en un procesador de 32 bits y el uso de un compilador adecuado, entonces sí. El medio exacto depende del sistema en particular y el compilador que se está programando para, y por supuesto esto hará que su código sobre como no portables como puede ser.

En su caso utilizando MinGW, usted debe buscar en la GCC inline montaje sintaxis .

Puede, por supuesto. "MinGW" (gcc) permite (como otros compiladores) en línea de montaje, como otras respuestas ya muestran. Cuyo conjunto, que depende de la CPU de su sistema (prob. 99,99% que es x86). Esto hace que su programa no obstante portátil en otros procesadores (no es tan malo si sabe lo que está haciendo y por qué).

La página correspondiente hablando de montaje para gcc es aquí y aquí , y si lo desea, también aquí . No se olvide que no puede ser específica, ya que es dependiente de la arquitectura (gcc puede compilar para varias CPUs)

en general no hay necesidad de acceder a los registros de la CPU de un programa escrito en un lenguaje de alto nivel: lenguajes de alto nivel, como C, Pascal, etc., donde, precisamente, inventó con el fin de abstraer la máquina subyacente y rinde un programa más independiente de la máquina.

i sospecha que está intentando realizar algo, pero no tienen idea de cómo utilizar de manera convencional para hacerlo.

muchos el acceso a los registros están ocultos en las construcciones de nivel superior o en el sistema o llamadas de biblioteca que le permite evitar la codificación de la "sucia-parte". decirnos más acerca de lo que quiere hacer y nosotros le podemos sugerir una alternativa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top