На главную Назад
Добро пожаловать, уважаемый посетитель!

Чтобы проиллюстрировать функции, которые мы рассмотрели в

предыдущих разделах, давайте решим арифиетическую задачу на языке

ассемблера.Пример прост, но использует многие команды.Задача

заключается в вычислении частного двух арифметических выражений, в

которых некоторые числа постоянны, а другие переменны.Все числа

являются 16=битовыми целыми числами со знаком.

 

Формула вычислений:

A * 2 + B * C

X = ------------------

D - 3

 

Эта задача решается подпрограммой на языке ассемблера,

изображенной на Фиг. 4.16. Подпрограмма сначала выполняет два

умножения. Так как микропроцессор 8088 всегда помещает результат

16=битового умножения в пару регистров DX:AX, в примере результат

первого умножения переносится в пару регистров BX:CX перед

выполнением второго умножения. Когда оба умножения завершены,

программа выполняет сложение числителя. Поскольку умножение дает

32=битовые результаты, в программе требуется сложение повышенной

точности. Это сложение оставляет результат в DX:AX. В примере

знаменатель вычисляется в регистре CX, а затем на него делится

числитель. Программа записывает частное из регистра AX в переменную

результата X. Остаток в этой задаче игнорируется.

Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:01:10

Фиг. 4.16 Пример арифметических вычислений Page1-1

 

 

PAGE,132

TITLEФиг. 4.16 Пример арифметических вычислений

 

;-------------------------------------------------------------

; Производятся вычисления по формуле

;

;A * 2+B * C

;X= -------------------

;D-3
;

; Все переменные - 16-разрядные целые числа со знаком

;-------------------------------------------------------------

 

Фиг. 4.16 Арифметический пример (начало)

0000CODESEGMENT

ASSUMECS:CODE,DS:CODE

 

0000????XDW?; Память для переменных

0002????ADW?

0004????BDW?

0006????CDW?

0008????DDW?

 

000AFIG4_16 PROCNEAR

 

000AB8 0002MOVAX, 2; Загрузка константы

000DF7 2E 0002 RIMULA; DX:AX = A * 2

00118B DAMOVBX, DX

00138B C8MOVCX, AX; BX:CX = A * 2

0015A1 0004 R MOVAX, B

0018F7 2E 0006 RIMULC; DX:AX = B * C

001C03 C1ADDAX, CX

001E13 D3ADCDX, BX; DX:AX = A * 2+B * C

00208B 0E 0008 RMOVCX, D

002483 E9 03SUBCX, 3; CX = D - 3

0027F7 F9IDIVCX ; AX = (A*2 + B*C) / (D-3)

0029A3 0000 RMOVX, AX; Сохранение результата

002CC3RET

 

002DFIG4_16 ENDP

002DCODEENDS

END

 

Фиг. 4.16 Арифметический пример (продолжение)


 

Mail.ru