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)
.file "intercambiar.cpp"
.text
.globl __Z12intercambiarPiS_
.def __Z12intercambiarPiS_; .scl 2; .type 32; .endef
__Z12intercambiarPiS_:
LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
movl 8(%ebp), %eax
movl 12(%ebp), %ebx
movl %eax, 12(%ebp)
movl %ebx, 8(%ebp)
popl %ebp
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE0:
.ident "GCC: (GNU) 4.8.1"
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:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 12(%ebp), %ebx
movl %eax, 12(%ebp)
movl %ebx, 8(%ebp)
popl %ebp
ret
Lo que he hecho después es ejecutar el siguiente comando:
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++:
#include <iostream>
void intercambiar(int* lpnValorA, int* lpnValorB);
int main() {
int nValorA, nValorB;
std::cout << "Introduzca el valor A: ";
std::cin >> nValorA;
std::cout << "Introduzca el valor B: ";
std::cin >> nValorB;
intercambiar(&nValorA, &nValorB);
std::cout << "\nnValorA = " << nValorA << std::endl;
std::cout << "nValorB = " << nValorB;
std::cin.get();
std::cin.get();
return 0;
}
Pues eso, el intercambiador no hace nada
Soy novato en ASM, por lo que no seáis duros
Gracias