Combinación de op. aritméticas (ensamblador)

Aziwar

Quiero hacer la siguiente operacion: x = (b*n/m) + a, donde b = 10000, n = UnNum, m = 7FFFFFFFh y a = -5000

Lo estoy intentando hacer de cualquiera de estas maneras, pero todas me dan fallo (no entiendo un carajo ensamblador)

       	
        INVOKE nrandom, 10000
        mov UnNum,eax       
mov al, UnNum mov bl, 10000 imul bl mov bl, 7fffffffh idiv bl add al, -5000 mov aux,al mov eax, aux INVOKE nrandom, 10000 mov UnNum,eax mov aux, 10000 imul aux, UnNum idiv aux, 7FFFFFFFh add aux, -5000 mov eax, aux INVOKE nrandom, 10000 mov UnNum,eax load 10000 imul UnNum idiv 7FFFFFFFh add -5000 store aux mov eax, aux INVOKE nrandom, 10000 mov UnNum,eax load 10000 imul UnNum idiv 7FFFFFFFh add -5000 store aux mov eax, aux
Khanser

Qué error te da?

Aziwar

casi siempre q están mal definidas las operaciones, q son los parametros incorrectos

elkaoD

No comentas qué ensamblador usas, pero así a bote pronto mirando por encima es posible que depende de la implementación específica de tu ensamblador no puedas simplemente referenciar variables poniendo su nombre si no que necesites direccionarlas explícitamente. Por ejemplo, con MASM, el ensamblador que yo usaba hace tiempo (por lo que hablo de lo que recuerdo), hay que hacer MOV [num], eax (los corchetes indican direccionamiento indirecto, es decir, referencias un offset en memoria, no un registro)

Tienes que tener cuidado, no puedes mover cosas de 32 bits a registros de 8 bits directamente, por ejemplo de EAX a AL/AH (aunque sea de forma transitiva usando una variable intermedia.) Quizá debas indicar explícitamente los tamaños y controlar los MOVs para usar sólo operadores del mismo tamaño. Por ejemplo MOV al, byte ptr [num] mueve a la parte baja de EAX los 8 bits más altos (en little endian.)

Y creo que también se te está desbordando, no puedes meter en AL más de 8 bits, no cabe el número 10000.

Sé más explícito con la descripción de los errores, no cuesta nada hacer copiapega e indicar qué lineas fallan exactamente, y facilita nuestra labor.

Aziwar

edit: lo he arreglado usando solo los registros eax y ebx.

Pero ahora tengo un problema, no consigo generar un número aleatorio entre -5000 y 5000. Supuestamente el código anterior era para eso, pero siempre al realizar la división el resultado es 0, y por lo tanto el resultado final me sale -5000.

LOc0

Creo que tienes que usar la FPU:

http://en.wikibooks.org/wiki/X86_Disassembly/Floating_Point_Numbers
http://webster.cs.ucr.edu/AoA/Windows/HTML/RealArithmetica2.html

Salu2 ;)

Aziwar

FPU tengo que usar, pero no ahora xD en la siguiente práctica que tengo que hacer si es sobre la FPU xD

elkaoD

Resta a NRANDOM 5000 si va entre 0 y 10000

Usuarios habituales

  • elkaoD
  • Aziwar
  • LOc0
  • Khanser