Консультация № 172065
11.09.2009, 00:12
0.00 руб.
0 8 2
нужно удалить максимум и минимум массива.

особенности реализации:

использовать процедуру вывода на экран.
разбить код программы на процедуры для лучшей читабельности.
применить передачу параметра через стек!!!(обязательно)
заранее очень благодарен!!!

Обсуждение

Неизвестный
11.09.2009, 07:43
общий
Мы с Вами делали программу на поиск максимального и минимального элемента. Измените её: нужно только запоминать не значение, а адрес.
А дальше вопрос: что значит "удалить"? Что физически с ними сделать нужно?
Неизвестный
11.09.2009, 09:25
общий
ну вот дан массив например:

Входной массив:

13 23 -133 55 7 0 2

выходной массив

13 23 7 0 2

минимальный : -133

Максимальный: 55

эти элементы были удалены из массива и результирующий массив был выведен на экран.
давно
Посетитель
7438
7205
11.09.2009, 14:06
общий
А если есть несколько мин и/или макс элементов? Удалять все?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
11.09.2009, 14:33
общий
да
давно
Посетитель
7438
7205
11.09.2009, 14:44
общий
Еще вопрос: как заполнять массив? Задать в коде программы, вводить с консоли, с файла....
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
11.09.2009, 15:58
общий
в коде программы!
давно
Посетитель
7438
7205
11.09.2009, 18:01
общий
это ответ
Здравствуйте, Середа Олег Эдуардович.
Я взял за основу ответ уважаемого Boriss-а на вопрос №171884
Подправил, чтобы была передача параметров через стек плюс добавил удаление мин и макс элементов с выводом результата
Прикрепленный файл в кодировке ASCII.
Удачи!

Приложение:
.model tiny, C ; Делаем COM-файл и передаем параметр, как в С
.186
.code
org 100h
start:
mov ax, 3
int 10h ; устанавливаем текстовый режим

cld ; буду использовать строковые инструкции
; установим флаг направления
;выводим массив
call output, offset ar, arsize, offset srcArray

; определение минимального и максимального
call minmax, offset ar, arsize, offset min_el, offset max_el

; вывод минимального и максимального
call PrintNum, offset minElem, min_el
call PrintNum, offset maxElem, max_el

; удаляем минимальный и максимальные элементы
call DelMinMax, offset ar, arsize, min_el, max_el

; выведем результат
call output, offset ar, ax, offset dstArray


lea dx, PressKey
mov ah,9
int 21h

xor ax, ax
int 16h

int 20h

; две подпрограммы для вывода чисел на экран
writeWordDEC proc near
; вывод на экран слова в AX, воспринимается как беззнаковое
uses cx, dx, bx, ax
mov bx, 10
xor cx, cx
@@1:
xor dx, dx
div bx
push dx
inc cx
or ax, ax
jnz @@1
@@2:
pop ax
add al, '0'
int 29h ; это прерывание умеет делать только одно -
; выводить символ в AL на экран
LOOP @@2

ret
writeWordDEC endp

WriteWordDEC_signed proc
; вывод на экран слова в AX как знакового
; просто, если отрицательное, выводит минус, превращает в
; положительное и вызывает подпрограмму writeWordDEC
uses ax
or ax, ax
jns @@_no_sign
push ax
mov al, '-'
int 29h
pop ax
neg ax ; изменение знака на +
@@_no_sign:
CALL writeWordDEC
ret
WriteWordDEC_signed endp

;вывод на экран массива с заголовком
output proc addrarray:word, arraysize:word, prstring:word
uses cx, si, ax, dx
mov dx, prstring
mov ah, 9
int 21h
mov cx, arraysize
mov si, addrarray
jcxz @@output_ret ;вдруг пусто (например, все потерли) :)
@@_next:
lodsw
CALL writeWordDEC_signed
mov al, ' '
int 29h
int 29h
LOOP @@_next
@@output_ret:
ret
output endp

;определение мин и макс элементов
minmax proc array:word, count:word, addrmin:word, addrmax:word
uses si, dx, bx, cx, ax
mov si, array
lodsw
mov dx, ax ;мин
mov bx, ax ;макс
mov cx, count
@@_analize_next:
lodsw
cmp ax, dx
jge @@10
mov dx, ax
@@10:
cmp ax, bx
jle @@20
mov bx, ax
@@20:
LOOP @@_analize_next
mov si, addrmin ;сохраним по адресу мин
mov [si], dx
mov si, addrmax ;сохраним по адресу макс
mov [si], bx
ret
minmax endp

;вывод числа с заголовком
PrintNum proc string:word, num:word
uses dx, ax
mov dx, string
mov ah, 9
int 21h
mov ax, num
CALL writeWordDEC_signed
ret
PrintNum endp

DelMinMax proc, arr:word, arrsize:word, delmin:word, delmax:word
uses si, di, cx
mov si, arr ; адрес исходного массива
mov di, si ; сюда же будем писать и результат
mov cx, arrsize ;длина исходного массива
@@_delete_min_max_next:
lodsw
cmp ax, delmin ;если равен минимальному
je @@30
cmp ax, delmax ; или максимальному
je @@30 ; то проигнорируем
stosw ;иначе сохраним
@@30:
LOOP @@_delete_min_max_next
mov ax, di ;di - адрес за результатом
sub ax, arr ;ax - длина результата в байтах
shr ax, 1 ;ax - длина результата в словах
ret
DelMinMax endp

PressKey db 13,10,10,'Press any key ...$'

srcArray db 'Исходный массив:',13,10,'$'
maxElem db 13,10,'Максимальный элемент массива: $'
minElem db 13,10,'Минимальный элемент массива: $'
dstArray db 13,10,'Результирующий массив:',13,10,'$'

align 2
ar dw 1, 12, 23, -3, -4, 0, 7 ; сюда просто добавляйте числа, если хотите
arsize equ ($ - ar)/2 ; так определяется констата = размер массива в словах (число элементов)
; $ - операция вычисления текущего адреса
min_el dw 0
max_el dw 0
end start
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
11.09.2009, 18:01
общий
это ответ
Здравствуйте, Середа Олег Эдуардович.
Я взял за основу ответ уважаемого Boriss-а на вопрос №171884
Подправил, чтобы была передача параметров через стек плюс добавил удаление мин и макс элементов с выводом результата
Прикрепленный файл в кодировке ASCII.
Удачи!

Приложение:
.model tiny, C ; Делаем COM-файл и передаем параметр, как в С
.186
.code
org 100h
start:
mov ax, 3
int 10h ; устанавливаем текстовый режим

cld ; буду использовать строковые инструкции
; установим флаг направления
;выводим массив
call output, offset ar, arsize, offset srcArray

; определение минимального и максимального
call minmax, offset ar, arsize, offset min_el, offset max_el

; вывод минимального и максимального
call PrintNum, offset minElem, min_el
call PrintNum, offset maxElem, max_el

; удаляем минимальный и максимальные элементы
call DelMinMax, offset ar, arsize, min_el, max_el

; выведем результат
call output, offset ar, ax, offset dstArray


lea dx, PressKey
mov ah,9
int 21h

xor ax, ax
int 16h

int 20h

; две подпрограммы для вывода чисел на экран
writeWordDEC proc near
; вывод на экран слова в AX, воспринимается как беззнаковое
uses cx, dx, bx, ax
mov bx, 10
xor cx, cx
@@1:
xor dx, dx
div bx
push dx
inc cx
or ax, ax
jnz @@1
@@2:
pop ax
add al, '0'
int 29h ; это прерывание умеет делать только одно -
; выводить символ в AL на экран
LOOP @@2

ret
writeWordDEC endp

WriteWordDEC_signed proc
; вывод на экран слова в AX как знакового
; просто, если отрицательное, выводит минус, превращает в
; положительное и вызывает подпрограмму writeWordDEC
uses ax
or ax, ax
jns @@_no_sign
push ax
mov al, '-'
int 29h
pop ax
neg ax ; изменение знака на +
@@_no_sign:
CALL writeWordDEC
ret
WriteWordDEC_signed endp

;вывод на экран массива с заголовком
output proc addrarray:word, arraysize:word, prstring:word
uses cx, si, ax, dx
mov dx, prstring
mov ah, 9
int 21h
mov cx, arraysize
mov si, addrarray
jcxz @@output_ret ;вдруг пусто (например, все потерли) :)
@@_next:
lodsw
CALL writeWordDEC_signed
mov al, ' '
int 29h
int 29h
LOOP @@_next
@@output_ret:
ret
output endp

;определение мин и макс элементов
minmax proc array:word, count:word, addrmin:word, addrmax:word
uses si, dx, bx, cx, ax
mov si, array
lodsw
mov dx, ax ;мин
mov bx, ax ;макс
mov cx, count
@@_analize_next:
lodsw
cmp ax, dx
jge @@10
mov dx, ax
@@10:
cmp ax, bx
jle @@20
mov bx, ax
@@20:
LOOP @@_analize_next
mov si, addrmin ;сохраним по адресу мин
mov [si], dx
mov si, addrmax ;сохраним по адресу макс
mov [si], bx
ret
minmax endp

;вывод числа с заголовком
PrintNum proc string:word, num:word
uses dx, ax
mov dx, string
mov ah, 9
int 21h
mov ax, num
CALL writeWordDEC_signed
ret
PrintNum endp

DelMinMax proc, arr:word, arrsize:word, delmin:word, delmax:word
uses si, di, cx
mov si, arr ; адрес исходного массива
mov di, si ; сюда же будем писать и результат
mov cx, arrsize ;длина исходного массива
@@_delete_min_max_next:
lodsw
cmp ax, delmin ;если равен минимальному
je @@30
cmp ax, delmax ; или максимальному
je @@30 ; то проигнорируем
stosw ;иначе сохраним
@@30:
LOOP @@_delete_min_max_next
mov ax, di ;di - адрес за результатом
sub ax, arr ;ax - длина результата в байтах
shr ax, 1 ;ax - длина результата в словах
ret
DelMinMax endp

PressKey db 13,10,10,'Press any key ...$'

srcArray db 'Исходный массив:',13,10,'$'
maxElem db 13,10,'Максимальный элемент массива: $'
minElem db 13,10,'Минимальный элемент массива: $'
dstArray db 13,10,'Результирующий массив:',13,10,'$'

align 2
ar dw 1, 12, 23, -3, -4, 0, 7 ; сюда просто добавляйте числа, если хотите
arsize equ ($ - ar)/2 ; так определяется констата = размер массива в словах (число элементов)
; $ - операция вычисления текущего адреса
min_el dw 0
max_el dw 0
end start
Прикрепленные файлы:
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа