Ввод элементов массива через пробел - 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

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

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

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


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

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

12   голосов , оценка 3.833 из 5
Похожие ответы