Консультация № 171884
04.09.2009, 00:15
0.00 руб.
0 9 2
написать программу для поиска минимально и максимального элемента в массиве,с вводом и выводом массива на экран.При написании использовать команду Lea тоесть адресацию массива.Заранее очень благодарен!

Обсуждение

Неизвестный
05.09.2009, 11:40
общий
это ответ
Здравствуйте, Середа Олег Эдуардович.
Здравствуйте, Середа Олег Эдуардович.
Код программы в приложении, и, поскольку, кодировка нужна DOS-овская, еще прикреплен в архиве 7z
Есть кое-какие комментарии
Нужно получить исполняемый файл формата СОМ
Размер массива определяется "автоматически", так что просто добавляйте или удаляйте элементы


Пример окна вывода программы:
Код:
Исходный массив:
12 23 -3 4 0 7
Минимальный элемент массива: -3
Максимальный элемент массива: 23

Press any key ...


Приложение:
.model tiny; нужно будет получить исполняемый файл формата СОМ
.code
org 100h
start:
mov ax, 3
int 10h ; устанавливаем текстовый режим

lea dx, srcArray
mov ah, 9
int 21h

cld ; буду использовать строковые инструкции
; установим флаг направления
mov cx, arsize
lea si, ar
@@_next:
lodsw
CALL writeWordDEC_signed
mov al, ' '
int 29h
int 29h
LOOP @@_next
; определение минимального и максимального
lea si, ar
lodsw
mov min_el, ax
mov max_el, ax

mov cx, arsize
@@_analize_next:
lodsw
cmp ax, min_el
jge @@10
mov min_el, ax
@@10:
cmp ax, max_el
jle @@20
mov max_el, ax
@@20:
LOOP @@_analize_next

lea dx, minElem
mov ah, 9
int 21h
mov ax, min_el
CALL writeWordDEC_signed

lea dx, maxElem
mov ah, 9
int 21h
mov ax, max_el
CALL writeWordDEC_signed

lea dx, PressKey
mov ah,9
int 21h

xor ax, ax
int 16h

int 20h

; две подпрограммы для вывода чисел на экран
writeWordDEC proc near
; вывод на экран слова в AX, воспринимается как беззнаковое
push ax
push bx
push dx
push cx
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
pop cx
pop dx
pop bx
pop ax
ret
writeWordDEC endp

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

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

srcArray db 'Исходный массив:',13,10,'$'
maxElem db 13,10,'Максимальный элемент массива: $'
minElem db 13,10,'Минимальный элемент массива: $'
ar dw 12, 23, -3, 4, 0, 7 ; сюда просто добавляйте числа, если хотите
arsize equ ($ - ar)/2 ; так определяется констата = размер массива в словах (число элементов)
; $ - операция вычисления текущего адреса
min_el dw ?
max_el dw ?
end start
Неизвестный
05.09.2009, 11:40
общий
это ответ
Здравствуйте, Середа Олег Эдуардович.
Здравствуйте, Середа Олег Эдуардович.
Код программы в приложении, и, поскольку, кодировка нужна DOS-овская, еще прикреплен в архиве 7z
Есть кое-какие комментарии
Нужно получить исполняемый файл формата СОМ
Размер массива определяется "автоматически", так что просто добавляйте или удаляйте элементы


Пример окна вывода программы:
Код:
Исходный массив:
12 23 -3 4 0 7
Минимальный элемент массива: -3
Максимальный элемент массива: 23

Press any key ...


Приложение:
.model tiny; нужно будет получить исполняемый файл формата СОМ
.code
org 100h
start:
mov ax, 3
int 10h ; устанавливаем текстовый режим

lea dx, srcArray
mov ah, 9
int 21h

cld ; буду использовать строковые инструкции
; установим флаг направления
mov cx, arsize
lea si, ar
@@_next:
lodsw
CALL writeWordDEC_signed
mov al, ' '
int 29h
int 29h
LOOP @@_next
; определение минимального и максимального
lea si, ar
lodsw
mov min_el, ax
mov max_el, ax

mov cx, arsize
@@_analize_next:
lodsw
cmp ax, min_el
jge @@10
mov min_el, ax
@@10:
cmp ax, max_el
jle @@20
mov max_el, ax
@@20:
LOOP @@_analize_next

lea dx, minElem
mov ah, 9
int 21h
mov ax, min_el
CALL writeWordDEC_signed

lea dx, maxElem
mov ah, 9
int 21h
mov ax, max_el
CALL writeWordDEC_signed

lea dx, PressKey
mov ah,9
int 21h

xor ax, ax
int 16h

int 20h

; две подпрограммы для вывода чисел на экран
writeWordDEC proc near
; вывод на экран слова в AX, воспринимается как беззнаковое
push ax
push bx
push dx
push cx
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
pop cx
pop dx
pop bx
pop ax
ret
writeWordDEC endp

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

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

srcArray db 'Исходный массив:',13,10,'$'
maxElem db 13,10,'Максимальный элемент массива: $'
minElem db 13,10,'Минимальный элемент массива: $'
ar dw 12, 23, -3, 4, 0, 7 ; сюда просто добавляйте числа, если хотите
arsize equ ($ - ar)/2 ; так определяется констата = размер массива в словах (число элементов)
; $ - операция вычисления текущего адреса
min_el dw ?
max_el dw ?
end start
Прикрепленные файлы:
Неизвестный
07.09.2009, 09:36
общий
спасибо огромное,но файлик по ссылке не загружается...если можно перезалейте пожалуйста!очень благодарен!!!!
Неизвестный
07.09.2009, 10:19
общий
Хорошо, но "здесь" его нет у меня - пришлю часов в 12-13
В чем проблема - не знаю
Неизвестный
07.09.2009, 15:20
общий
Вот тут возьмите исходник
давно
Посетитель
7438
7205
07.09.2009, 15:48
общий
Ссылка "Загрузить" уже работает... Исправлено администрацией.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
07.09.2009, 19:56
общий
спасибо большое!!помогите пожалуйста подкоректировать программу для вывода минимального значения !заранее благодарен!


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

Минимальный элемент:...

текст программы использует вашу процедуру вывода, Борис!

dseg segment "data"
PressKey db 13,10,10,'Press any key ...$'

srcArray db 'Исходный массив:',13,10,'$'
minElem db 13,10,'минимальный элемент : $'
ar dw 12, 23, -3, 4, 1, 7
arsize dw 6
max_el dw ?
dseg ends
sseg segment stack "stack"
db 256 dup(?)
sseg ends
cseg segment "code"
proc main near
assume cs:cseg,ds:dseg,ss:sseg
lea bx,ar
mov cx,arsize
lea si,min_el
call min_elem
mov ax,[si]
call WriteWordDEC_signed
mov ah, 4ch
int 21h
main endp

min_elem proc near
push ax di
mov ax,[bx]
mov di,0
c: cmp ax,[bx+di]
jle m3
mov ax,[bx+di]
m3: add di,2
loop c
mov [si],ax
pop di ax
ret
min_elem endp
writeWordDEC proc near
push ax
push bx
push dx
push cx
mov bx, 10
xor cx, cx
m1:
xor dx, dx
div bx
push dx
inc cx
or ax, ax
jnz m1
m2:
pop ax
add al, '0'
int 29h
LOOP m2
pop cx
pop dx
pop bx
pop ax
ret
writeWordDEC endp

WriteWordDEC_signed proc
or ax, ax
jns no_sign
push ax
mov al, '-'
int 29h
pop ax
neg ax
no_sign:
CALL writeWordDEC
ret
WriteWordDEC_signed endp



cseg ends
end main
Неизвестный
07.09.2009, 23:13
общий
Вот изменный текст, который работает:
Код:
; набором символов 
; ;@@@@
; отметил то, что существенно изменил

dseg segment "data"
PressKey db 13,10,10,'Press any key ...$'

srcArray db 'Исходный массив:',13,10,'$'
minElem db 13,10,'Минимальный элемент: $'
ar dw 12, 23, -113, 4, 1, 7
arsize equ ($ - ar)
min_el dw ?
max_el dw ?
dseg ends

sseg segment stack "stack"
db 256 dup(?)
sseg ends

cseg segment "code"

main proc near
assume cs:cseg,ds:dseg,ss:sseg
mov ax, dseg ;@@@@
mov ds, ax ;@@@@ установить сегмент DS

mov ax, 3 ;@@@@
int 10h ;@@@@ инициализировать графический режим

lea bx,ar
mov cx,arsize

lea si,min_el
call min_elem

lea dx, minElem ;@@@@
mov ah, 9 ;@@@@
int 21h ;@@@@ сообщение о ...

mov ax,[si]
call WriteWordDEC_signed

lea dx, PressKey ;@@@@
mov ah, 9 ;@@@@
int 21h ;@@@@
xor ax, ax ;@@@@ ждать нажатия клавиши
int 16h ;@@@@

mov ax, 4c00h ;@@@@ и код выхода 0 установить лучше
int 21h
main endp

min_elem proc near
push ax
mov ax,[bx]
mov di,0
c: cmp ax,[bx]
jle m3
mov ax,[bx]
m3: add bx,2
loop c
mov [si],ax
pop ax
ret
min_elem endp

writeWordDEC proc near
push ax
push bx
push dx
push cx
mov bx, 10
xor cx, cx
m1:
xor dx, dx
div bx
push dx
inc cx
or ax, ax
jnz m1
m2:
pop ax
add al, '0'
int 29h
LOOP m2
pop cx
pop dx
pop bx
pop ax
ret
writeWordDEC endp

WriteWordDEC_signed proc
or ax, ax
jns no_sign
push ax
mov al, '-'
int 29h
pop ax
neg ax
no_sign:
CALL writeWordDEC
ret
WriteWordDEC_signed endp

cseg ends
end main

и тут исходный кода программы.
Неизвестный
08.09.2009, 00:01
общий
спасибо огромное!!!!
Форма ответа