ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Организация условных переходов в процессорах х86Задание: Пользуясь ассемблерными вставками в Pascal написать программу вычисления выражения
Укрупненное описание алгоритма:
1. Ввод исходных данных и размещение их в переменных А и В 2. Вычисление первого знаменателя А+В и проверка: если он равен 0 – вывод сообщения об ошибке и завершение работы 3. Вычисление второго знаменателя В-А и проверка его на равенство 0; если он равен 0 – вывод сообщения об ошибке и завершение работы 4. Вычисление второго числителя │А-2│ и деление его на второй знаменатель B-A (получение значения второй дроби ) 5. Вычисление первого числителя 3А+В4 и деление его на первый знаменатель A+B (получение значения первой дроби ) 6. Сложение значений первой и второй дробей (получение окончательного результата ) и размещение его в переменной С 7. Вывод значения выражения и числа из С.
Текст программы:
Program Prim; label m, m1, m2, ex; var A, B, C: integer; {переменные для исходных данных и результата}
begin write(A, B?:'); read(A, B); {вводим исходные данные} asm {начало ассемблерной вставки}
{вычисляем первый знаменатель и проверяем его} mov si, A {получаем сумму А+В в регистре si} add si, B jnе m {если она не равна 0 уходим на метку m} end; {конец ассемблерной вставки} writeln(‘A+B=0’); {иначе выводим сообщение А+В=0} asm {начало ассемблерной вставки} jmp ex {завершаем выполнение программы}
{вычисляем второй знаменатель и проверяем его} m: mov di, B {получаем разность В-А в регистре di} sub di, A jnz m1 {если она не равна 0 уходим на метку m1} end; {конец ассемблерной вставки} writeln(‘B-A=0’); {иначе выводим сообщение B-А=0} asm {начало ассемблерной вставки} jmp ex {завершаем выполнение программы}
{вычисляем второй числитель} m1: mov ax, A {получаем разность А-2 в регистре ax} sub ax, 2 {получаем абсолютную величину этой разности} jge m2 {если она больше или равна 0 уходим на метку m2} neg ax {иначе меняем ее знак на противоположный} {получаем значение второй дроби} m2: cwd {преобразуем числитель в 32 – разрядное число} idiv di {делим на знаменатель} mov bp, ax {частное пересылаем в регистр bp (освобождаем регистр ax) }
{вычисляем первый числитель} {в регистре ax получаем четвертую степень В} mov ax, B {помещаем В в ax} imul ax {возводим в квадрат} imul ax {полученный квадрат В еще раз возводим в квадрат} {к полученной четвертой степени В добавляем 3А} add ax, A add ax, A add ax, A
{получаем значение первой дроби} cwd {преобразуем числитель в 32 – разрядное число} idiv si {делим на знаменатель}
{получаем окончательный результат} add ax, bp {складываем значения первой и второй дробей} mov C, ax {помещаем полученную сумму в переменную С} end; {конец ассемблерной вставки}
{выводим результаты по выражению и ассемблерной вставке} writeln('Result: ', (3*A+sqr(sqr(B))) div (A+B)+abs(A-2) div (B-A), ', C = ', C) ex: end.
Результаты работы программы («скриншот»)
Не нашли, что искали? Воспользуйтесь поиском:
|