Test Foro de elhacker.net SMF 2.1

Programación => Programación General => ASM => Mensaje iniciado por: robertofd1995 en 8 Mayo 2014, 23:03 PM

Título: problema con la definicion de la variable
Publicado por: robertofd1995 en 8 Mayo 2014, 23:03 PM
hola a todos , estoy una funcion en asm , es la primera vez que hago algo a este nivel

el metodo lo que tiene que hacer es que dados 4 valores me diga la distancia al objetivo

en c++ seria asi:

int distanceShipBomb(int xShip, int yShip, int xBomb, int yBomb){
return max(abs(xShip-xBomb),abs(yShip-yBomb));
}


el problema esta al pasarlo a asemblador , ya hice lo de
extern "C" int distanceShipBomb(int xShip, int yShip, int xBomb, int yBomb);

y cree el archivo bien y eso

el codigo en asemlador que tengo es este :



.386
.model flat, C

.code

PUBLIC distanceShipBomb

distanceShipBomb PROC


;ARQUITECTURA 86-32 DE INTEL


push esb  ; pointer variable s [la variable que se encargara de ser el puntero ]
mov esb, esp; [hago que mi puntero sea igual al puntero base]

push eax  ; x ship a [meto en el stack la variable a ]


push ebx  ; y ship b [meto en el stack la variable b ]


push ecx  ; x bomb c [meto en el stack la variable c ]


push edx  ; y bomb d [meto en el stack la variable d ]


push eox  ; o =0  [meto en el stack la variable o que sera oara compararlo con 0 ]


inc esb
        inc esb
        inc esb
        inc esb
inc esb
; adjust pointer [incremente el puntero 5 veces , una por cada elemento en el stack]

xor eox , eox ; [hago que eox sea igual a 0]

sub eax,ecx ; [resta a -c]
sub ebx,edx ; [resta b - d]

cmp eax , eox ; [compara a con  0]

JS consequent ;[como estoy comparando numero con signo tengo que mirar que las flags de signed y overflow sean distintas para mirar la operacion a<0]
JNO consequent

jmp next
consequent:  ;[en caso de ser negativo lo paso a positivo]
 NEG eax ;if eap is neggative change sing
next:

JNS consequent2 ; [aqui en ek otro caso que se puede dar que la flag s sea 0 y o =1 ]
JO  consequent2

jmp next2
consequent2:
 NEG ebx ;if eap is neggative change sing
next2:


cmp ebx , eox ;[exactamente lo mismo que lo anterior pero esta vez con la variable b ]
;PD se poco de asemblador pero supongo que para evitar la repeticion se podra hacer una funcion , si me echais os lo agradeceria  

JS consequent3
JNO consequent3

jmp next3
consequent3:
 NEG ebx ;if eap is neggative change sing
next3:

JNS consequent4
JO  consequent4

jmp next4
consequent4:
 NEG ebx ;if eap is neggative change sing
next4:

OR eax,ebx  ; [hago una operacion or para quedarme con el mayor ]

pop eox ; [dejo lmpio el stack de nuevo]
pop edx
pop ecx
pop ebx
pop eax

pop esp

ret ;  [retorno]


distanceShipBomb ENDP ;[fin funcion]

END


el error que me marca una y otra vez es este


1>------ Operación Compilar iniciada: proyecto: TeamWrok-Winter-2014, configuración: Debug Win32 ------
1>  Assembling Distance.asm...
1>Distance.asm(10): error A2006: undefined symbol : esb
1>Distance.asm(11): error A2006: undefined symbol : esb
1>Distance.asm(24): error A2006: undefined symbol : eox
1>Distance.asm(25): error A2006: undefined symbol : eox
1>Distance.asm(29): error A2006: undefined symbol : ESB
1>Distance.asm(31): error A2006: undefined symbol : eox
1>Distance.asm(36): error A2006: undefined symbol : eox
1>Distance.asm(55): error A2006: undefined symbol : eox
1>Distance.asm(75): error A2006: undefined symbol : eox
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\BuildCustomizations\masm.targets(49,5): error MSB3721: El comando "ml.exe /c /nologo /Zi /Fo"Debug\Distance.obj" /W3 /errorReport:prompt  /TaDistance.asm" salió con el código 1.
========== Compilar: 0 correctos, 1 incorrectos, 0 actualizados, 0 omitidos ==========


os agradeceria un monton que me pudieseis ayudar con el problema, llevo peleando con el toda la tarde y no he sido capaz

Un saludo y gracias
Título: Re: problema con la definicion de la variable
Publicado por: x64core en 9 Mayo 2014, 11:23 AM
¿Incorrecto nombramiento de los registros? ( esb, eox, ESB, etc )
Título: Re: problema con la definicion de la variable
Publicado por: Eternal Idol en 9 Mayo 2014, 11:53 AM
Ademas: ¿inc ESB+ 5? inc solo incrementa en 1 (es ++ de C/C++), tenes que usar add para sumar 5.
Título: Re: problema con la definicion de la variable
Publicado por: robertofd1995 en 9 Mayo 2014, 13:30 PM
Cita de: x64Core en  9 Mayo 2014, 11:23 AM
¿Incorrecto nombramiento de los registros? ( esb, eox, ESB, etc )

si perdon se me olvido modificarlo para que todos se llamasen igual ,lo acabo de modificar ahora

pero la pregunta esta en que si todos se llaman igual , porque me siguen saltando las alertas ?

es decir como tengo que llamar a los registros etc... , un saludo y muchas gracias
Título: Re: problema con la definicion de la variable
Publicado por: Eternal Idol en 9 Mayo 2014, 13:37 PM
ebp existe, esb no, eox no existe tampoco ...

http://en.wikipedia.org/wiki/X86#x86_registers

¿De donde estas sacando este codigo?
Título: Re: problema con la definicion de la variable
Publicado por: x64core en 9 Mayo 2014, 15:13 PM
Cita de: robertofd1995 en  9 Mayo 2014, 13:30 PM
si perdon se me olvido modificarlo para que todos se llamasen igual ,lo acabo de modificar ahora

pero la pregunta esta en que si todos se llaman igual , porque me siguen saltando las alertas ?

es decir como tengo que llamar a los registros etc... , un saludo y muchas gracias
No es que todos los registros se deben llamar de la misma manera. Lo Mejor sera aprender a programar en ASM leyendo algún buen libro.
Título: Re: problema con la definicion de la variable
Publicado por: robertofd1995 en 9 Mayo 2014, 15:42 PM
a ver os explico , tengo una asignatura en la uni en la que damos algo de asm , el caso es que para empezar (no vamos a dar asm , en el resto de la carrera , simplemente es para entender como se podria hacer y eso) usabamos un ordenador teorico que ellos habian construido , es decir para un procesador teorico que ellos habian creado

para estudiar y el examen practico y demas lo hicimos para esa arquitectura , el problema es que nos mandaron al final un trabajo para arquitectura 86-32 y no nos dieron tablas de equivalencia ni nada y fue un follon

por ej el nombre de los registros en el computador teorico eran r1 ,r2 ,..r6 y r7 que era el puntero

la resta era sub r1,r2,r3 siendo r1 el registro donde lo guardabas , etc... vaya que cambiaban un monton de cosas y no nos informaron bien

pero bueno me puse a buscar por internet como se tenian que llamar los registros etc.. y ya se como funciona y ya me funciona el proyecto

gracias de todas maneras , aunque hay una pequeña cosa que me paso y no se a que se debe

que diferencia hay entre esto


sub eax,ecx ; [resta a -c]

JS consequent ;[como estoy comparando numero con signo tengo que mirar que las flags de signed y overflow sean distintas para mirar la operacion a<0]
jmp next
consequent:  ;[en caso de ser negativo lo paso a positivo]
  NEG eax ;if eap is neggative change sing
next:

sub ebx,edx ; [resta b - d]

JS consequent2
jmp next2
consequent2:
  NEG ebx ;if eap is neggative change sing
next2:



y esto :



sub eax,ecx ; [resta a -c]
sub ebx,edx ; [resta b - d]

JS consequent ;[como estoy comparando numero con signo tengo que mirar que las flags de signed y overflow sean distintas para mirar la operacion a<0]
jmp next
consequent:  ;[en caso de ser negativo lo paso a positivo]
  NEG eax ;if eap is neggative change sing
next:



JS consequent2
jmp next2
consequent2:
  NEG ebx ;if eap is neggative change sing
next2:



con el primer code me funciona, con el segundo no y no entiendo el porque
porque en el if , no toco el registro del otro valor asi que no se a que debe

un saludo y gracias por la ayuda
Título: Re: problema con la definicion de la variable
Publicado por: x64core en 9 Mayo 2014, 15:53 PM
Pues si te fijas la unica diferencia entre el primer código y el segundo son dos linea nada más o más bien
el cambio de posición de la instruccion en la linea 9 del primer código en el segundo código además también
podes depurar el código sino ya sabras tu como va eso en el procesador emulado o teorico como sea.
Título: Re: problema con la definicion de la variable
Publicado por: robertofd1995 en 11 Mayo 2014, 00:47 AM
ya se que solo cambia la poscion , lo que me preguntaba es q si simplemente solo cambia la posicion ,porque una si va y la otra no
Título: Re: problema con la definicion de la variable
Publicado por: cpu2 en 11 Mayo 2014, 05:33 AM
Si especificas el error mucho mejor, yo el unico problema que le veo al code numero dos, es que si eax es negativo SF se pondra en 1, pero si luego se resta ebx y este es positivo la bandera SF se pondra en 0 y el jump no se ejecutara.

Asi que no tiene mucho sentido eso, no?

Un saludo.
Título: Re: problema con la definicion de la variable
Publicado por: robertofd1995 en 11 Mayo 2014, 12:29 PM
a vale , no me di cuenta de eso , hay estaba el error

bueno muchas gracias a todos por ayudar

marco el tema como solucionado