Ввод элементов массива через пробел - 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. Он включает в себя процедуры для ввода целых чисел, реализации операции деления и функцию для вывода чисел на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д