Реализовать сложение, вычитание, умножение многочленов - Assembler

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

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

Листинг программы
  1. .model small
  2. .stack 256
  3. .386
  4. .data
  5. mes1 db 0Dh, 0Ah, 'Enter the degree: $'
  6. mes2 db 0Dh, 0Ah, 'Enter the coef of x^$'
  7. mes3 db ': $'
  8. mes4 db 0Dh, 0Ah, 'Choose action: $'
  9. mes5 db 0Dh, 0Ah, '= $'
  10. polynom struc
  11. coef dw 256 dup ('0')
  12. polynom ends
  13. polynoms struc
  14. coefs dw 512 dup ('0')
  15. polynoms ends
  16. deg1 db 0
  17. deg2 db 0
  18. temp dw 0
  19. signs db 0
  20. pol1 polynom <>
  21. pol2 polynom <>
  22. res polynoms <>
  23. .code
  24. rchar proc
  25. mov ah, 1
  26. int 21h
  27. ret
  28. rchar endp
  29. wchar proc ; v AL dolzhen lezhat kod simvola
  30. push ax
  31. mov ah, 2
  32. mov dl, al
  33. int 21h
  34. pop ax
  35. ret
  36. wchar endp
  37. rnum proc ; v DX sohranyaetsa chislo
  38. push ax
  39. push bx
  40. push cx
  41. mov cx, 0
  42. mov bx, 1
  43. mov dx, 0
  44. read:
  45. call rchar
  46. cmp al, 13
  47. je end_read
  48. cmp al, '-'
  49. je otr
  50. xor ah, ah
  51. sub al, '0'
  52. push ax
  53. inc cx
  54. jmp read
  55. otr:
  56. mov signs, 1
  57. jmp read
  58. end_read:
  59. pop ax
  60. mul bx
  61. add dx, ax
  62. mov ax, 10
  63. mul bx
  64. mov bx, ax
  65. loop end_read
  66. cmp signs, 1
  67. je change_sign
  68. jmp ender
  69. change_sign:
  70. neg dx
  71. ender:
  72. pop cx
  73. pop bx
  74. pop ax
  75. ret
  76. rnum endp
  77. wnum proc ; v AX dolzhno lezhat chislo
  78. push ax
  79. push bx
  80. push cx
  81. push dx
  82. test ax, ax
  83. js write_minus
  84. jmp write_num
  85. write_minus:
  86. push ax
  87. push dx
  88. mov al, '-'
  89. call wchar
  90. pop dx
  91. pop ax
  92. neg ax
  93. write_num:
  94. mov bl, 10
  95. mov cx, 0
  96. divs:
  97. div bl
  98. add ah, '0'
  99. push ax
  100. inc cx
  101. cmp al, 0
  102. je end_div
  103. xor ah, ah
  104. jmp divs
  105. end_div:
  106. pop ax
  107. mov al, ah
  108. call wchar
  109. loop end_div
  110. pop dx
  111. pop cx
  112. pop bx
  113. pop ax
  114. ret
  115. wnum endp
  116. input proc ; v BX dolzhen lezhat adres nachala polynoma, v AL - stepen polynoma
  117. push ax
  118. push bx
  119. push cx
  120. push dx
  121. xor ah, ah
  122. mov cx, ax
  123. inc cx
  124. cycle:
  125. mov ah, 9
  126. lea dx, mes2
  127. int 21h
  128. xor ah, ah
  129. call wnum
  130. mov ah, 9
  131. lea dx, mes3
  132. int 21h
  133. call rnum
  134. xor ah, ah
  135. mov si, ax
  136. add si, si
  137. mov [bx + si], dx
  138. sub si, 2
  139. loop cycle
  140. pop dx
  141. pop cx
  142. pop bx
  143. pop ax
  144. ret
  145. input endp
  146. output proc ; v BX dolzhen lezhat adres nachala polynoma, v AX - stepen polynoma
  147. push ax
  148. push bx
  149. push cx
  150. push dx
  151. mov ah, 9
  152. lea dx, mes5
  153. int 21h
  154. mov cx, ax
  155. inc cx
  156. mov si, ax
  157. add si, si
  158. cicl:
  159. mov ax, [bx + si]
  160. push bx
  161. push ax
  162. cmp ax, 0
  163. je skip
  164. test ax, ax
  165. jns write_plus
  166. nazad:
  167. call wnum
  168. jmp sled
  169. write_plus:
  170. mov al, '+'
  171. call wchar
  172. jmp nazad
  173. sled:
  174. mov al, 'x'
  175. call wchar
  176. mov al, '^'
  177. call wchar
  178. pop ax
  179. mov bx, 2
  180. div bx
  181. call wnum
  182. sub si, 2
  183. pop bx
  184. loop cicl
  185. jmp rest
  186. skip:
  187. sub si, 2
  188. pop ax
  189. pop bx
  190. loop cicl
  191. rest:
  192. pop dx
  193. pop cx
  194. pop bx
  195. pop ax
  196. ret
  197. output endp
  198. start:
  199. mov ax, @data
  200. mov ds, ax
  201. mov ah, 9
  202. lea dx, mes1
  203. int 21h
  204. call rnum
  205. mov deg1, dl
  206. lea bx, pol1.coef
  207. mov al, deg1
  208. call input
  209. mov ah, 9
  210. lea dx, mes1
  211. int 21h
  212. call rnum
  213. mov deg2, dl
  214. lea bx, pol2.coef
  215. mov al, deg2
  216. call input
  217. mov ah, 4ch
  218. int 21h
  219. end start
необходимо реализовать сложение, вычитание, умножение многочленов с помощью структур. Самая сложная часть сделана, осталось добавить только сами операции. Проблема в том, что программа работает неправильно на этапе ввода коэффициентов. Сначала выводится строка с предложением ввести степень. Пока что все нормально. Потом выводится строка с предложением ввести коэффициент x^36. Причем неважно, что было нажато до этого. Всегда выводится x^36. Затем все повторяется, но уже для второго полинома. В чем может быть ошибка?
Прогнал программу через дебаггер. Почему-то процедура rnum не изменяет значение регистра dx. В нем как был 0, так и остается. В ax изначально было 0924. После mov al, dl значение меняется на 0900. Это и есть 36. Вопрос: почему процедура не меняет значение регистра dx?
После выполнения команды в 63 строке dx обнуляется. Почему - неизвестно. Попробую обойти проблему при помощи стека.

Решение задачи: «Реализовать сложение, вычитание, умножение многочленов»

textual
Листинг программы
  1. add res3.coef[si][bx - 2], ax

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

  1. В данном коде выполняется сложение.
  2. res3.coef - это переменная, которая содержит многочлен.
  3. si и bx - это индексы массива, которые используются для доступа к конкретному элементу многочлена.
  4. ax - это второй операнд, который также является многочленом.
  5. Результат сложения сохраняется в переменной res3.coef.

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


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

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

15   голосов , оценка 3.867 из 5

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

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

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