• Domingo 22 de Diciembre de 2024, 16:11

Autor Tema:  Mi Pc No Sabe Dividir  (Leído 5285 veces)

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Mi Pc No Sabe Dividir
« en: Jueves 30 de Diciembre de 2004, 08:25 »
0
suelo estar mas en la parte de videojuegos pero este problema es netamente de ensamblador:

el problema es que cada vez que pongo una instruccion div en el codigo, compila bien y cuando ejecuto el programa hace caso omiso al ultimo ret y sigue corriendo hasta que se encuentra con alguna instruccion no valida y me cierra el programa, tampoco responde a poner al final mov ax,4c01 int 21
si cambio ese div por cualquier otra instruccion el programa termina, si la comento tambien termina.
el problema pasa con NASM y con el debug asi que no es problema de compilador

aclaracion: el codigo es correcto porque incluso haciendo un programa del tipo:

mov ax,10
mov bx,2
div bx
ret

falla pero si cambio el div por un mul funciona.

alguien sabe que puede ser?

cualquier cosa que se les ocurra escriban porque sin dividir no puedo seguir

ACLARACION 2: es la unica division en el codigo.

deldar

  • Miembro activo
  • **
  • Mensajes: 93
    • Ver Perfil
Re: Mi Pc No Sabe Dividir
« Respuesta #1 en: Jueves 30 de Diciembre de 2004, 12:23 »
0
Es un problema muuuuy extraño. Seguramente lo que falla sea el propio nasm.
En cualquier caso si lo que estas haciendo es una division cuyo divisor es potencia de dos(2,4,8,16,32...) puedes hacer lo mismo desplazando a la derecha el registro ejm:

56 : 32   32

00111000 : 2 e 5 ; o sea 5 desplazamientos a la derecha

resultado 00000001 resto es lo que se ha desbordado 00011000=24

Un Saludo.
Quien de verdad sabe de qué habla, no encuentra razones para levantar la voz.

Pablo123

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Mi Pc No Sabe Dividir
« Respuesta #2 en: Viernes 31 de Diciembre de 2004, 02:35 »
0
Cita de: "deldar"
Es un problema muuuuy extraño. Seguramente lo que falla sea el propio nasm.
En cualquier caso si lo que estas haciendo es una division cuyo divisor es potencia de dos(2,4,8,16,32...) puedes hacer lo mismo desplazando a la derecha el registro ejm:

56 : 32   32

00111000 : 2 e 5 ; o sea 5 desplazamientos a la derecha

resultado 00000001 resto es lo que se ha desbordado 00011000=24

Un Saludo.
hola amigo,
debes de poner mas codigo para poder decir tu error.
no creo que el compilador nasm este errado
Gracias

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Mi Pc No Sabe Dividir
« Respuesta #3 en: Domingo 2 de Enero de 2005, 19:19 »
0
este es el codigo mas simple que produce el error:

[ORG 0x100]
[BITS 16]

mov ax,10
mov bx,2
div bx
ret

compilenlo como .com y ejecutenlo el problema lo hace en nasm y debug ahora lo voy a probar en tasm (para mi no son los compiladores.), si haces esto:

[ORG 0x100]
[BITS 16]

mov ax,10
mov bx,2
mul bx
ret

no pasa nada
si lo pueden probar se los agradesco

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Mi Pc No Sabe Dividir
« Respuesta #4 en: Sábado 22 de Enero de 2005, 06:07 »
0
nadie lo probo?
a nadie le funciona?
a todos le funciona?
...

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Mi Pc No Sabe Dividir
« Respuesta #5 en: Domingo 23 de Enero de 2005, 02:03 »
0
Citar
nadie lo probo?
a nadie le funciona?
a todos le funciona?
...

No me manejo muy bien en C y en assambley ni hablar por eso tal vez lo que probe es un desastre pero lo posteo igual, nada tengo que perder
Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <conio.h>
  4.  
  5. int main (void) {
  6. int result;
  7.  asm {
  8.    mov ax,10
  9.    mov bx,2
  10.    div bx
  11.    ret
  12.    mov ax, result
  13.   }
  14.   printf("%d", result);
  15.   getch();
  16.   return 1;
  17. }
  18.  
  19.  

No se si esta bien el codigo ya que hace rato que no programo en C
el resultado fue:
Código: Text
  1.  
  2. Divide error
  3.  
  4.  

Si el codigo llegara a estar mal, corregilo por favor y postealo que yo lo pruebo. Uso turbo C 3.X

jorge8603

  • Miembro activo
  • **
  • Mensajes: 26
    • Ver Perfil
Re: Mi Pc No Sabe Dividir
« Respuesta #6 en: Martes 25 de Enero de 2005, 03:48 »
0
no soy un experto pero al parecer encontre tu error
yo he programado cosas muy basicas para el tasm pero supongo debe ser lo mismo

mov ax,10
mov bx,2
div bx

si haces eso estas dividiendo una palabra entre una palabra lo cual es una operacion invalida

solo se puede dividir una palabra entre un byte. Quedaria

and ah,0
mov al,10; no se si sea necesario pero es una buena practica limpiar la parte alta
mov bl,2
div bl

este codigo realizara la operacion ax/bl dejando el cociente en el al y el residuo en el ah (o viceversa no me acuerdo)

espero resuelva tu problema

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Mi Pc No Sabe Dividir
« Respuesta #7 en: Sábado 12 de Febrero de 2005, 09:29 »
0
lo voy a probar muchas gracias  :kicking:

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Mi Pc No Sabe Dividir
« Respuesta #8 en: Domingo 13 de Febrero de 2005, 09:53 »
0
FUNCIONO!!! muchas gracias

ahora una duda como hago para dividir por mas de 255?

Forly

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Re: Mi Pc No Sabe Dividir
« Respuesta #9 en: Domingo 13 de Febrero de 2005, 14:53 »
0
Hola Bob:

Yo también soy nuevo en estas lides, pero como lo explicó Jorje8603, para que la división resulte, siempre el divisor debe ser más pequeño que el dividendo.

Por ejemplo:       DIVIDENDO       DIVISOR
                             word               byte
                         doble word          word
etc.

En el caso de dividendos que ocupan más de un byte, deberás poner
el byte más significativo en el registro DX y el menos significativo en AX.

El resultado quedará en AX.

Espero que te sirva.

Te mando un abrazo.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Mi Pc No Sabe Dividir
« Respuesta #10 en: Domingo 13 de Febrero de 2005, 18:38 »
0
Saludos,

Bueno en realidad para que la condenada división resulte el cociente debe poder caber en un registro del mismo tamaño en bits del divisor (8,16,32).  :P

El problema es que si el resultado es demasiado grande para caber en el registro destino del cociente (AL, AX, EAX) se genera un INT0 (Que generalmente muestra el mensaje no muy adecuado de división entre 0, ya que esa sólo es una de las posibles causas). El cociente y residuo quedan con valores indefinidos.

En el caso:

mov ax,10
mov bx,2
div bx

Si en dx (que en el ejemplo no está con valor definido) tienes un valor mayor o igual a 2 al aplicar division entera:  DX:AX DIV BX (BX=2) siempre te saldra  error. Fíjate que no importa que DX:AX sea MUCHO mayor a BX.

Como DX estaba indefinido en tu código y siendo suficiente que sea mayor o igual a 2 a fuerza de probabilidades te salía ese mensaje de error.

P.D.

Como dijo deldar, en este caso es mejor usar el desplazador  ;)

P.D. 2:

Es fácil darse cuenta por que hay que EVITAR usar divisiones en tu código de alto nivel, el código que genera el compilador vá más alla de un simple DIV o IDIV.

Mr_Kracker

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Mi Pc No Sabe Dividir
« Respuesta #11 en: Sábado 26 de Febrero de 2005, 20:21 »
0
mov ax,10
mov bx,2
div bx
ret

en lugar de bx , puedes usar cx o de lo contrario devuelve el valor original de bx antes del ret osea:

push ebx
mov ax,10
mov bx,2
div bx
pop ebx
ret

ó

mov ax,10
mov cx,2
div cx
ret

de seguro por eso te sale error.

Saludos

eagle2005

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Mi Pc No Sabe Dividir
« Respuesta #12 en: Viernes 25 de Marzo de 2005, 07:40 »
0
esto te debe de servir:

mov ax,10
mov dx,0   ;mueve a dx,0 para k la divicion sea  de eax(dx:ax) entre bx :kicking:
mov bx,2
div bx
;;el resultado lo arroja en ax
;con esto es suficiente para solucionar tu
;problema ...Espero tu respuesta ...   :)

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Mi Pc No Sabe Dividir
« Respuesta #13 en: Sábado 26 de Marzo de 2005, 23:34 »
0
muchisimas gracias era eso...

GRACIAS!