Арифметический пример



Арифметический пример


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





Содержание раздела