Программа для вычисления выражения в формате с плавающей точкой с использованием команд сопроцессора 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=$'
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д