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
¿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?
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
¿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.
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
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
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.
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:
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!