(Consulta) Intercambiador de variables en ensamblador (sintaxis de AT&T)

Iniciado por class_OpenGL, 14 Diciembre 2015, 13:31 PM

0 Miembros y 1 Visitante están viendo este tema.

class_OpenGL

#10
He conseguido solucionar el problema!! La solución (en NASM) es esta:

Código (asm) [Seleccionar]
segment .text
global _change_values

_change_values:
enter 0,0
push ebx

mov edx, dword [ebp+8]
mov ebx, dword [edx]     ; ebx = primer parámetro
mov edx, dword [ebp+12]
mov ecx, dword [edx]     ; ecx = segundo parámetro

; mov dword [ebp+8], ecx   >> Intercambiador v1 NO FUNCIONA
; mov dword [ebp+12], ebx

mov edx, dword [ebp+8] ; Intercambiador v2
mov [edx], ecx
mov edx, dword [ebp+12]
mov [edx], ebx

pop ebx
leave
ret


Esto me plantea otra duda. ¿Por qué el intercambiador v1 no funciona? Sé que le intercambiador v2 si que debe funcionar perfectamente (de hecho, funciona :D), pero no entiendo porque en la primera versión que hice no puede funcionar...

Gracias por toda su ayuda!!

PD.: Sé que he puesto dword de sobra, pero aun quitándolos del intercambiador no funciona...




Aquí está la versión reducida (sinceramente, no sé si se puede optimizar más xD)

Código (asm) [Seleccionar]
segment .text
global _change_values

_change_values:
enter 0,0
push ebx

; void intercambiar(int* valor_a, int* valor_b);

mov eax, dword [ebp+8]  ; eax = value_a
mov ebx, dword [ebp+12] ; ebx = value_b
mov ecx, [eax]          ; ecx = *value_a
mov edx, [ebx]          ; edx = *value_b
mov [eax], edx          ; *valor_a = edx >> *valor_a = *valor_b
mov [ebx], ecx          ; *valor_b = ecx >> *valor_b = *valor_a

pop ebx
leave
ret

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

fary

Un byte a la izquierda.

class_OpenGL

¡¡He caído dos veces en la misma trampa!! No me lo puedo creer... ¡QUE DURO ES APRENDER ASM! Pero es satisfactorio y útil :P

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

fary

Un byte a la izquierda.