Ввести массив с клавиатуры. В полученном массиве найти минимальный элемент. Вывести его на экран - Assembler

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

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

Просьба помочь решить задачу на MS Dos.

Ввести массив с клавиатуры. В полученном массиве найти минимальный элемент. Вывести его на экран.

Актуально...

Решение задачи: «Ввести массив с клавиатуры. В полученном массиве найти минимальный элемент. Вывести его на экран»

textual
Листинг программы
;ml -c proga.asm && wlink fi proga form dos com
.model tiny
.686
.code
    org 100h
start:  mov ecx,10
    xor esi, esi
    xor ebx, ebx
    inc ebx
    lea edi, offset array
again:  lea dx, offset req
    mov ah, 9h
    int 21h
    mov eax, ebx
    call    _cputul
    mov al,5Dh
    int 29h
    push    ecx
    mov ecx,11      ; желаемое кол-во цифр
    call    _cgetl
    jc  again
    inc ebx
    stosd
    cmp eax, esi
    cmovl   esi, eax
    pop ecx
    call    crlf
    loop    again
    mov dx, offset res
    mov ah, 9h
    int 21h
    mov eax, esi
    call    _cputl
    call    crlf
quit:   ret
 
; eax - signed long
_cputl:
        push    ebx
    mov ebx, eax
    neg ebx
    cmovs   ebx, eax
    js  @F
    mov al, '-'
    int 29h
@@: mov eax, ebx
    pop ebx
 
; eax - unsigned long
 
_cputul:
    pushad
    xor ecx, ecx
    mov ebx, 0Ah
    xor esi, esi
    xor edi, edi
@@: xor edx, edx
    inc ecx
    idiv    ebx
    shld    edi, esi, 4
    shl esi, 4
    or  si, dx
    test    eax, eax
    jnz @B
    mov edx, esi
@@: mov al, dl
    and al, 0fh
    or  al, 30h
    shrd    edx, edi, 4
    shr edi, 4
    int 29h
    loop    @B
    popad
    ret
 
 
; console - get signed long
; ввод с консоли целого знакового с отработкой удаления символа
; на входе: CX - кол-во цифр
; на выходе: EAX - введённое число или -1, если нажат <ESC>, а также CY=1
_cgetl:     pushad
        xor edx, edx
        mov ebp, edx
        mov ebx, ecx
@l:
        call    getch
        or  al,al
        jz  @l
        cmp al, 1Bh     ; <ESC>?
        jz  cancel
        cmp al, 0Dh         ; <Enter>?
        jz  done
        cmp al, '-'
        jz  sign
        cmp al, 08h         ; <BkSp>?
        jnz @F
        call    rubout
        jmp @l
@@:     cmp al, 30h
        jb  @l
        cmp al, 39h
        ja  @l
        movzx   eax,al          ; убираем из eax лишнее
            lea edx,[edx*4+edx]     ; EDX = EDX * 5
            lea edx,[edx*2+eax-48]  ; EDX = EDX * 2 + символ из AL - '0'
            int 29h
            loop    @l
; выход
done:       mov eax, edx        ;
        or  ebp, ebp
        jz  @F
        neg eax
@@:     clc
        jmp ex
; отмена, взводим Carry(CY), EAX = -1
cancel:     xor eax, eax
        dec eax             ; EAX = -1
        stc       
ex:     mov ss:[esp+1Ch], eax
        popad
        ret              ;
sign:       cmp ebx, ecx    ; первый символ?
        ja  @l              ; нет
        inc ebp
            
        int 29h
        jmp @l      
; ввод символа
getch:      xor     ax, ax
        int 16h
        ret
; новая строка
crlf:       push    ax
        mov ax, 0A0Dh
        int 29h
        xchg    al,ah
        int 29h
        pop ax
        ret
; отработка <BkSp>
rubout:     cmp ebx, ecx    ; первый символ?
        ja  @r              ; нет
        test    ebp,ebp     ; минус вводили?
        jz  @e              ; нет
        dec ebp             ; убираем флаг
        jmp @bs             ; стираем "-" с экрана
@r:     mov eax, edx
        xor edx, edx
        idiv    dword ptr ten   ; делим наше вводимое число на 10.
        mov edx,eax
        inc ecx
@bs:        call    bksp
@e:     ret
; курсор взад на 1 позицию
bksp:       mov ax, 2008h
        int 29h
        xchg    ah,al
        int 29h
        xchg    ah,al
        int 29h
        ret
.data
ten     dd  0Ah
req     db  'Enter array element[$'
res     db  'Min array element=$'
array       dd  10 dup(0)
        end start

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

  1. Ввод массива с клавиатуры: Ввод массива с клавиатуры выполняется с помощью функции _cgetl, которая принимает в качестве параметра желаемое количество цифр для ввода (в регистре ECX). Ввод выполняется по одной цифре за раз, при этом проверяется, является ли введенная цифра корректной (не является символом или ). Введенные цифры сохраняются в массиве array.
  2. Поиск минимального элемента: После ввода массива, выполняется цикл, который проходит по всем элементам массива, начиная с первого (индекс 0). На каждой итерации цикла, текущий элемент сравнивается с минимальным элементом, хранящимся в регистре ESI. Если текущий элемент меньше, он становится новым минимальным элементом и сохраняется в регистре ESI. После прохода по всем элементам массива, минимальный элемент выводится на экран с помощью функции _cputl.
  3. Вывод массива и минимального элемента: Для вывода массива и минимального элемента используется функция _cputl. При вызове этой функции, в регистре EAX сохраняется значение минимального элемента. Затем, с помощью функции crlf, на экран выводится строка Enter array element[, за которой следует приглашение для ввода массива. После ввода массива, на экран выводится строка Min array element=$, за которой следует значение минимального элемента.

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


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

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

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