В массиве из двадцати элементов найти минимальный элемент из нечетных и вывести его номер - Assembler

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

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

Все элементы массива ввести с клавиатуры, ответ вывести на экран. В массиве из двадцати элементов найти минимальный элемент из нечетных и вывести его номер.

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

textual
Листинг программы
; В массиве из 20 элементов
; найти мин.элемент из нечетных и вывести его, и его номер.
;-----------------------------------------------------------
;fasm code....
org  100h
jmp  start
 
mess0   db   13,10,' Array: $'
mess1   db   13,10,' Min..: $'
mess2   db   13,10,' Index: $'
buff    db   20 dup(0)       ; буфер для ввода
 
start:  mov   ah,9       ; запрос на ввод массива
    mov   dx,mess0       ;
    int   21h        ;
    mov   cx,20      ; чисел для ввода
    mov   di,buff        ; адрес приёмника чисел
    push  cx di      ;   ..запомним эти значения в стеке
input:  xor   ax,ax      ; ввод без эхо!
    int   16h        ;
    cmp   al,'0'         ; фильт чисел..
    jb    input      ; пропустить, если меньше нуля
    cmp   al,'9'         ;
    ja    input      ;   ..и больше девяти
    int   29h        ; выводим символ на экран
    and   ax,0fh         ; переводим символ в число
    stosb            ; сохраняем число в буфере
    loop  input      ; мотаем цикл СХ-раз..
 
    pop   si cx      ; снимаем со-стека длину и адрес источника
    mov   ah,0feh        ; AH будет мин. Пока ставим его на макс.
    xor   bx,bx      ; BL будет номер (индекс,позиция) числа,
                 ; BH будет индекс минимального
cycle:  lodsb            ; берём очередное число
    inc   bl         ; индекс +1
    test  al,1       ; проверяем число на нечётное
    jz    next       ; пропускаем чётные..
    cmp   al,ah      ; сравниваем с предыдущим
    jae   next       ; пропустить, если больше/равно
    xchg  ah,al      ; иначе: отправляем число в АХ
    mov   bh,bl      ;   ..и запомним его индекс
next:   loop  cycle      ; мотаем цикл СХ-раз
 
    shr   ax,8       ; АХ = минимальное нечётное
    shr   bx,8       ; ВХ = его индекс в строке
    push  bx ax      ; запомним..
 
    mov   ah,9       ; мессага!
    mov   dx,mess1       ;
    int   21h        ;
    pop   ax         ; минимальное
    mov   bx,10      ; система счисления для вывода
    call  hex2asc        ; выводим его на экран!
 
    mov   ah,9       ; мессага!
    mov   dx,mess2       ;
    int   21h        ;
    pop   ax         ; индекс
    mov   bx,10      ; система счисления для вывода
    call  hex2asc        ; выводим его на экран!
 
exit:   xor   ax,ax      ; ждём любую клавишу..
    int   16h        ;
    int   20h        ; выход!
;---------------------------------------------------------------------
hex2asc:             ; Функция переводит числа в символы
    pusha            ; Вход:  АХ = число, BX = система счисления
    xor   cx,cx      ; Выход: на экране
isDiv:  xor   dx,dx      ;
    div   bx         ;
    push  dx         ;
    inc   cx         ;
    or    ax,ax      ;
    jnz   isDiv      ;
isOut:  pop   ax         ;
    cmp   al,9       ;
    jle   noHex      ;
    add   al,7       ;
noHex:  add   al,30h         ;
    int   29h        ;
    loop  isOut      ;
    popa             ;
    ret          ;

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

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