Перевести остаток в дробь - Assembler

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

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

Доброе утро. ТУПОЙ ВОПРОС: По заданию должен ввести два числа Х и У и решить такую функцию:

(x+y)/xy = z

Например ввожу 4 и 4, выходит 8/16. Но ассемблер решает это как AX = 0, DX = 8 (то есть остаток)

Как преобразовать это в дробь (0.5)?

Решение задачи: «Перевести остаток в дробь»

textual
Листинг программы
;FASM
;z = (x+y)/x*y
    fild    dword [X]
    fiadd   dword [Y]
    fild    dword [X]   ;st0=X, st1=X+Y
    fimul   dword [Y]       ;st0=X*Y
    fdivp                   ;st0=(X+Y)/XY 
    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    ; получаем дробную часть
;   fabs
    fimul   dword [ths] ; *1000 - 3 знака после запятой
    fistp   dword [Z_]  ; сохраняем дробную часть
;
ths:    dd  1000
FPUCW:  dw  ?
X:  dd  ?
Y:  dd  ?
Z:  dd  ?
Z_: dd  ?

Объяснение кода листинга программы

  1. Переменные X, Y и Z инициализируются неизвестными значениями.
  2. В первых трех командах FPU используется для выполнения операций сложения и умножения, результат которых сохраняется в регистрах FPU.
  3. Команда FDIVP выполняет деление с остатком результата сложения и умножения, сохраненного в регистрах FPU.
  4. Результат деления сохранен в регистре FPU st0.
  5. Следующие две команды FST и FSTCW сохраняют значение регистра FPU st0 в памяти и устанавливают контрольное слово FPU в режим округления к ближайшему целому.
  6. Команды FLDCW и FRNDINT загружают контрольное слово FPU и округляют значение регистра FPU st0 к ближайшему целому.
  7. Результат округления сохранен в памяти по адресу Z.
  8. Результат вычитания сохранен в регистре FPU st1.
  9. Следующие две команды FIMUL и FISTP умножают значение регистра FPU st1 на 1000 и сохраняют результат в памяти по адресу Z_.
  10. Команда FSUBP вычисляет разность между значениями регистра FPU st1 и st0.
  11. Результат вычитания сохранен в регистре FPU st1.
  12. Команда FSTCW сохраняет контрольное слово FPU в памяти.
  13. Команда OR изменяет контрольное слово FPU, чтобы установить режим округления к ближайшему целому.
  14. Команда FLDCW загружает контрольное слово FPU.
  15. Команда FIST сохраняет целочисленную часть регистра FPU st0 в памяти по адресу Z.
  16. Команда FSUBP вычисляет разность между значениями регистра FPU st1 и st0.
  17. Результат вычитания сохранен в регистре FPU st1.
  18. Команда FSTCW сохраняет контрольное слово FPU в памяти.
  19. Команда OR изменяет контрольное слово FPU, чтобы установить режим округления к ближайшему целому.
  20. Команда FLDCW загружает контрольное слово FPU.

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


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

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

6   голосов , оценка 3.833 из 5