Нахождение максимального и минимального элемента массива - Assembler

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

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

Задан массив A[N] из элементов типа short integer (целое 8-ми разрядное со знаком). Составить программу нахождения максимального и минимального элемента.

Решение задачи: «Нахождение максимального и минимального элемента массива»

textual
Листинг программы
_STACK  segment para stack
        db      1024 dup(?)
_STACK  ends
 
_DATA   segment
        N               dw      10
        A               db      48, -60, 117, 109, 111, 69, -102, 107, -128, 93
_DATA   ends
 
_TEXT   segment
        assume  cs:_TEXT, ds:_DATA, ss:_STACK
main    proc
        ;инициализация сегментного регистра данных
        mov     ax,     _DATA
        mov     ds,     ax
 
        mov     cx,     [N]
        lea     si,     [A]
        mov     dl,     [si]    ;min
        mov     dh,     [si]    ;max
        @@For:
                lodsb
        @@TestMin:
                cmp     al,     dl
                jge     @@TestMax
                mov     dl,     al
        @@TestMax:
                cmp     al,     dh
                jle     @@Next
                mov     dh,     al
        @@Next:
        loop    @@For
 
        mov     al,     dl
        cbw
        call    Show_AX
 
        mov     ah,     02h
        mov     dl,     ' '
        int     21h
 
        mov     al,     dh
        cbw
        call    Show_AX
 
        ;завершение программы
        mov     ax,     4C00h
        int 21h
main    endp
 
; выводит знаковое 16-разрядное число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx,     10
        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
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
 
_TEXT   ends
 
        end     main

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

  1. _STACK segment para stack db 1024 dup(?)
  2. _DATA segment dw N db 48,-60,117,109,111,69,-102,107,-128,93
  3. _TEXT segment main proc
  4. mov ax, _DATA
  5. mov ds, ax
  6. mov cx, [N]
  7. lea si, [A]
  8. mov dl, [si] (min)
  9. mov dh, [si] (max)
  10. @@For:
  11. lodsb
  12. @@TestMin:
  13. cmp al, dl
  14. jge @@TestMax
  15. mov dl, al
  16. @@TestMax:
  17. cmp al, dh
  18. jle @@Next
  19. mov dh, al
  20. @@Next:
  21. loop @@For
  22. mov al, dl
  23. cbw
  24. call Show_AX
  25. mov ah, 02h
  26. mov dl, ' '
  27. int 21h
  28. mov al, dh
  29. cbw
  30. call Show_AX
  31. mov ax, 4C00h
  32. int 21h
  33. main endp
  34. Show_AX proc
  35. push ax
  36. push bx
  37. push cx
  38. push dx
  39. push di
  40. mov cx, 10
  41. xor di, di (di - кол. цифр в числе)
  42. or ax, ax (проверка на отрицательное число)
  43. jns @@Conv
  44. push ax
  45. mov dx, '-'
  46. mov ah, 2 (функция вывода символа на экран)
  47. int 21h
  48. pop ax
  49. neg ax
  50. @@Conv:
  51. xor dx, dx
  52. div cx (dl = num mod 10)
  53. add dl, '0' (перевод в символьный формат)
  54. inc di
  55. push dx
  56. or ax, ax (проверка на число, большее 9)
  57. jnz @@Conv
  58. @@Show:
  59. pop dx
  60. mov ah, 2 (функция вывода символа на экран)
  61. int 21h
  62. dec di
  63. jnz @@Show
  64. pop di
  65. pop dx
  66. pop cx
  67. pop bx
  68. pop ax
  69. ret
  70. Show_AX endp
  71. end main

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

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