[AYUDA] No funciona este código

Iniciado por tete55, 9 Diciembre 2014, 12:10 PM

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

tete55

He programado esta operación y no me funciona.
Alguien que entienda me la puede echar un ojo para ver que esta mal o si esta incompleto?
Muchas gracias!!! :D :D

Aquí os dejo el código:




;X=A *B *C /100
segment .data
segment .bss
a resb 4
b resb 4
c resb 4
resultado resb 4
segment .text
global x
x:
push rbp
mov rbp, rsp

mov rax, qword [rbp+16]
mov qword [resultado], rax
mov rax, qword [rbp+24]
mov qword [c], rax
mov rax, qword [rbp+32]
mov qword [b], rax
mov rax,qword[rbp+40]
mov qword[a],rax

mov eax,[c]
mov ebx,[b]
mov ecx,[a]
imul eax,ebx
imul eax,ecx
mov dword[resultado],ecx

mov [resultado],rbx
cdq
mov ecx,100
idiv ecx
mov ecx,eax
mov dword[resultado],ecx
push qword[resultado]

mov rsp,rbp
pop rbp               
ret                   




Eternal Idol

¿Que estas tratando de hacer? ¿Con que ensamblas eso? ¿Sabes que es codigo de 64 bits, no?

Y lo mas importante de todo:
¿Es esto una tarea y por eso borraste el codigo en el hilo anterior y creaste uno nuevo?
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

tete55

No he borrado ningún código de otro sitio, sino que he creado este nuevo post con el código completo para haber si alguien me podía ayudar

Estoy intentando aprender ensamblador en 32 bits, me he puesto a realizar la operación de multiplicar y dividir.

El programa en sí realiza la operación:  x = (a * b * c) / 100 lo estoy ensamblando con nasm pero no me da el resultado de la operación y no se por que.

Por todo esto quería que alguien que sepa del tema me diga en que me he equivocado y así aprender

Gracias

Eternal Idol

#3
¿Que sentido tiene negarlo? Ahi habia codigo, es evidente.

https://foro.elhacker.net/asm/programa_que_calcule_multiplicaciones_asm-t425883.0.html

Bueno, como te decia antes ese codigo es de 64 bits, los registros con el prefijo R son de 64 bits. Esto es algo elemental asi que te recomiendo LEER (lo ideal es con un buen libro) antes de volver a preguntar.

https://foro.elhacker.net/asm/entry_point-t256455.0.html
https://foro.elhacker.net/asm/libro_de_ensamblador-t255032.0.html
https://foro.elhacker.net/asm/ensambladores_documentacion_herramientas-t393616.0.html

Un poco del codigo:

mov rax, qword [rbp+16] <<
Me imagino que aca esperas encontrar argv[1]. ¿Cual es el tipo de argv?

mov qword [resultado], rax    <<
QWORD es una palabra CUADRUPLE, una palabra - WORD - son 2 bytes, reservaste 4 bytes en total, suficiente para un DWORD no para un QWORD.

ver 3.2.2 RESB and friends: Declaring Uninitialised Data
http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoc3.html

El resto mas o menos deberia ir bien aunque no entiendo el sentido de empujar a la pila resultado, pasar de eax a ecx el cociente para despues asignarlo en resultado, ni lo siguiente:
   mov dword ptr [resultado],ecx ;para que queres poner en resultado el valor de A
   mov qword ptr [resultado],rbx ;idem con RBX que puede no ser identico al valor de B

Seran copy/paste supogno ... en fin, la clave esta en como intentas recibir los parametros del programa.
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

tete55

Muchas gracias por la información aportada ya que gracias a ello he modificado varias cosas del código pero me sigue sin realizar la fórmula, si son tan amables de aportar alguna idea lo agradecería mucho.
Lo que debería hacer el programa es la operación Resultado = (a * b * c )/100

Muchas gracias a todos y perdonen las molestias  :D :D :D


segment .data

segment .bss
a resb 4
b resb 4
c resb 4
resultado resb 4

segment .text

global x
x:
push rbp
mov rbp, rsp

mov eax, dword [rbp+4] ;efectuado una llamada y metido en la pila rbp, asi que el primer numero esta en rbp + 4
mov dword [resultado], eax
mov eax, dword [rbp+8]
mov dword [c], eax
mov eax, dword [rbp+16]
mov dword [b], eax
mov eax,dword[rbp+32]
mov dword[a],eax

mov eax,[c]
mov ebx,[b]
mov ecx,[a]
imul eax,ebx
mov ebx,ecx
imul eax,ebx
mov dword[resultado],eax

mov [resultado],rbx
cdq
mov ecx,100
idiv ecx
mov ecx,eax
mov dword[resultado],ecx
;push dword[resultado]

mov rsp,rbp
pop rbp               
ret                     

Eternal Idol

No mire con atencion el codigo por una sencilla razon: seguis teniendo el mismo problema conceptual con los parametros.

Mira lo que hay realmente en la pila, presta atencion al tipo de argv:
http://www.gnu.org/software/libc/manual/html_node/Program-Arguments.html
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

cpu2

Ese code esta 100% para reciclar, no te ofendas pero haces cosas sin sentido alguno ya te lo comento @EI.

Por que no usas un sistema fastcall? Usas los registros para pasar parametros, ya que estas en x64 tienes los registros r8-15 por descontado, ojo que algunos tienen funciones y podrian darte problemas.

Ejemplo, que r13 == a, r14 == b, r15 == c, podrian ser punteros o lo que quieras.

Tambien por otra parte, cuando chequeas los posibles Overflows? Para algo esta esa bandera, podrias tener datos erroneos por culpa de cosas como esa.

Un saludo.

Vaagish

Agrego un detalle:


CitarEstoy intentando aprender ensamblador en 32 bits

CitarBueno, como te decia antes ese codigo es de 64 bits, los registros con el prefijo R son de 64 bits. Esto es algo elemental asi que te recomiendo LEER

Codigo nuevo:

Código (asm) [Seleccionar]
push rbp
  mov rbp, rsp

  mov eax, dword [rbp+4]



Atención al leer,, y leer primero !!! Intenta limpiar el codigo,, tenes cosas de mas..

Saludos!