Вычисления значения функции в формате с плавающей запятой - Assembler

Узнай цену своей работы

Формулировка задачи:

Задание такое - Написать программу для решения функции y=х^2-x^4, где х меняется от -2 до +2 с шагом 0,5. Нужно вычислить функцию на каждом шаге. В формате вычисления с плавающей комой. Процессор х86.
Листинг программы
  1. TITLE Курсова робота
  2. EXTERN MULFXX, MULFXY, ADDSUBFYZ, ADDSUBFYZ
  3. STACK SEGMENT PARA STACK STACK
  4. DB 64 DUP (0)
  5. STACK ENDS
  6. DSEG SEGMENT PARA PUBLIC DATA
  7. X DD -2.0
  8. DX DD 0.5
  9. Y DD 1 DUP (0)
  10. Z DD 1 DUP (0)
  11. R DQ 8 DUP (0)
  12. DSEG ENDS
  13. CSEG SEGMENT PARA PUBLIC CODE
  14. ASSUME CS:CSEG, DS:DSEG, SS:STACK
  15. MAIN PROC FAR
  16. mov ax,DSEG
  17. mov ds,ax
  18. mov cx,8 ; по скольку нужно сделать исчисления от -2 до +2 с шагом 0,5 заносим в счётчик(сх) 8
  19. push cx ; заносим в стек сх, по скольку в подпрограммах используется регистр сх
  20. Start: call MULFXX ; Возводим Х в квадрат и заносим результат в Y
  21. call MULFYY ; Возводим Х в 4 степень и заносим результат в Z
  22. call ADDSUBFYZ ; Y-Z
  23. pop cx ; достаём сх из стека для цикла
  24. call ADDSUBFXDX ; для реализации шага выполняем эту подпрограмму, то есть x-dx, то есть 2.0-0,5, то есть, если сначала в Х было значение -2.0, то теперь там -1.5
  25. loop Start ; цикл
Такие вопросы Как после выполнения всех подпрограмм занести результат со смещением 4 байта и в какой регистр его лучше занести ? Будет ли уменьшатся сх после того как мы его достанем из стека и выполним цикл. То есть сначала в сх 8, после того выполнили цикл, он должен стать 7, но поскольку мы достаём из стека сх со значением 8, значит сх не уменьшается. Во общем если сх не уменьшается, то как сделать так что бы программа выполнилась 8 раз и закончилась ?

Решение задачи: «Вычисления значения функции в формате с плавающей запятой»

textual
Листинг программы
  1. Start:          lea si,Y
  2. lea di,Z
  3. mov bx,[si+2]
  4. mov si,[si]
  5. mov dx,[di+2]
  6. mov di,[di]
  7. ; Переход к подпрограммам сложения, вычитания
  8. call    ADDSUBF
  9. ADDSUBF PROC
  10.  
  11. ; Сравнить знаки операндов и определить операцию
  12. @addf:  mov al,bh   ; Сравнить
  13. xor     al,dh   ; знаки операндов
  14. jns     @addf1  ; Знаки операндов одинаковы
  15. xor     dh,80h  ; Знаки различны,
  16. jmp     @subf   ; перейти к вычитанию
  17. ;
  18. ; Проверить операнды на нуль
  19. @addf1: mov ax,dx   ; Проверить на нуль
  20. or  ax,di   ;   второй операнд
  21. jz  @addf8  ;   Результат в BX:SI
  22. mov ax,bx   ;   Проверить на нуль
  23. or  ax,si   ;   первый операнд
  24. jnz @addf2  ;   Оба операнда не нулевые
  25. xchg    bx,dx   ;   Первый операнд равен нулю,
  26. xchg    si,di   ;   сумма равна
  27. jmp @addf8  ;   второму операнду
  28. ;
  29. ; Оба операнда не нулевые можно складывать.
  30. @addf2: mov ah,bh   ; Сравнить общий знак в АН
  31. shl bx,1    ; Восстановить скрытый бит
  32. stc ; мантиссы первого операнда
  33. rcr bl,1
  34. shl dx,1    ; Восстановить скрытый бит
  35. stc ; мантиссы второго операнда
  36. rcr dl,1
  37. ; Сранить порядки, образовать разность порядков
  38. cmp bh,dh   ; Сравнить порядки
  39. jnc @addf3  ; Порядок числа в BX:SI больше
  40. xchg    bx,dx   ; Передать большее число
  41. xchg    si,di   ; в BX:SI
  42. @addf3: sub bh,dh   ; Образовать разность порядков
  43. jz  @addf6  ; Порядки одинаковы
  44. cmp bh,24   ; Сравнить разность порядков с 24
  45. jc  @addf5  ; Разность порядков меньше 24
  46. jmp @addf7  ; Результата в BX:SI
  47. ; Необходимо сдвигать вправо мантиссу меньшего числа в DL:DI
  48. @addf5: shr     dl,1    ; Сдвинуть мантиссу
  49. rcr di,1
  50. inc dh      ; Увеличить меньший порядок
  51. dec bh      ; Декремент разности порядков
  52. jnz @addf5  ; Повторять сдвиг
  53. mov bh,dh   ; Передать порядок в BH
  54. ;
  55. ; Можно складывать мантиссы. В регистре DH общий порядок
  56. @addf6: add     si,di   ; Сложить младшие части мантисс
  57. adc     bl,dl   ; Сложить старшие части мантисс
  58. jnc     @addf7  ; Нарушения нормализации влево нет
  59. inc     dh      ; Скорректировать порядок
  60. cmp     dh,255  ; Проверить переполнение
  61. stc
  62. jz  @addf8  ; Возникло пререполнение
  63. rcr bl,1    ; Сдвинуть
  64. rcr si,1    ; мантиссу вправо
  65. mov bh,dh   ; Передать порядок в BH
  66. ;
  67. ; Форматировать результат
  68. @addf7: add ah,ah   ; Знак во флаге переноса
  69. rcr bh,1    ; Знак числа на месте
  70. rcr ah,1    ; Младший бит порядка в АН7
  71. or  ah,7fh  ; Образовать мантиссу
  72. and bl,ah   ; Образовать второй байт числа
  73. @addf8: ret
  74. ;
  75. ; Сохранить результат
  76. lea di,Z
  77. mov [di],si
  78. mov [di+2],bx
  79. jmp Start   ;ret
  80.  
  81. @subf:
  82. ; Проверить операнды на нуль
  83. @subf1: mov ax,dx   ; Проверить на нуль
  84. or  ax,di   ;   второй операнд
  85. jz  @subfa  ;   Результат в BX:SI
  86. mov ax,bx   ;   Проверить на нуль
  87. or  ax,si   ;   первый операнд
  88. jnz @subf2  ;   Оба операнда не нулевые
  89. xchg    bx,dx   ;   Первый операнд равен нулю,
  90. xchg    si,di   ;   разность равна
  91. xor bh,80h  ;   второму операнду
  92. jmp @subfa  ;   с измененным знаком
  93. ;
  94. ; Оба операнда не нулевые можно вычитать.
  95. @subf2: mov ah,bh   ; Сохранить знак уменьшаемого
  96. shl bx,1    ; Восстановить скрытый бит
  97. stc ; мантиссы уменьшаемого
  98. rcr bl,1
  99. shl dx,1    ; Восстановить скрытый бит
  100. stc ; мантиссы вычитаемого
  101. rcr dl,1
  102. ; Проверить отношения между числами
  103. cmp bh,dh   ;   Сравнить порядки
  104. jnz @subf3  ;   Порядки не равны
  105. cmp bl,dl   ;   Сранить старшие байты мантисс
  106. jnz @subf3  ;   Они не равны
  107. cmp si,di   ;   Сравнить младшие слова мантисс
  108. jnz @subf3  ;   Они не равны
  109. mov bx,0    ;   Числа равны,
  110. mov si,0    ;   разность равна нулю
  111. jmp @subfa
  112. ; Операнды не равны, необходимо вычитать.
  113. @subf3: jnc @subf4  ; Уменьшаемое больше вычитаемого
  114. xchg    bx,dx   ; Вычитаемое больше уменьшаемого,
  115. xchg    si,di   ; обменять числа
  116. xor ah,80h  ; Изменить знак результата
  117. ; Образовать разность порядков.
  118. @subf4: sub bh,dh   ; Разность порядков в BH
  119. jz  @subf7  ; Порядки одинаковы
  120. cmp bh,24   ; Сравнить разность порядков с 24
  121. jc  @subf6  ; Разность порядков меньше 24
  122. jmp @subf9  ; Результата в BX:SI
  123. ; Необходимо сдвигать вправо мантиссу менишего числа в DL:DI
  124. @subf6: shr     dl,1    ; Сдвинуть мантиссу
  125. rcr di,1
  126. inc dh      ; Увеличить меньший порядок
  127. dec bh      ; Декремент разности порядков
  128. jnz @subf6  ; Повторять сдвиг
  129. mov bh,dh   ; Передать общий порядок в BH
  130. ; Вычитание мантисс и образование результата.
  131. @subf7: sub si,di   ; Вычесть мантиссы
  132. sbb bl,dl
  133. @subf8: or  bl,bl   ; Проверить старший бит мантиссы
  134. js      @subf9  ;   Результат нормализован
  135. dec     bh  ;   Декремент порядка
  136. cmp     bh,255  ;   Проверить переполнение
  137. stc ;   Установить флаг переноса
  138. jz      @subfa  ;   Возникло антипереполнение
  139. shl     si,1    ;   Сдвинуть мантиссу влево
  140. rcl bl,1
  141. jmp @subf8  ; Повторять до нормализации
  142. ; Форматировать результат
  143. @subf9: add ah,ah   ; Знак во флаге переноса
  144. rcr bh,1    ; Знак числа на месте
  145. rcr ah,1    ; Младший бит порядка в АН7
  146. or  ah,7fh  ; Образовать мантиссу
  147. and bl,ah   ; Образовать второй байт числа
  148. @subfa: ret
  149. ;
  150. ; Сохранить результат
  151. mov ax,si   ; младшая часть ответа в ах
  152. lodsw       ; младшая часть ответа из ах по адресу di, а di+2
  153. mov ax,bx   ; старшая часть ответа в ах
  154. lodsw       ; старшая часть ответа из ах по адресу di, а di+2
  155.  
  156. ADDSUBF ENDP

Объяснение кода листинга программы

  1. Сначала код вычисляет значение функции в формате с плавающей запятой.
  2. В начале кода происходит загрузка значений функций в регистры SI и ZD.
  3. Затем происходит сравнение знаков операндов и определение операции.
  4. Если знаки операндов одинаковы, то выполняется сложение.
  5. Если знаки операндов различны, то выполняется вычитание.
  6. Далее происходит проверка операндов на нуль.
  7. Если один из операндов равен нулю, то результат функции равен второму операнду.
  8. Если оба операнда не равны нулю, то происходит проверка отношений между числами.
  9. Если числа равны, то результат функции равен нулю.
  10. Если числа не равны, то выполняется вычитание.
  11. Затем происходит образование разности порядков.
  12. Далее происходит сдвиг мантиссы меньшего числа вправо.
  13. Затем происходит вычитание мантисс и образование результата.
  14. После этого происходит форматирование результата.
  15. В конце кода результат функции сохраняется в памяти.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы