• Lunes 29 de Abril de 2024, 02:06

Autor Tema:  Re: Ayuda: Trabajar con Long int en Ensamblador  (Leído 1957 veces)

colitroni

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Ayuda: Trabajar con Long int en Ensamblador
« en: Jueves 16 de Octubre de 2003, 21:51 »
0
Suponiendo instrucciones del 8086:

Los registros son de 16 bits y entonces trabajar con enteros (2 bytes) no hay problema ya que si haces una operacion por ejemplo:

    mov ax,0FFFFh
    mov bx,10
    mul bx

El resultado ahora lo pone en DX:AX con lo que puedes acceder al numero completo sin problema alguno

Ahora digamos que quiero dividir 40.002.850 (Long int) entre diez, yo intento hacer algo así, por ejemplo:

    mov dx,0262h      ; parte alta del numero
    mov ax,06522h    ; parte baja del numero
    mov bx,10
    div bx
y aqui el programa termina con un error, ya que en la division el cociente iria a AX y el resto a DX, pero es que DX sigue teniendo la parte alta de ese entero largo (porque el resultado es entero largo tb) ..... y en fin  mi problema es que no sé como se puede trabajar con numeros long int (4 bytes) teniendo registros de 16 bits para operaciones de suma, resta multiplicacion y división... a ver si alguien me hace ver la luz. Lo que tengo claro es que la variable numero seria DWord que son 4 bytes..... AYUDA.

Salu2.

Super_G

  • Miembro MUY activo
  • ***
  • Mensajes: 375
    • Ver Perfil
Re: Ayuda: Trabajar con Long int en Ensamblador
« Respuesta #1 en: Sábado 18 de Octubre de 2003, 06:18 »
0
La verdad puesto con esas condiciones no es nada facil, almenos para mi.
viendo tu ejemplo el programa termina porque el resultado es mucho mayor a lo que puede entrar en 16bits(AX) ahi es donde se produce el primer error(desbordamiento), para el ejemplo una solucion sencilla(por ser el divisor 10) conociendo el resultado se sabe que la alteracion del divisor mantendra una mismalinea del numero en su totalidad o dicho de otra forma, los digitos no cambiaran sino que se hara una "sustraccion" del digito menos significativo, entoces siguiendo esa idea puede dividirse por separado primero la parte baja y luego la parte alta por el mimo divisor debiendo tener el cuidado correspondiente en cada caso por ejemplo:


;;;***********************
              mov dx,0262h ; parte alta H
              mov ax,06522h ; parte baja L
              mov bx,10;_____divisor
              push dx    ;salvamos parte H
              xor dx,dx  ;se prepara para
              div bx       ;la sig division
              mov cx,ax ;se salva la parte L
              xor dx,dx  
              pop ax      ;desempilamos H  
              div bx        ; se divide
              xchg  ax,dx;son eso esta listo H
              shl ax,12 ;el resto de la H pasa
              or ax,cx ;a ser el digito + signifi
                            ;de L
;;;*****************************
esta solcion(no provada) no es buena para generalizarla porque depende del divisor que es 10, pero espero que por lo menos se entienda la idea; tratando de explicar la idea para una forma mas general seria dividir los numeros a ser operados de 32bit en 16bits para su manejo en los registros de 8086, para esto se debe tener todas las condiciones que significara dividir cada numero dependiendo de la operacion que se vaya a efectuar sobre este, siendo la misma operacion la que la determine estos pasos a seguir en cada proceso.

colitroni

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Ayuda: Trabajar con Long int en Ensamblador
« Respuesta #2 en: Domingo 19 de Octubre de 2003, 08:51 »
0
Bueno, creo q el tema es saber como tratar este tipo de operaciones, ya q si por ejemplo divides por 9 o por cualquier otro no multiplo ya tienes el problema que expongo, estoy convencido q se pueden realizar estas operaciones pero no tengo idea de como tratarlas.

Salu2.

Super_G

  • Miembro MUY activo
  • ***
  • Mensajes: 375
    • Ver Perfil
Ayuda: Trabajar con Long int en Ensamblador
« Respuesta #3 en: Miércoles 22 de Octubre de 2003, 00:59 »
0
Eso es muy cierto, para el ejemplo existe un error la division sebeser por 10h(hexa).
De todos modos el principal problema serai que el divisor en muy pequeño con respecto al dividendo y el resultado debe ir a una word, por lo tanto sugiero hacer la division por partes, osea que si tienens la long la dividas en un parte alta(Word_H) y otra baja(word_L) dividas una a la ves y luego busques una forma para unir el resultado, vere la forma de hacer esto otro rato aver que mas se puede aportar.