Программа для вычисления выражения в формате с плавающей точкой с использованием команд сопроцессора I 80X87 - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите, пожалуйста, составить программу, а то сессия уже идет Составить программу на ассемблере для вычисления выражения в формате с плавающей точкой с использованием команд сопроцессора I 80X87 Числа B, C, D вводятся с клавиатуры в целочисленном десятичном формате и преобразуются в слова WORD Язык программирования - ассемблер в среде TASM Большое спасибо.

Решение задачи: «Программа для вычисления выражения в формате с плавающей точкой с использованием команд сопроцессора I 80X87»

textual
Листинг программы
;FASM
;z = (1005D+B)/C*D
    org 100h
    call    getvar
    jc  gtfo
    mov [B], eax
    call    getvar
    jc  gtfo
    mov [_C], eax
    call    getvar
    jc  gtfo
    mov [D], eax
    fild    word [@1005]
    fimul   dword [D]
    fiadd   dword [B]
    fidiv   dword [_C]
    fimul   dword [D]
    
    fst st1
    fstcw   [FPUCW]         ;store FPU control word
    or  word [FPUCW], 0C00h;set rounding mode: truncate
    fldcw   [FPUCW]     ;load FPU control word
    frndint         ; округляем
    fist    dword [Z]   ; сохраняем целую часть
    fsubp   st1, st0    ; получаем дробную часть
    fimul   dword [ths] ; *1000 - 3 знака после запятой
    fistp   dword [Z_]  ; сохраняем дробную часть
    mov dx, res
    mov ah, 9
    int 21h
    mov eax,[Z]
    call    _cputl
    mov al,'.'
    int 29h
    mov eax,[Z_]
    mov ecx,3
    call    _cputfc
    xor ax,ax
    int 16h
gtfo:   ret
_cputl:
    mov ebx, eax
    neg ebx
    cmovs   ebx, eax
    jle @F
    mov al, '-'
    int 29h
@@: mov eax, ebx
 
_cputul:
    xor ecx, ecx
    mov ebx, 0Ah
    xor esi, esi
    xor edi, edi
@@: xor edx, edx
    inc ecx
    idiv    ebx
    shld    edi, esi, 4
    shl esi, 4
    or  si, dx
    test    eax, eax
    jnz @B
    mov edx, esi
@@: mov al, dl
    and al, 0fh
    or  al, 30h
    shrd    edx, edi, 4
    shr edi, 4
    int 29h
    loop    @B
    ret
_cputfc:
    mov ebx, ecx
    xor esi, esi
    xor edi, edi
@@: xor edx, edx
    idiv    dword [ten]
    shld    edi, esi, 4
    shl esi, 4
    or  si, dx
    loop    @B
    mov ecx, ebx
    mov edx, esi
@@: mov al, dl
    and al, 0fh
    or  al, 30h
    shrd    edx, edi, 4
    shr edi, 4
    int 29h
    loop    @B
    ret
 
_cgetl:     pushad
        xor edx, edx
        mov ebp, edx
        mov ebx, ecx
@l:
        call    getch
        or  al,al
        jz  @l
        cmp al, 1Bh     
        jz  cancel
        cmp al, 0Dh         
        jz  done
        cmp al, '-'
        jz  sign
        cmp al, 08h         
        jnz @F
        call    rubout
        jmp @l
@@:     cmp al, 30h
        jb  @l
        cmp al, 39h
        ja  @l
        movzx   eax,al          
            lea edx,[edx*4+edx]     
            lea edx,[edx*2+eax-48]  
            int 29h
            loop    @l
; выход
done:       mov eax, edx        ;
        or  ebp, ebp
        jz  @F
        neg eax
@@:     clc
        jmp ex
cancel:     xor eax, eax
        dec eax             
        stc       
ex:     mov [ss:esp+1Ch], eax
        popad
        ret              ;
sign:       cmp ebx, ecx    
        ja  @l              
        inc ebp
            
        int 29h
        jmp @l      
 
getch:      xor     ax, ax
        int 16h
        ret
 
rubout:     cmp ebx, ecx    
        ja  @F              
        test    ebp,ebp     
        jz  @e              
        dec ebp             
        jmp @bs             
@@:     mov eax, edx
        xor edx, edx
        idiv    dword ptr ten   
        mov edx,eax
        inc ecx
@bs:        call    bksp
@e:     ret
 
bksp:       mov ax, 2008h
        int 29h
        xchg    ah,al
        int 29h
        xchg    ah,al
        int 29h
        ret
getvar: inc byte [msgvar]
    mov dx, msg
    mov ah, 9
    int 21h
    mov cx, 5
    call    _cgetl
    ret
@1005:  dw  1005
ten:    dd  10
ths:    dd  1000
FPUCW:  dw  ?
B:  dd  ?
_C: dd  ?
D:  dd  ?
Z:  dd  ?
Z_: dd  ?
msg:    db  0Dh,0Ah,'Enter A:$'
msgvar  =   $-3
res:    db  0Dh,0Ah,'Z=$'

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5