Autor
|
Tema: problema con la definicion de la variable (Leído 7,225 veces)
|
robertofd1995
Desconectado
Mensajes: 172
|
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
|
|
« Última modificación: 9 Mayo 2014, 13:31 pm por robertofd1995 »
|
En línea
|
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
¿Incorrecto nombramiento de los registros? ( esb, eox, ESB, etc )
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
Ademas: ¿inc ESB+ 5? inc solo incrementa en 1 (es ++ de C/C++), tenes que usar add para sumar 5.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
robertofd1995
Desconectado
Mensajes: 172
|
¿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
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
ebp existe, esb no, eox no existe tampoco ... http://en.wikipedia.org/wiki/X86#x86_registers¿De donde estas sacando este codigo?
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
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.
|
|
|
En línea
|
|
|
|
robertofd1995
Desconectado
Mensajes: 172
|
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
|
|
|
En línea
|
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
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.
|
|
|
En línea
|
|
|
|
robertofd1995
Desconectado
Mensajes: 172
|
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
|
|
|
En línea
|
|
|
|
xv0
Desconectado
Mensajes: 1.027
|
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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema de definición de imagen al pasar a video cd
Multimedia
|
Martillo
|
2
|
2,637
|
16 Marzo 2005, 04:10 am
por Songoku
|
|
|
Modificar variable afuera de una definición
Scripting
|
laideker
|
3
|
2,830
|
30 Abril 2011, 04:35 am
por leogtz
|
|
|
¿Como controlar la cantidad de caracteres en la definicion de una variable?
Scripting
|
the_Avenger
|
2
|
3,971
|
28 Septiembre 2011, 23:12 pm
por the_Avenger
|
|
|
Problema con variable de sesion y variable de conexion
PHP
|
Vaagish
|
9
|
6,357
|
19 Marzo 2013, 22:37 pm
por Vaagish
|
|
|
Tengo un simple problema con una definición
Hacking
|
UnaiiM
|
3
|
3,460
|
26 Febrero 2020, 13:07 pm
por UnaiiM
|
|