Перевести остаток в дробь - 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 ?
Объяснение кода листинга программы
- Переменные X, Y и Z инициализируются неизвестными значениями.
- В первых трех командах FPU используется для выполнения операций сложения и умножения, результат которых сохраняется в регистрах FPU.
- Команда FDIVP выполняет деление с остатком результата сложения и умножения, сохраненного в регистрах FPU.
- Результат деления сохранен в регистре FPU st0.
- Следующие две команды FST и FSTCW сохраняют значение регистра FPU st0 в памяти и устанавливают контрольное слово FPU в режим округления к ближайшему целому.
- Команды FLDCW и FRNDINT загружают контрольное слово FPU и округляют значение регистра FPU st0 к ближайшему целому.
- Результат округления сохранен в памяти по адресу Z.
- Результат вычитания сохранен в регистре FPU st1.
- Следующие две команды FIMUL и FISTP умножают значение регистра FPU st1 на 1000 и сохраняют результат в памяти по адресу Z_.
- Команда FSUBP вычисляет разность между значениями регистра FPU st1 и st0.
- Результат вычитания сохранен в регистре FPU st1.
- Команда FSTCW сохраняет контрольное слово FPU в памяти.
- Команда OR изменяет контрольное слово FPU, чтобы установить режим округления к ближайшему целому.
- Команда FLDCW загружает контрольное слово FPU.
- Команда FIST сохраняет целочисленную часть регистра FPU st0 в памяти по адресу Z.
- Команда FSUBP вычисляет разность между значениями регистра FPU st1 и st0.
- Результат вычитания сохранен в регистре FPU st1.
- Команда FSTCW сохраняет контрольное слово FPU в памяти.
- Команда OR изменяет контрольное слово FPU, чтобы установить режим округления к ближайшему целому.
- Команда FLDCW загружает контрольное слово FPU.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д