elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  (Consulta) Intercambiador de variables en ensamblador (sintaxis de AT&T)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: (Consulta) Intercambiador de variables en ensamblador (sintaxis de AT&T)  (Leído 7,531 veces)
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
(Consulta) Intercambiador de variables en ensamblador (sintaxis de AT&T)
« en: 14 Diciembre 2015, 13:31 pm »

Hola, muy buenas. Estoy aprendiendo ensamblador y para ello lo estoy enlazando con las librerías estandar de C++. No sé mucho sobre la sintaxis de intel (estoy aprendiendo NASM), pero he conseguido el siguiente código (el cual está guardado en el archivo intercambiar.s)

Código
  1. .file "intercambiar.cpp"
  2. .text
  3. .globl __Z12intercambiarPiS_
  4. .def __Z12intercambiarPiS_; .scl 2; .type 32; .endef
  5. __Z12intercambiarPiS_:
  6. LFB0:
  7. .cfi_startproc
  8. pushl %ebp
  9. .cfi_def_cfa_offset 8
  10. .cfi_offset 5, -8
  11. movl %esp, %ebp
  12. .cfi_def_cfa_register 5
  13.  
  14. movl 8(%ebp), %eax
  15. movl 12(%ebp), %ebx
  16. movl %eax, 12(%ebp)
  17. movl %ebx, 8(%ebp)
  18.  
  19. popl %ebp
  20. .cfi_restore 5
  21. .cfi_def_cfa 4, 4
  22. ret
  23. .cfi_endproc
  24. LFE0:
  25. .ident "GCC: (GNU) 4.8.1"
  26.  

Lo que he hecho es conseguir el código base gracias al compilador g++ de MinGW y añadir el intercambiador de variables.

Lo que sería el intercambiador es el siguiente:

Código
  1. pushl %ebp
  2. movl %esp, %ebp
  3.  
  4. movl 8(%ebp), %eax
  5. movl 12(%ebp), %ebx
  6. movl %eax, 12(%ebp)
  7. movl %ebx, 8(%ebp)
  8.  
  9. popl %ebp
  10. ret

Lo que he hecho después es ejecutar el siguiente comando:
Código:
g++ -Wall -c intercambiador.s

Con el, he obtenido un fichero objeto

Ahora bien, cuando ejecuto el programa principal, no me intercambia las variables.

Aquí tenéis el programa principal en C++:

Código
  1. #include <iostream>
  2.  
  3. void intercambiar(int* lpnValorA, int* lpnValorB);
  4.  
  5. int main() {
  6. int nValorA, nValorB;
  7.  
  8. std::cout << "Introduzca el valor A: ";
  9. std::cin >> nValorA;
  10. std::cout << "Introduzca el valor B: ";
  11. std::cin >> nValorB;
  12.  
  13. intercambiar(&nValorA, &nValorB);
  14.  
  15. std::cout << "\nnValorA = " << nValorA << std::endl;
  16. std::cout << "nValorB = " << nValorB;
  17.  
  18. std::cin.get();
  19. std::cin.get();
  20. return 0;
  21. }

Pues eso, el intercambiador no hace nada

Soy novato en ASM, por lo que no seáis duros :D Gracias


« Última modificación: 14 Diciembre 2015, 20:31 pm por class_OpenGL » En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
fary


Desconectado Desconectado

Mensajes: 1.076



Ver Perfil WWW
Re: (Consulta) Intercambiador de variables en ensamblador (sintaxis de intel)
« Respuesta #1 en: 14 Diciembre 2015, 19:28 pm »

Eso es sintaxis AT&T.

¿Porqué no usar ASM Inline?

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int var1 = 1;
  5. int var2 = 2;
  6.  
  7. int main()
  8. {
  9.  
  10.    asm(".intel_syntax noprefix");
  11.    asm("mov eax, [_var1]");
  12.    asm("mov ecx, [_var2]");
  13.  
  14.    asm("mov [_var1] , ecx");
  15.    asm("mov [_var2], eax");
  16.    asm(".att_syntax noprefix");
  17.  
  18.    printf("Valor de var1: %i\n", var1);
  19.    printf("Valor de var2: %i\n", var2);
  20.  
  21.    return 0;
  22. }


En línea

Un byte a la izquierda.
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) Intercambiador de variables en ensamblador (sintaxis de intel)
« Respuesta #2 en: 14 Diciembre 2015, 19:32 pm »

¿Por qué usas el registro ecx? ¿Podrías usar el ebx? Por cierto, no usé inline porque quería acostumbrarme a los ficheros objeto y a enlazar. En cualquier caso, ¿no debería mi código funcionar?
« Última modificación: 14 Diciembre 2015, 19:37 pm por class_OpenGL » En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
fary


Desconectado Desconectado

Mensajes: 1.076



Ver Perfil WWW
Re: (Consulta) Intercambiador de variables en ensamblador (sintaxis de intel)
« Respuesta #3 en: 14 Diciembre 2015, 20:16 pm »

No entiendo esa sintaxis pero vamos quiero pensar que lo que tu estas haciendo es mover los datos a eax y no a la direccion a la que apunta  :xD

osea estas haciendo esto:

mov eax, 1
mov ebx, 2

En lugar de esto:

mov [eax],  1
mov [ebx] , 2

Prueba así:

Código
  1. pushl %ebp
  2.  
  3. movl %esp, %ebp
  4.  
  5. movl 8(%ebp), %eax
  6.  
  7. movl 12(%ebp), %ebx
  8.  
  9. movl %ecx, 12(%ebp)
  10.  
  11. movl (%eax), %ecx
  12.  
  13. movl %ecx, 8(%ebp)
  14.  
  15. movl (%ebx), %ecx
  16.  
  17.  
  18. popl %ebp
  19.  
  20. ret
  21.  

Repito, no se esa sintaxis, puede que hasta sea erronea.

Lo de usar ECX en lugar de EBX es por que me apetecia  :P

saludos.
« Última modificación: 14 Diciembre 2015, 20:19 pm por fary » En línea

Un byte a la izquierda.
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) Intercambiador de variables en ensamblador (sintaxis de intel)
« Respuesta #4 en: 14 Diciembre 2015, 20:30 pm »

Si, es que es alrevés xD

No entiendo por qué tiene que ser tan largo. En teoría, muevo las dos variables a los registros de propósito general y después les doy a las variables los valores intercambiados.

Muevo la primera a eax, muevo la seguda a ebx, le doy a la primera ebx y le doy a la segunda eax... No veo por qué no funciona en mi código. He conseguido que funcione con NASM con un código similar
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
fary


Desconectado Desconectado

Mensajes: 1.076



Ver Perfil WWW
Re: (Consulta) Intercambiador de variables en ensamblador (sintaxis de AT&T)
« Respuesta #5 en: 14 Diciembre 2015, 20:33 pm »

Has probado mi código arreglando mi error?  :rolleyes:

En línea

Un byte a la izquierda.
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) Intercambiador de variables en ensamblador (sintaxis de AT&T)
« Respuesta #6 en: 14 Diciembre 2015, 21:05 pm »

Es extraño. Tampoco funciona xD

Esta es la salida obtenida:

Código:
Introduzca el valor A: 10
Introduzca el valor B: 20

nValorA = 10
nValorB = 20
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
fary


Desconectado Desconectado

Mensajes: 1.076



Ver Perfil WWW
Re: (Consulta) Intercambiador de variables en ensamblador (sintaxis de AT&T)
« Respuesta #7 en: 14 Diciembre 2015, 21:57 pm »

Debuggea el código a ver en que falla.  :rolleyes:
En línea

Un byte a la izquierda.
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) Intercambiador de variables en ensamblador (sintaxis de AT&T)
« Respuesta #8 en: 15 Diciembre 2015, 01:36 am »

CREO QUE POR FIN SÉ LO QUE FALLA, pero el problema es que no sé como solucionarlo... xD

Bueno, el problema es que estoy intercambiando las DIRECCIONES de las variables. Es decir, lo que recibimos con el puntero ebp es la dirección de la dirección, y cuando añadimos corchetes (nasm), a lo que accedemos es a la dirección de la variable.

Código
  1. mov eax, [ebp+0x8] ; [ebp+0x8] es la dirección del primer parámetro
  2. mov ecx, [ebp+0xC] ; [ebp+0xC] es la dirección del segundo parámetro
  3.  
  4. mov [ebp+0xC], eax ; ¡Hemos intercambiado la dirección de ambas variables, no sus valores!
  5. mov [ebp+0x8], ecx

Lo que se me había ocurrido (aunque no ha funcionado), es añadir doble corchete (debería ser super intuitivo XD):

Código
  1. ...
  2. mov eax, [[ebp+0x8]] ;No funciona :(
  3. ...

El error que me lanza el ensamblador NASM es:
Código:
intercambiar.asm:13: error: expression syntax error
intercambiar.asm:14: error: expression syntax error
intercambiar.asm:15: error: expression syntax error
intercambiar.asm:16: error: expression syntax error

Si alguien sabe como acceder a los valores, por favor, compartidlo :D
« Última modificación: 15 Diciembre 2015, 01:50 am por class_OpenGL » En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
xv0


Desconectado Desconectado

Mensajes: 1.027



Ver Perfil
Re: (Consulta) Intercambiador de variables en ensamblador (sintaxis de AT&T)
« Respuesta #9 en: 15 Diciembre 2015, 23:07 pm »

Normal te tira el error de sintaxis por el doble corchete. Si en ebp hay una direccion y la pasas a eax, y luego la copias sin mas, no estas copiando el valor.

Código
  1. movl 8(%ebp), %eax

Copio la direccion de ebp + 8, pero si es una direccion tienes que hacer esto de nuevo.

Código
  1. movl (%eax), %ebx

Y ya tienes el valor en ebx, y ya puedes pasarlo. Escribe una funcion en ASM con ASMinline y ahorrate todos esos problemas.

La funcion tiene dos variables, que esas son dos offsets, copia los valores de los offset a un registro de calculo general e intercambia.

Código
  1. ;intercambiar     variables eax y ebx
  2.  
  3. movl (%eax), %ecx
  4. movl (%ebx), %edx
  5.  
  6. movl %ecx, (%ebx)
  7. movl %edx, (%eax)

Cualquier cosa comenta.

Un saludo.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Consulta-php] Variables de formulario en array
PHP
hernanlp83 5 5,443 Último mensaje 29 Septiembre 2008, 23:12 pm
por cassiani
Consulta con suma de variables.
ASM
Zinc 3 3,875 Último mensaje 11 Junio 2010, 22:49 pm
por Eternal Idol
Error de sintaxis (falta operador) en la expresión de consulta 'amc.Id_Alumno =
.NET (C#, VB.NET, ASP)
Guillito 0 2,430 Último mensaje 14 Agosto 2015, 00:30 am
por Guillito
consulta sobre esta sintaxis..
Programación C/C++
digimikeh 3 6,724 Último mensaje 15 Septiembre 2020, 15:34 pm
por MAFUS
¿A que se debe la sintaxis de ensamblador de at&t?
Programación General
4v1dy4 3 3,261 Último mensaje 18 Enero 2023, 23:00 pm
por 4v1dy4
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines