Ввести массив с клавиатуры. В полученном массиве найти минимальный элемент. Вывести его на экран - 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
Объяснение кода листинга программы
- Ввод массива с клавиатуры:
Ввод массива с клавиатуры выполняется с помощью функции _cgetl, которая принимает в качестве параметра желаемое количество цифр для ввода (в регистре ECX). Ввод выполняется по одной цифре за раз, при этом проверяется, является ли введенная цифра корректной (не является символом
или ). Введенные цифры сохраняются в массиве array. - Поиск минимального элемента: После ввода массива, выполняется цикл, который проходит по всем элементам массива, начиная с первого (индекс 0). На каждой итерации цикла, текущий элемент сравнивается с минимальным элементом, хранящимся в регистре ESI. Если текущий элемент меньше, он становится новым минимальным элементом и сохраняется в регистре ESI. После прохода по всем элементам массива, минимальный элемент выводится на экран с помощью функции _cputl.
- Вывод массива и минимального элемента:
Для вывода массива и минимального элемента используется функция _cputl. При вызове этой функции, в регистре EAX сохраняется значение минимального элемента. Затем, с помощью функции crlf, на экран выводится строка
Enter array element[
, за которой следует приглашение для ввода массива. После ввода массива, на экран выводится строкаMin array element=$
, за которой следует значение минимального элемента.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д