Чтобы проиллюстрировать функции, которые мы рассмотрели в
предыдущих разделах, давайте решим арифиетическую задачу на языке
ассемблера. Пример прост, но использует многие команды. Задача
заключается в вычислении частного двух арифметических выражений, в
которых некоторые числа постоянны, а другие переменны. Все числа
являются 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 Пример арифметических вычислений Page 1-1
PAGE ,132
TITLE Фиг. 4.16 Пример арифметических вычислений
;-------------------------------------------------------------
; Производятся вычисления по формуле
;
; A * 2 + B * C
; X = -------------------
; D
- 3
;
; Все переменные - 16-разрядные целые числа со знаком
;-------------------------------------------------------------
Фиг. 4.16 Арифметический пример (начало)
0000 CODE SEGMENT
ASSUME CS:CODE,DS:CODE
0000 ???? X DW ? ; Память для переменных
0002 ???? A DW ?
0004 ???? B DW ?
0006 ???? C DW ?
0008 ???? D DW ?
000A FIG4_16 PROC NEAR
000A B8 0002 MOV AX, 2 ; Загрузка константы
000D F7 2E 0002 R IMUL A ; DX:AX = A * 2
0011 8B DA MOV BX, DX
0013 8B C8 MOV CX, AX ; BX:CX = A * 2
0015 A1 0004 R MOV AX, B
0018 F7 2E 0006 R IMUL C ; DX:AX = B * C
001C 03 C1 ADD AX, CX
001E 13 D3 ADC DX, BX ; DX:AX = A * 2 + B * C
0020 8B 0E 0008 R MOV CX, D
0024 83 E9 03 SUB CX, 3 ; CX = D - 3
0027 F7 F9 IDIV CX ; AX = (A*2 + B*C) / (D-3)
0029 A3 0000 R MOV X, AX ; Сохранение результата
002C C3 RET
002D FIG4_16 ENDP
002D CODE ENDS
END
Фиг. 4.16 Арифметический пример (продолжение)