Консультация № 181570
23.12.2010, 10:50
60.95 руб.
0 3 1
Здравствуйте, уважаемые эксперты! Прошу помочь с решением несложной задачки: Найти максимальный элемент массива, среди кратных 3 и имеющих четные индексы( среда, ассемблер 16 битный под DOS , tasm и tlink , использовать модель памяти small). Думаю массива из 10 символов будет достаточно. Огромная просьба сделать коментарий к каждой строчке, т. к. в ассемблере я полный ноль. Задача должна быть составлена примерно так: ввод массива, поиск элементов с четными индексами и кратными 3, вывод подходящих в другой массив, далее в новом массиве поиск мах, печать исходного массива и мах.

Обсуждение

давно
Посетитель
7438
7205
23.12.2010, 17:27
общий
Здравствуйте.
А зачем новый массив. Вполне достаточно исходного...
Ищем максимальный среди удовлетворяющих условию, всего делов-то
Числа у нас беззнаковые, по формату - слова (два байта). Так?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
23.12.2010, 20:02
общий
Да, так
давно
Посетитель
7438
7205
23.12.2010, 23:30
общий
это ответ
Здравствуйте, Федоров Иван !
Программа ждет ровно 10 чисел. Причем можно вводить как в одной строке, так и в нескольких...
Затем выводит введенный массив. Пробегая по четным индексам, проверяет, делится ли нацело на 3.
Ну и ищет среди таких максимальное. Возможен вариант, когда таких чисел может не быть вообще.

[code h=200];Найти максимальный элемент массива, среди кратных 3 и имеющих четные индексы
;печать исходного массива и мах

N equ 10 ;размер массива

.model small
.code
start: ;точка входа
mov ax, @data ;загрузим сегментные регистры сегментом данных
mov ds, ax
mov es, ax

call GetArray ;вводим массив
call PrintArray ;выводим
call SearchMax ;ищем максимум среди кратных 3 и
; имеющих четные индексы (результат в ax)

push ax ;сохраним максимум
lea dx, sMax ;сообщение
mov ah, 9
int 21h
pop ax ;максимум
test ax, ax
jz notFound ;если 0, то максимум не нашли
call PrintNum ;выведем
jmp Exit
notFound:
lea dx, sNotFound ;увы, не было из чего искать
mov ah, 9 ; (например, не было делящихся на 3)
int 21h

Exit:
lea dx, sPress ;выведем приглашение нажать на любую клавишу
mov ah, 9
int 21h

mov ah, 0 ;ждем
int 16h

mov ax, 4c00h
int 21h ;выход в ДОС

GetArray proc ;вводим массив
mov bNum, 80 ;максимальный размер буфера для ввода строки
; (для функции 0ah)
lea dx, sEnter
mov ah, 9
int 21h ;приглашение на ввод элементов массива

lea di, Array ;адрес массива
;посчитаем адрес за массивом (для контроля конца)
mov ax, N ;число элементов
shl ax, 1 ;по 2 байта (слова)
add ax, di ;добавим адрес начала
mov pLast, ax ;сохраним
GA_ask:
lea dx, bNum
mov ah, 0ah
int 21h ;вводим строку

mov ah, 2
mov dl, 0ah
int 21h ;переход на новую строку

lea si, sBuf ;строка с числами, разделенная разделителями
GA_next:
cmp di, pLast ;массив заполнен?
je GA_ret

call stoi ;[si] -> ax
jcxz GA_ask ;дошли до конца строки - на запрос новой строки
stosw ;сохраняем
jmp GA_next ;на следующее число в строке
GA_ret:
ret
GetArray endp

;функция преобразовывает числовую строку в число
;преобразование заканчивается по любому разделителю или концу строки (0dh)
;признаком конца строки является cx = 0
stoi proc ;преобразование строки [si] в беззнаковое число AX
push dx
xor bx, bx ;здесь будем стоить число
xor cx, cx ;счетчик разрядов
stoi_next:
lodsb ;очередной символ
cmp al, 0dh ;конец стоки?
je stoi_eol
cmp al, '0'
jb stoi_sep ;любая нецифра - разделитель
cmp al, '9'
ja stoi_sep
push ax ;сохраним новый разряд
mov ax, 10
mul bx ;умножим старшие на 10
pop dx ;новый
and dx, 0fh ;'0'-'9' -> 0-9
add ax, dx ;добавляем новый разряд
mov bx, ax ;сохраняем
inc cx ;считаем
jmp stoi_next ;продолжаем
stoi_sep: ;встретили разделитель
jcxz stoi_next ;были только разделители - на продолжение
; иначе - конец числа и выходим
stoi_eol: ; если числа нет и встретили 0dh - конец строки
mov ax, bx ;число возвращаем в ax
dec si ;шаг назад, чтобы легче было проанализировать 0dh
pop dx
ret
stoi endp

SearchMax proc ;поиск максимума
mov bp, 3 ;будем делить на 3
xor bx, bx ;максимум
mov cx, N/2 ;будем идти только по четным, поэтому половина
xor si, si ;индекс элемента
ArrayLoop:
mov ax, Array[si] ;очередной элемент
mov di, ax ;сохраним
xor dx, dx ;подготавливаемся к делению
div bp ;dx:ax / 3
test dx, dx ;проверяем остаток от деления
jnz ArrayNext ;не 0 - не нацело - не наше число
cmp bx, di ;делится на 3 - сравниваем с максимальным
jae ArrayNext ;если максим больше - не рассматриваем
mov bx, di ;иначе - новое максимальное
ArrayNext:
add si, 4 ;идем только по четным, нечетные пропускаем
loop ArrayLoop
mov ax, bx ;найденный максимум
ret
SearchMax endp

PrintArray proc ;выводим массив
lea dx, sArray
mov ah, 9
int 21h ;выведем сообщение о массиве

lea si, Array ;адрес массива
mov cx, N ;число элементов
PrintNumLoop:
lodsw ;очередной элемент
call PrintNum ;выводим числовую строку с пробелом в конце
loop PrintNumLoop
ret
PrintArray endp

PrintNum proc ;вывод беззнакового числа из ax
push cx ;сохраним счетчик элементов массива
mov bx, 10 ;будем делить на 10
xor cx, cx ;счетчик цифр
DivLoop:
xor dx, dx ;готовимся к делению dx:ax / bx
div bx ;ax - частное, dx - остаток=очередной младшей цифре
push dx ;сохраним цифру в стеке
inc cx ;посчитаем
test ax, ax ;продолжим, пока не 0
jnz DivLoop
mov ah, 2 ;функция вывода
PrintLoop: ;будем выводить в обратном порядке, начиная со старшей шифры
pop dx ;восстановим очередной разряд
or dl, '0' ;превратим в символ
int 21h ;выведем
loop PrintLoop
mov dl, ' ' ;отделим пробелом
int 21h
pop cx ;восстановим счетчик элементов массива
ret
PrintNum endp

.data
sEnter db 'Enter array (10 numbers): $'
sArray db 'Array: $'
sMax db 0dh,0ah,'Max = $'
sPress db 0dh,0ah,'Press any key$'
sNotFound db 'not found$'

.data?
Array dw N dup (?) ;массив чисел
pLast dw ? ;переменная для контроля адреса элементов массива
;буфер для ввода числовой строки (для функции 0ah)
bNum db ? ;максимальный размер буфера
bCount db ? ;реальный размер строки
sBuf db 80 dup (?) ;сама строка

end start ;точка входа

[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа