|
Чтобы проиллюстрировать функции, которые
мы рассмотрели в
предыдущих разделах, давайте решим арифиетическую задачу на языке
ассемблера.Пример прост, но использует многие команды.Задача
заключается в вычислении частного двух
арифметических выражений, в
которых некоторые числа постоянны, а
другие переменны.Все числа
являются 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 Арифметический пример
(продолжение)
|