Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 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.

 

Результаты работы программы («скриншот»)

 

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных