Нахождение максимального и минимального элемента массива - 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
Объяснение кода листинга программы
- _STACK segment para stack db 1024 dup(?)
- _DATA segment dw N db 48,-60,117,109,111,69,-102,107,-128,93
- _TEXT segment 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
- Show_AX proc
- push ax
- push bx
- push cx
- push dx
- push di
- mov cx, 10
- xor di, di (di - кол. цифр в числе)
- or ax, ax (проверка на отрицательное число)
- jns @@Conv
- push ax
- mov dx, '-'
- mov ah, 2 (функция вывода символа на экран)
- 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 (проверка на число, большее 9)
- jnz @@Conv
- @@Show:
- pop dx
- mov ah, 2 (функция вывода символа на экран)
- int 21h
- dec di
- jnz @@Show
- pop di
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- Show_AX endp
- end main