Ввод элементов массива через пробел - Assembler

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

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

Помогите с вводом чисел в двумерный массив. Элементы надо вводить через пробел построчно. Вот само задание. Найти минимальный и максимальный элементы двумерного двухбайтового массива и указать их местоположение.

Решение задачи: «Ввод элементов массива через пробел»

textual
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4.  
  5. msg_p db "",10,13,'$'
  6. Mas dw 3 dup (?)
  7.     dw 3 dup (?)
  8.     dw 3 dup (?)
  9. len db 9 ;кол-во элементов массива
  10. min dw 1 dup (?)
  11. max dw 1 dup (?)
  12. minnum dw 1 dup (?)
  13. maxnum dw 1 dup (?)
  14. buff db 12,13 dup (?)
  15.  
  16. .code
  17. jmp main
  18. InInt proc
  19.         push cx
  20.         push dx
  21.         push bx
  22.         push si
  23.         push di
  24.        
  25. ; обрабатываем содержимое буфера
  26.  
  27.  nach:  cmp byte ptr [si],' '
  28.         jz prop
  29.         cmp byte ptr [si],"-" ; если первый символ минус
  30.         jnz ii1
  31.         mov di,1              ; устанавливаем флаг
  32.         inc si                ; и пропускаем его
  33.         jmp ii1
  34.         prop: inc si
  35.         jmp nach
  36. ii1:
  37.         xor ax,ax
  38.         mov bx,10             ; основание системы счичления
  39. ii2:
  40.         mov cl,[si]           ; берем символ из буфера
  41.         cmp cl,' '
  42.         jz endin
  43.         ww: cmp cl,0dh
  44.         jz endin              ; завершаем разбор числа
  45.        
  46. ; если это не замыкающий 0, то проверяем его на правильность
  47. tuda:
  48.         cmp cl,'0'            ; символ < 0
  49.         jl endin                  
  50.         cmp cl,'9'            ; символ > 9
  51.         ja endin              ; на этом разбор числа заканчивается
  52.  
  53.         sub cl,'0'            ; делаем из символа число
  54.         mul bx                ; умножаем на 10
  55.         add ax,cx             ; прибавляем к остальным
  56.         inc si                ; указатель на следующий символ
  57.         jmp ii2               ; повторяем
  58.  
  59. ; все символы из буфера обработаны число находится в ax
  60.  
  61. endin:
  62.         cmp di,1              ; если установлен флаг, то
  63.         jnz suda
  64.         neg ax
  65.         suda:               ; делаем число отрицательным
  66.         pop bx
  67.         mov mas[bx],ax
  68.         add bx,2
  69.         push bx
  70.         mov cl,[si]
  71.         cmp cl,0dh
  72.         jz ii3
  73.         jmp nach
  74. ii3:
  75.         pop di
  76.         pop si
  77.         pop dx
  78.         pop cx
  79. pop bx
  80.         ret
  81. InInt endp
  82.  
  83. Show_AX proc
  84.         mov     cx, 10          ; cx - основание системы счисления
  85.         xor     di, di          ; di - кол. цифр в числе
  86.  
  87.         ; если число в ax отрицательное, то
  88.         ;1) напечатать '-'
  89.         ;2) сделать ax положительным
  90.         or      ax, ax
  91.         jns     @@Conv
  92.         push    ax
  93.         mov     dx, '-'
  94.         mov     ah, 2           ; ah - функция вывода символа на экран
  95.         int     21h
  96.         pop     ax
  97.  
  98.         neg     ax
  99.  
  100. @@Conv:
  101.         xor     dx, dx
  102.         div     cx              ; dl = num mod 10
  103.         add     dl, '0'         ; перевод в символьный формат
  104.         inc     di
  105.         push    dx              ; складываем в стэк
  106.         or      ax, ax
  107.         jnz     @@Conv
  108.         ; выводим из стэка на экран
  109. @@Show:
  110.         pop     dx              ; dl = очередной символ
  111.         mov     ah, 2           ; ah - функция вывода символа на экран
  112.         int     21h
  113.         dec     di              ; повторяем пока di<>0
  114.         jnz     @@Show
  115.         ret
  116. Show_AX endp
  117.  
  118. main:
  119. mov ax, @data ;ds = сегмент .data
  120. mov ds, ax
  121. xor ax,ax     ;ax=0
  122. Xor bx,bx      ;инициализация индексного регистра
  123. Mov cx, 3      ;инициализация счетчика цикла
  124. cycl1:
  125. push cx
  126. mov ah,0ah
  127. mov dx,offset buff   ; адрес буфера
  128. int 21h              ; принимаем строку
  129. mov si,offset buff+2 ; готовим параметр для процедуры интерпретации
  130. mov bx,0
  131. call InInt           ; переводим введенную строку в число
  132. mov ah,9 ;номер функции для вывода строки
  133. mov dx,OFFSET msg_p
  134.     int 21h
  135. pop cx
  136. loop cycl1
  137.  
  138. mov cx,9
  139. xor si,si
  140. mov ax,mas[si]
  141. mov max,ax
  142. cycl2:
  143. push cx
  144. mov ax,max
  145. cmp ax,mas[si]
  146. jl maxel
  147. jmp prop1
  148. maxel:
  149. mov ax,mas[si]
  150. mov max,ax
  151. mov maxnum,si
  152. prop1:
  153. add si,2
  154. pop cx
  155. loop cycl2
  156.  
  157. mov ax, maxnum
  158. mov bh,2
  159. div bh
  160. mov ah,0
  161. call Show_AX
  162.  
  163. mov ah,9 ;номер функции для вывода строки
  164. mov dx,OFFSET msg_p
  165.     int 21h
  166. mov ax, max
  167. call Show_Ax
  168.  
  169. mov ah,9 ;номер функции для вывода строки
  170. mov dx,OFFSET msg_p
  171.     int 21h
  172.  
  173. mov cx,9
  174. xor si,si
  175. mov ax,mas[si]
  176. mov min,ax
  177. cycl3:
  178. push cx
  179. mov ax,min
  180. cmp ax,mas[si]
  181. jg minel
  182. jmp prop2
  183. minel:
  184. mov ax,mas[si]
  185. mov min,ax
  186. mov minnum,si
  187. prop2:
  188. add si,2
  189. pop cx
  190. loop cycl3
  191.  
  192. mov ax, minnum
  193. mov bh,2
  194. div bh
  195. call Show_AX
  196.  
  197. mov ah,9 ;номер функции для вывода строки
  198. mov dx,OFFSET msg_p
  199.     int 21h
  200. mov ax, min
  201. call Show_AX
  202.  
  203.  
  204. mov ah,4ch
  205.     int 21h
  206.  
  207. end main

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

  1. Создается модель программы small с размером стека 100h
  2. В секции данных объявляются переменные:
    • msg_p - строка для вывода, инициализируется пустой строкой
    • Mas - двумерный массив для хранения чисел
    • len - количество элементов в массиве, устанавливается в 9
    • min, max, minnum, maxnum - переменные для хранения минимального, максимального значения и их индексов
    • buff - буфер для ввода данных
  3. В секции кода выполняются следующие действия:
    • Инициализируются индексные регистры и счетчик цикла
    • В цикле происходит ввод чисел в массив и их вывод
    • В циклах происходит поиск максимального и минимального элементов в массиве
    • Затем выводятся найденные значения Предположительно, этот код находится в среде MASM (Microsoft Macro Assembler) и написан на ассемблере для DOS. Он включает в себя процедуры для ввода целых чисел, реализации операции деления и функцию для вывода чисел на экран.

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


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

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

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

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

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

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