Ввод элементов массива через пробел - Assembler
Формулировка задачи:
Помогите с вводом чисел в двумерный массив. Элементы надо вводить через пробел построчно.
Вот само задание. Найти минимальный и максимальный элементы двумерного двухбайтового массива и указать их местоположение.
Решение задачи: «Ввод элементов массива через пробел»
textual
Листинг программы
- .model small
- .stack 100h
- .data
- msg_p db "",10,13,'$'
- Mas dw 3 dup (?)
- dw 3 dup (?)
- dw 3 dup (?)
- len db 9 ;кол-во элементов массива
- min dw 1 dup (?)
- max dw 1 dup (?)
- minnum dw 1 dup (?)
- maxnum dw 1 dup (?)
- buff db 12,13 dup (?)
- .code
- jmp main
- InInt proc
- push cx
- push dx
- push bx
- push si
- push di
- ; обрабатываем содержимое буфера
- nach: cmp byte ptr [si],' '
- jz prop
- cmp byte ptr [si],"-" ; если первый символ минус
- jnz ii1
- mov di,1 ; устанавливаем флаг
- inc si ; и пропускаем его
- jmp ii1
- prop: inc si
- jmp nach
- ii1:
- xor ax,ax
- mov bx,10 ; основание системы счичления
- ii2:
- mov cl,[si] ; берем символ из буфера
- cmp cl,' '
- jz endin
- ww: cmp cl,0dh
- jz endin ; завершаем разбор числа
- ; если это не замыкающий 0, то проверяем его на правильность
- tuda:
- cmp cl,'0' ; символ < 0
- jl endin
- cmp cl,'9' ; символ > 9
- ja endin ; на этом разбор числа заканчивается
- sub cl,'0' ; делаем из символа число
- mul bx ; умножаем на 10
- add ax,cx ; прибавляем к остальным
- inc si ; указатель на следующий символ
- jmp ii2 ; повторяем
- ; все символы из буфера обработаны число находится в ax
- endin:
- cmp di,1 ; если установлен флаг, то
- jnz suda
- neg ax
- suda: ; делаем число отрицательным
- pop bx
- mov mas[bx],ax
- add bx,2
- push bx
- mov cl,[si]
- cmp cl,0dh
- jz ii3
- jmp nach
- ii3:
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- ret
- InInt endp
- Show_AX proc
- mov cx, 10 ; cx - основание системы счисления
- xor di, di ; di - кол. цифр в числе
- ; если число в ax отрицательное, то
- ;1) напечатать '-'
- ;2) сделать ax положительным
- or ax, ax
- jns @@Conv
- push ax
- mov dx, '-'
- mov ah, 2 ; ah - функция вывода символа на экран
- int 21h
- pop ax
- neg ax
- @@Conv:
- xor dx, dx
- div cx ; dl = num mod 10
- add dl, '0' ; перевод в символьный формат
- inc di
- push dx ; складываем в стэк
- or ax, ax
- jnz @@Conv
- ; выводим из стэка на экран
- @@Show:
- pop dx ; dl = очередной символ
- mov ah, 2 ; ah - функция вывода символа на экран
- int 21h
- dec di ; повторяем пока di<>0
- jnz @@Show
- ret
- Show_AX endp
- main:
- mov ax, @data ;ds = сегмент .data
- mov ds, ax
- xor ax,ax ;ax=0
- Xor bx,bx ;инициализация индексного регистра
- Mov cx, 3 ;инициализация счетчика цикла
- cycl1:
- push cx
- mov ah,0ah
- mov dx,offset buff ; адрес буфера
- int 21h ; принимаем строку
- mov si,offset buff+2 ; готовим параметр для процедуры интерпретации
- mov bx,0
- call InInt ; переводим введенную строку в число
- mov ah,9 ;номер функции для вывода строки
- mov dx,OFFSET msg_p
- int 21h
- pop cx
- loop cycl1
- mov cx,9
- xor si,si
- mov ax,mas[si]
- mov max,ax
- cycl2:
- push cx
- mov ax,max
- cmp ax,mas[si]
- jl maxel
- jmp prop1
- maxel:
- mov ax,mas[si]
- mov max,ax
- mov maxnum,si
- prop1:
- add si,2
- pop cx
- loop cycl2
- mov ax, maxnum
- mov bh,2
- div bh
- mov ah,0
- call Show_AX
- mov ah,9 ;номер функции для вывода строки
- mov dx,OFFSET msg_p
- int 21h
- mov ax, max
- call Show_Ax
- mov ah,9 ;номер функции для вывода строки
- mov dx,OFFSET msg_p
- int 21h
- mov cx,9
- xor si,si
- mov ax,mas[si]
- mov min,ax
- cycl3:
- push cx
- mov ax,min
- cmp ax,mas[si]
- jg minel
- jmp prop2
- minel:
- mov ax,mas[si]
- mov min,ax
- mov minnum,si
- prop2:
- add si,2
- pop cx
- loop cycl3
- mov ax, minnum
- mov bh,2
- div bh
- call Show_AX
- mov ah,9 ;номер функции для вывода строки
- mov dx,OFFSET msg_p
- int 21h
- mov ax, min
- call Show_AX
- mov ah,4ch
- int 21h
- end main
Объяснение кода листинга программы
- Создается модель программы
small
с размером стека 100h - В секции данных объявляются переменные:
msg_p
- строка для вывода, инициализируется пустой строкойMas
- двумерный массив для хранения чиселlen
- количество элементов в массиве, устанавливается в 9min
,max
,minnum
,maxnum
- переменные для хранения минимального, максимального значения и их индексовbuff
- буфер для ввода данных
- В секции кода выполняются следующие действия:
- Инициализируются индексные регистры и счетчик цикла
- В цикле происходит ввод чисел в массив и их вывод
- В циклах происходит поиск максимального и минимального элементов в массиве
- Затем выводятся найденные значения Предположительно, этот код находится в среде MASM (Microsoft Macro Assembler) и написан на ассемблере для DOS. Он включает в себя процедуры для ввода целых чисел, реализации операции деления и функцию для вывода чисел на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д