Recuerdo haber visto una forma de utilizar el ensamblado extendido de gcc en línea para leer un valor de registro y almacenarlo en una variable de C. No puedo, por mi vida, recordar cómo formar la declaración de ASM. Cualquier ayuda es muy apreciada.Lectura de un valor de registro en una variable de C
Respuesta
Te das cuenta de que leerá una variable, calculará el seno y luego almacenará el resultado en una segunda variable. –
@Samuel: ese fue un ejemplo de la sintaxis solamente. –
Downvoted porque este es un ejemplo de cómo usar el ensamblaje extendido en GCC, no cómo obtener el valor de un registro específico en una variable específica, que es lo que solicitó OP. Al especificar los registros usando '% 0' y'% 1', GCC elegirá el registro en cuestión en su nombre. No hay garantía de que elija el registro que está esperando. –
no sé acerca de gcc, pero en VS esta es la forma:
int data = 0;
__asm
{
mov ebx, 30
mov data, ebx
}
cout<<data;
Esencialmente, se trasladaron los datos en ebx
a la variable de data
.
x86-only, por supuesto. Los compiladores de Microsoft para x64 e Itanium no son compatibles con el ensamblaje en línea. – ephemient
Creo que el conjunto se traducirá a mov ebx, 30 mov dword ptr [data], ebx – Sridarshan
¿Por qué no simplemente 'mov data, 30'? – Houssni
Aquí es una manera de conseguir EBX:
int main()
{
int i;
asm("\t movl %%ebx,%0" : "=r"(i));
return i + 1;
}
El resultado:
main:
subl $4, %esp
#APP
movl %ebx,%eax
#NO_APP
incl %eax
addl $4, %esp
ret
Editar:
El "= r" (i) es una restricción de salida, diciéndole al compilador que la primera salida (% 0) es un registro que debe colocarse en la variable "i". En este nivel de optimización (-O5), la variable i nunca se almacena en la memoria, sino que se mantiene en el registro eax, que también es el registro del valor de retorno.
Usaría la restricción '= rm' en lugar de' = r'. El optimizador del compilador intentará elegir la mejor ruta. Si el ensamblador en línea pasó a estar en una situación de falta de registro, '= r' puede obligarlo a generar un código inferior al óptimo. '= rm' le daría al optimizador la oportunidad de usar una referencia de memoria si resulta ser la mejor opción. En este ejemplo simple no será un problema, pero si el código está en una situación más compleja, entonces podría ser beneficioso dar opciones al compilador. –
Esto moverá el registro del puntero de la pila a la variable sp.
intptr_t sp;
asm ("movl %%esp, %0" : "=r" (sp));
basta con sustituir 'esp' con el actual registro que está interesado en (pero asegúrese de no perder el %%) y 'sp' con su variable.
Yendo en una dirección diferente que otras respuestas hasta ahora, ya que no estoy seguro de lo que quieres.
GCC Manual § 5.40 Variables in Specified Registers
register int *foo asm ("a5");
Aquí
a5
es el nombre del registro que se debe utilizar y hellip;Naturalmente, el nombre del registro depende de la CPU, pero esto no es un problema, ya que los registros específicos son más útiles con las instrucciones explícitas del ensamblador (consulte Extended Asm). Ambas cosas generalmente requieren que usted condicionalice su programa de acuerdo con el tipo de CPU.
La definición de dicha variable de registro no reserva el registro; permanece disponible para otros usos en lugares donde el control de flujo determina que el valor de la variable no es en vivo.
GCC Manual § 3.18 Options for Code Generation Conventions
-ffixed-
regTratar el registro llamado reg como un registro fijo; el código generado nunca debería referirse a él (excepto tal vez como un puntero de pila, puntero de marco o en algún otro rol fijo).
Esto puede replicar la respuesta de Richard en una manera más sencilla,
int main() {
register int i asm("ebx");
return i + 1;
}
aunque esto es más bien insignificante, ya que no tiene idea de lo que hay en el registro ebx
.
Si la combinación de ambos, con la elaboración de este gcc -ffixed-ebx
,
#include <stdio.h>
register int counter asm("ebx");
void check(int n) {
if (!(n % 2 && n % 3 && n % 5)) counter++;
}
int main() {
int i;
counter = 0;
for (i = 1; i <= 100; i++) check(i);
printf("%d Hamming numbers between 1 and 100\n", counter);
return 0;
}
puede asegurarse de que una variable C utiliza siempre reside en un registro para el acceso rápido y tampoco obtendrá una paliza por otro código generado. (Convenientemente, ebx
es destinatario de la llamada de guardado bajo x86 habituales convenciones de llamada, por lo que incluso si se clobbered mediante llamadas a otras funciones compiladas sin -ffixed-*
, se debe conseguir restaurado también.)
Por otro lado, esto definitivamente no es portátil, y generalmente tampoco es un beneficio de rendimiento, ya que está restringiendo la libertad del compilador.
de la propia documentación del CCG: http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
- 1. leer un valor en el registro C++
- 2. Variable de lectura de Web.Config
- 3. Lectura de un entero en una variable local en MIPS
- 4. C# devuelve una variable como solo lectura de get; conjunto;
- 5. Lectura del valor del conjunto de datos en una variable gnuplot (inicio de la serie X)
- 6. Cómo eliminar un valor de registro en C#
- 7. Lectura de un valor xml en una propiedad para Wix
- 8. Lectura en 16 bits de un registro de 32 bits
- 9. Lectura de una variable JSP desde JavaScript
- 10. Cómo obtener un valor de una variable de JSON
- 11. lectura variable de entorno fiesta
- 12. Inicializando un valor a través de una variable de sesión
- 13. Cómo generar un valor de variable en el registro de MSBuild
- 14. ¿Cómo verificar si existe un valor de registro usando C#?
- 15. Ejecutando funciones dependiendo del valor de una variable - C++
- 16. Lectura de la variable en Perl
- 17. convirtiendo un nombre de variable en una cadena en C++
- 18. Obtener valor de un DataSet en una variable
- 19. poniendo una variable php en un valor de formulario HTML
- 20. valor de una variable utilizando WinDbg
- 21. C# Obtener el tipo de una variable pública basada en un valor de Enum
- 22. Cómo asignar un valor de cadena a una variable de cadena en C++
- 23. Objective-C: ¿La variable de solo lectura no es asignable?
- 24. alerta de un valor de variable
- 25. Lectura de un archivo de imagen en C/C++
- 26. ¿Cuál es un buen ejemplo de uso de variable de registro en C?
- 27. Lectura de un archivo de texto en C#
- 28. ¿Puede un compilador C/C++ almacenar en caché legalmente una variable en un registro a través de una llamada de biblioteca pthread?
- 29. Lectura de una matriz de bytes C# en Java
- 30. lectura/registro sin bloqueo de una secuencia HTTP
Y ¿cómo saber lo que está en EBX cuando el código C comienza a ejecutar? – florin