Сложить наибольший и наименьший - Assembler
Формулировка задачи:
Программа находит наибольший и наименьший элементы, но они же оба занесены в ax. Да и ввод с выводом не выходит ни Через mox ax, oah и mov ax, 09h.
.model small .stack 100h .data lrg dw ? sml dw ? array dw 11, 12, 13 .code Main proc mov ax,@data mov ds,ax mov di, offset array mov ax,[di] ; 1 ele mov lrg, ax ; naibolsh mov sml, ax ; naimensh mov cx, 3 ;tsikl S1: mov ax,[di] ; zmachenie mass cmp ax,sml ; [di]>= sml? jge S2 ; yes, propusk mov ax,sml ; net, zanesti di in sml S2: cmp ax,lrg ;[di]<=lrg? jle S3 ;yes, propusk mov lrg, ax ; net, zanesti di in lrg S3: add di,2 ;next el loop S1 ; powt do cx=0 int 21h main endp
Решение задачи: «Сложить наибольший и наименьший»
textual
Листинг программы
.model small .stack 100h .data lrg dw ? sml dw ? N dw 8 array dw 11, 12, 13, 7, 100, 87, 177, 4 CrLf db 0Dh, 0Ah, '$' .code Main proc mov ax,@data mov ds,ax mov di, offset array mov ax,[di] ; 1 ele mov lrg, ax ; naibolsh mov sml, ax ; naimensh mov cx, [N] ;tsikl S1: mov ax,[di] ; zmachenie mass cmp ax,sml ; [di]>= sml? jge S2 ; yes, propusk mov ax,sml ; net, zanesti di in sml S2: cmp ax,lrg ;[di]<=lrg? jle S3 ;yes, propusk mov lrg, ax ; net, zanesti di in lrg S3: add di,2 ;next el loop S1 ; powt do cx=0 mov cx, [N] lea dx, [array] call ShowArray mov ah, 09h lea dx, [CrLf] int 21h mov ax, [sml] call Show_AX mov ah, 09h lea dx, [CrLf] int 21h mov ax, [lrg] call Show_AX mov ax, 4C00h int 21h Main endp ;Вывод массива слов (word) ;cx - количество выводимых элементов ;ds:dx - адрес массива слов ShowArray proc push ax push bx push cx push dx push si push di jcxz @@Exit ;если массив пустой - завершить mov si, 1 ;индекс элемента массива mov di, dx ;адрес текущего элемента массива @@ForI: mov ax, [di] call Show_AX mov ah, 02h mov dl, ' ' int 21h ;переход к следующему элементу inc si add di, 2 loop @@ForI @@Exit: pop di pop si pop dx pop cx pop bx pop ax ret ShowArray 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 end main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д