Подскажите как увеличить рабочие биты - Assembler

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

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

Доброго времени суток. у меня есть задание: Матрица размером 6х8 состоит из целых чисел, каждое из которых принадлежит диапазону от -32768 до +32767. Требуется переставить столбцы матрицы в порядке убывания сумм их элементов. Если все числа в матрице равны, следует вывести на экран соответствующее сообщение. Обмен информацией с пользователем организовать в виде специальных сообщений, каждое из которых следует размещать в отдельной строке экрана. Прогу я написал(корявенько но все же), все работает, но только при определенных условиях. числа у меня записываются в 16-битные регистры (т.к. диапазон от -32768 до +32767). Если будет ситуация что промежуточная сумма чисел столбцов будет выходить из диапазона или конечная сумма, тогда данные будут не верные. К примеру столбец со значениями:32767,32767,32767,32767,327670,32767,32767,32767; сумма будет 262136. так же может быть -262136. то есть необходимо 19 бит, где их найти ума не приложу. я подобрал числа чтобы промежуточная и конечная сумма была от -32768 до +32767, поэтому и работает) но все же это надо будет сдавать, подскажите как это можно исправить. программа пишется в эмуляторе emu8086, 16 разрядные регистры(. буду очень благодарен за помощь. код ниже.
Листинг программы
  1. data segment
  2. s1 db 'vse chisla ravni',0dh,0ah,'$'
  3. s2 db 'ishodnii massiv:',0dh,0ah,'$'
  4. s3 db ,0dh,0ah,'$'
  5. s4 db 'sortirovanii massiv:',0dh,0ah,'$'
  6. s5 db 'vivod summ stolbcov(ne sortir):',0dh,0ah,'$'
  7. s6 db 'vivod summ stolbcov sortirov:',0dh,0ah,'$'
  8. mas1 dw 17294,7222,311,-600,1,4829,4821,-564,-12,-7453,-6944,-11341,-23649,321,28749,281,11689,7893,781,17,-5490,-1342,3274,12,7654,-7893,2345,-7892,-564,14563,3210,30000,-12000,6780,-13248,-2340,-11698,-14280,11345,-2111,-2569,-12,23420,-27610,6782,3456,-22300,-2001
  9. mas2 dw 6 dup(0)
  10. buffer equ $
  11. ends
  12. stack segment
  13. dw 128 dup(0)
  14. ends
  15. code segment
  16. start:
  17. mov ax, data
  18. mov ds, ax
  19. mov es, ax
  20. mov ah,09h ;vivod stroki s2
  21. lea dx, s2
  22. int 21h
  23. call vivod ;vivod ishodnii mas1
  24. xor ax,ax
  25. xor bx,bx
  26. xor cx,cx
  27. xor dx,dx
  28. xor di,di
  29. mov cx,48 ;proverka, vse chisla ravni?
  30. a0: mov ax,mas1[di]
  31. mov bx,mas1[di+2]
  32. cmp ax,mas1[di+2]
  33. jne a1 ;perehod esli ne ravni
  34. inc di
  35. inc di
  36. loop a0
  37. mov ah,09h ;vivod stroki s1
  38. lea dx, s1
  39. int 21h
  40. a1:
  41. xor bx,bx
  42. xor di,di
  43. xor ax,ax
  44. xor si,si
  45. mov cx,6
  46. a2:
  47. push cx
  48. push di
  49. call summ ; procedura podscheta summu stolbcov, u zapis rezult v mas2
  50. pop di
  51. inc di
  52. inc di
  53. pop cx
  54. loop a2
  55. mov ah,09h ;vivod stroki s5
  56. lea dx, s5
  57. int 21h
  58. call vivod_s
  59. xor si,si
  60. mov cx,6
  61. push cx
  62. a6: ;sortirovka puzerkom
  63. dec cx
  64. cmp cx,0
  65. push cx
  66. je z1
  67. a3:
  68. mov ax,mas2[si] ;sravnivaem summu stolbcov
  69. mov bx,mas2[si+2]
  70. cmp ax,mas2[si+2]
  71. jl a4 ; esli menshe
  72. inc si
  73. inc si
  74. loop a3
  75. pop cx
  76. xor si,si
  77. jmp a6
  78. a4:
  79. push cx ; men9em mestami chisla v mas1
  80. mov cx,8
  81. mov di,si
  82. a5:
  83. mov ax,mas1[di]
  84. mov bx, mas1[di+2]
  85. mov mas1[di],bx
  86. mov mas1[di+2],ax
  87. add di,12
  88. loop a5
  89. mov ax,mas2[si] ; ; men9em mestami chisla v mas2
  90. mov bx,mas2[si+2]
  91. mov mas2[si],bx
  92. mov mas2[si+2],ax
  93. inc si
  94. inc si
  95. pop cx
  96. dec cx
  97. cmp cx,0
  98. je a7
  99. jmp a3
  100. a7:
  101. pop cx
  102. xor si,si
  103. jmp a6
  104. z1:
  105. mov ah,09h ;vivod stroki s6
  106. lea dx, s6
  107. int 21h
  108. call vivod_s
  109. mov ah,09h ;vivod stroki s4
  110. lea dx, s4
  111. int 21h
  112. call vivod ;vivod sortirovonnogo mas1
  113. int 20h
  114. summ proc
  115. mov cx,8
  116. xor bx,bx
  117. p1:
  118. mov ax,mas1[di]
  119. add bx,ax
  120. add di,12
  121. loop p1
  122. mov mas2[si],bx
  123. inc si
  124. inc si
  125. ret
  126. summ endp
  127. proc vivod
  128. xor si,si
  129. mov cx,8
  130. vivod1:
  131. push cx
  132. mov cx,6
  133. vivod2:
  134. mov ax,mas1[si]
  135. call print_word_sdec
  136. mov dl,' '
  137. mov ah,2h
  138. int 21h
  139. inc si
  140. inc si
  141. loop vivod2
  142. mov ah,09h ;vivod stroki s3
  143. lea dx, s3
  144. int 21h
  145. pop cx
  146. loop vivod1
  147. ret
  148.  
  149. vivod endp
  150. proc vivod_s
  151. xor si,si
  152. mov cx,6
  153. sum:
  154. mov ax,mas2[si]
  155. call print_word_sdec
  156. mov dl,' '
  157. mov ah,2h
  158. int 21h
  159. inc si
  160. inc si
  161. loop sum
  162. mov ah,09h ;vivod stroki s3
  163. lea dx, s3
  164. int 21h
  165. ret
  166. vivod_s endp
  167.  
  168. print_word_sdec:
  169. push di
  170. mov di,buffer ;DI = ????? ??????
  171. push di ;?????????? DI ? ?????
  172. call word_to_sdec_str ;?????????????? ????? ? AX ? ??????
  173. mov byte[di],'$' ;?????????? ??????? ????? ??????
  174. pop di ;DI = ????? ?????? ??????
  175. call print_str ;????? ?????? ?? ???????
  176. pop di
  177. ret
  178. word_to_sdec_str:
  179. push ax
  180. test ax,ax ;???????? ????? AX
  181. jns wtsds_no_sign ;???? >= 0, ??????????? ??? ???????????
  182. mov byte[di],'-' ;?????????? ????? ? ?????? ??????
  183. inc di ;????????? DI
  184. neg ax ;????????? ????? ???????? AX
  185. wtsds_no_sign:
  186. call word_to_udec_str ;?????????????? ???????????? ????????
  187. pop ax
  188. ret
  189. print_str:
  190. push ax
  191. mov ah,9 ;??????? DOS 09h - ????? ??????
  192. xchg dx,di ;????? ?????????? DX ? DI
  193. int 21h ;????????? ? ??????? DOS
  194. xchg dx,di ;????? ?????????? DX ? DI
  195. pop ax
  196. ret
  197. word_to_udec_str:
  198. push ax
  199. push cx
  200. push dx
  201. push bx
  202. xor cx,cx ;????????? CX
  203. mov bx,10 ;? BX ???????? (10 ??? ?????????? ???????)
  204. wtuds_lp1: ;???? ????????? ???????? ?? ???????
  205. xor dx,dx ;????????? ??????? ????? ???????? ?????
  206. div bx ;??????? AX=(DX:AX)/BX, ??????? ? DX
  207. add dl,'0' ;?????????????? ??????? ? ??? ???????
  208. push dx ;?????????? ? ?????
  209. inc cx ;?????????? ???????? ????????
  210. test ax,ax ;???????? AX
  211. jnz wtuds_lp1 ;??????? ? ?????? ?????, ???? ??????? ?? 0.
  212. wtuds_lp2: ;???? ?????????? ???????? ?? ?????
  213. pop dx ;?????????????? ??????? ?? ?????
  214. mov [di],dl ;?????????? ??????? ? ??????
  215. inc di ;????????? ?????? ??????
  216. loop wtuds_lp2 ;??????? ?????
  217. pop bx
  218. pop dx
  219. pop cx
  220. pop ax
  221. ret
  222.  
  223. ends
  224. end start

Решение задачи: «Подскажите как увеличить рабочие биты»

textual
Листинг программы
  1. not ax
  2. inc ax

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

  1. not ax - здесь происходит инверсия (обращение) значения регистра AX.
  2. inc ax - увеличивается значение регистра AX на единицу. Этот код на языке Assembler выполняет две операции: сначала инвертирует значение регистра AX, а затем увеличивает его на единицу.

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


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

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

12   голосов , оценка 4.333 из 5

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

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

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