• Viernes 29 de Marzo de 2024, 02:57

Autor Tema:  Re: uso del coprocesador  (Leído 2536 veces)

Logan

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: uso del coprocesador
« en: Viernes 19 de Septiembre de 2003, 15:53 »
0
:comp:
¡¡¡Hola Amigos!!!
Ok, tengo un problema, he estado tratando de programar algo del coprocesador, solo que he checado en libros y en paginas, y la verdad encuentro pocos ejemplos de programas que empleen instrucciones para el coprocesador, espero que alguien me pueda ayudar mandandome algun programa(por pequeño que sea) que maneje el coprosador.
Se los agradezco mucho, hasta pronto.


logan@itoaxaca.edu.mx

:yes:
Estamos aqui porque jamás terminaremos de aprender....

Super_G

  • Miembro MUY activo
  • ***
  • Mensajes: 375
    • Ver Perfil
Re: uso del coprocesador
« Respuesta #1 en: Martes 23 de Septiembre de 2003, 06:45 »
0
.model tiny
.code
.387  ;con esta directiva decimos que se usaremos el coprocesador matematico 80387
org 100h

inicio:
        fild n1  ;cargamos a ST(0) "n1"(ENTERO)
        fild n2  ;cargamos a ST(0) "n2", recorre la pila y "n1" pasa a  ST(1)(ENTERO)
        faddp    ;sumamos ST(0)+ST(1) y desempilamos en ST(0) (ENTERO)
        fist r   ;almacenamos en "r"   (ENTERO)
        fwait    ;espera instruccion  del procesador


fin: int 20h
n1 dw 1    ;numero uno
n2 dw 2    ;numero dos
r  dw 0    ;resultado

end inicio

Logan

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: uso del coprocesador
« Respuesta #2 en: Miércoles 24 de Septiembre de 2003, 20:47 »
0
:comp:

Gracias por el programita de suma Super_G, por cierto, he trabajado con una forma de mostrar en pantalla numeros fraccionarios pero no se si tu o alguien más conozca otra forma de hacerlo, lo que pasa es que me arroja una variación en el resultado de casi cualquier operacion (sumas en especifico), agradezco la ayuda que me puedas prestar (o alguien que sepa que es lo que pasa en este caso).
cuelgo el codigo de un programa que he usado para sumar dos numeros y mostrar el resultado en reales.

Hasta pronto!!!

   ;Programa que usa el coprocesador y  muestra un numero de punto flotante con
      ;de precisión sencilla
.286
.287
DATAS   SEGMENT

TEMP   DW   ?
WHOLE   DW   ?
FRACT   DD      ?
n1      dd      -51.35
n2      dd      30.25
suma    dd      ?

DATAS   ENDS
CODE   SEGMENT
   ASSUME CS:CODE,DS:DATAS
;PROGRAMA PRINCIPAL QUE MUETRA NUMB
MAIN   PROC   FAR
   MOV   AX,DATAS
   MOV   DS,AX
;        CALL    LIMPIA  
   call   sumar
        CALL    DISP    ;MUETRA suma
   MOV   AH,4CH
   INT   21H

MAIN   ENDP

LIMPIA  PROC    FAR
        MOV     AH,6
        MOV     AL,0
        MOV     CX,0
        MOV     DH,23
        MOV     DL,79
        MOV     BH,7
        INT     10H
        RET
                       
LIMPIA  ENDP

sumar   proc   NEAR
   fld   n1
        fadd    n2
   fstp   suma
   fwait
   ret
sumar   endp
   
DISPS   PROC   NEAR
   MOV   AH,6   ;MOSTRAR AL
   MOV   DL,AL
   INT   21H
        RET
DISPS   ENDP

DISP   PROC   NEAR
   FSTCW   temp
   OR   temp,0C00H
   FLDCW   TEMP

        FLD     suma            ;OBTENER AREA
        FTST                    ;PROBAR AREA
   FSTSW   AX      ;ESTADO AX
   AND   AX,4500H   ;OBTENER C3,C2,C0
   CMP   AX,0100H   ;PROBAR PARA -
   JNE   DISP1      ;SI ES POSITIVO
   MOV   AL,'-'      
   CALL   DISPS      ;MOSTRAR MENOS

DISP1:
   FABS         ;CONVERTIR ST EN POSITIVO
   FRNDINT         ;OBTENER NUMERO ENTERO
   FIST   WHOLE      ;GUARDAR NUMERO ENTERO
   FLD   suma
   FABS
   FSUB         ;OBTENER FRACCION
   FABS
   FSTP   FRACT      ;GUARDAR FRACCION
   FWAIT

;MOSTRAR PARTE DE NUMERO ENTERO

   MOV    AX,WHOLE
   MOV   CX,0
   MOV   BX,10

DISP2:
   INC   CX
   XOR   DX,DX
   DIV   BX
   ADD   DX,'0'      ;CONVERTIR A ASCII
   PUSH   DX
   OR   AX,AX
   JNE   DISP2      ;SI NO ES CERO
DISP3:
   POP   AX
   CALL   DISPS      ;MOSTRARLO
   LOOP   DISP3
   MOV   AL,'.'      ;MOSTRAR PUNTO DECIMAL
   CALL   DISPS

;MOSTAR PARTE DE FRACCION
   
        MOV     AX,WORD PTR FRACT
        MOV     DX,WORD PTR FRACT+2
   MOV   CX,8

DISP4:
   SHL   AX,1
   RCL   DX,1
   LOOP   DISP4
        OR      DX,8000H           ;INSTALAR BIT IMPLICITO
   XCHG   AX,DX
   MOV   BX,10

DISP5:

   MUL    BX
   PUSH   AX
   XCHG   DX,AX
   ADD   AL,'0'
   CALL   DISPS
   POP   AX
   OR   AX,AX
   JNZ   DISP5
   RET
DISP   ENDP
CODE    ENDS
   END   MAIN
Estamos aqui porque jamás terminaremos de aprender....

Super_G

  • Miembro MUY activo
  • ***
  • Mensajes: 375
    • Ver Perfil
uso del coprocesador
« Respuesta #3 en: Jueves 25 de Septiembre de 2003, 00:37 »
0
Yo intente hacer un programa asi una ves pero no me parecio muy facil, al final solo hice un programa que muestre el resultado pero solo de forma binaria, falta la conversion a decimal

;;******************************
.model tiny
.code
.387  ;con esta directiva decimos que se usaremos el coprocesador matematico 80387
org 100h

inicio:
        finit
        fld n1  ;cargamos a ST(0) "n1"
        fld n2  ;cargamos a ST(0) "n2", recorre la pila y "n1" pasa a  ST(1)
        faddp    ;sumamos ST(0)+ST(1) y desempilamos en ST(0)
        fst r   ;almacenamos en "r"
        fwait    ;espera instruccion  del procesador
        ;;***********mostrar EL RESULTADO en pantalla
        mov si, offset r
        mov di, offset resultado
        mov bx,[si]   ; en bx los 16 primeros bits de 23  de la "mantisa"
        mov ax,[si+2] ; en ax estaran los ultimos 7 bits de la "mantisa" +los 8 bits del exponente + el bit de
        shl ax,1      ; ponemos en el bit Carry el signo, y todo el exponente en ah
        jnc p1 ; pasamos si es positivo
        mov byte ptr [di],'-'
    p1: sub ah,127    ;obtenemos el exponente real
        ;mov dh,ah     ;salvamos exponente
        ;;********* solo tomaremo en cuenta 7 bist de la mantisa
        mov cx,8          ;_
    c1: shl al,1          ;
        jc p2             ;  
        mov dl,30h ; '0'  ;  
        jmp c2            ;    } ponemos el binario de AL en [DI+3]
    p2: mov dl,31h ; '1'  ;   /
    c2: mov [di+3],dl     ;  /
        inc di            ; /
        loop c1           ;-
        ;;*********ponemos el expoente en la cadena
        mov cx,3        ;3 digitos en decimal max 255
        xchg al,ah      ;AL = expoente; AH = 0
        mov bl,10
    c3: div bl
        add ah,30h      ;convertimos a ASCCI
        mov [di+8],ax
        xor ah,ah
        dec di
        loop c3
        mov dx, offset resultado
        mov ah,9
        int 21h


fin: int 20h
n1 dd 1.25    ;numero uno
n2 dd 2.25    ;numero dos
r  dd 0.0    ;resultado
resultado db '+1.        *2^     (RESUTADO EN BINARIO)','$'
end inicio