Поиск минимального числа среди последних 4-х элементов на ассемблере
Есть код для поиска максимального числа среди всех элементов. Нужно переделать на поиск минимального числа среди последних 4-х элементов.
.model small
.stack
.data
message db "max = ", 30h,30h,"$"
string1 db 99,67,34,87,25,11,85,76,98
res db ?
strResult db 16 dup (0) ; string buffer to store result
.code
main proc
mov ax,seg message
mov ds,ax
mov cx,09h
mov bl,00h
lea si,string1
up:
mov al,[si]
cmp al,bl
jl next
mov bl,al
next:
inc si
dec cx
jnz up
mov res,bl
xor ax,ax
mov ax,bx
mov cx,10
xor bx,bx
divide:
xor dx,dx
div cx
push dx
inc bx
test ax,ax
jnz divide
mov cx,bx
lea si,strResult
next_digit:
pop ax
add al,'0'
mov [si],al
inc si
loop next_digit
lea di,message
lea si,strResult
mov bx,[si]
mov [di+6],bx
mov ah,09
lea dx,message
int 21h
main endp
end main
Ответы (1 шт):
Нужно начать с 4 с конца элемента, поэтому
lea si,string1нужно поменять на
; к адресу начала прибавляем длину массива и вычитаем 4 - получаем адрес 4 с конца элемента lea si, string1 + 9 - 4Нужно пройти только по 4 элементам вместо 9, поэтому количество итераций, заданное через регистр
cxменяем с 9 на 4:mov cx, 4Нужно найти минимум вместо максимума. В примере программы начальное значение максимума (0) записывается в регистр
bl. В данном случае проще всего за начальный минимум принять первый из 4 элементов:; к адресу начала прибавляем длину массива и вычитаем 4 - получаем адрес 4 с конца элемента lea si, string1 + 9 - 4 mov bl, [si]И еще нужно поменять условие в цикле на противоположное:
jl nextзаменить наjg next
Итого получается примерно такой фрагмент кода:
mov cx, 4 ; Пройти по 4 элементам
lea si, string1 + 9 - 4 ; Начиная с 4 элемента с конца
mov bl, [si] ; минимумом изначально считать первый из этих 4 элементов
up:
mov al, [si]
cmp al, bl
jg next ; если текущий элемент больше значения в bl - перепрыгиваем
mov bl, al ; если не больше, считаем его новым минимумом
next:
inc si
dec cx
jnz up
Еще один вариант - начинать с конца и двигаться в сторону начала списка:
mov cx, 4 ; Пройти по 4 элементам
lea si, string1 + 9 - 1 ; Начиная с последнего элемента
mov bl, [si] ; минимумом изначально считать первый встреченный из этих 4 элементов
up:
mov al, [si]
cmp al, bl
jg next ; если текущий элемент больше значения в bl - перепрыгиваем
mov bl, al ; если не больше, считаем его новым минимумом
next:
dec si ; двигаемся в сторону начала массива, поэтому вместо inc нужно делать dec
dec cx
jnz up