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