IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> задача на массивы, перестановка и подсчет сумм
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  0  +


Начали изучать assembler, и сразу посыпались задачи перед сессией!!! Уважаемые форумчане, может кто сможет помочь решить задачу, а то я не бельмеса не могу сообразить! Кстати посоветуйте пожалуйста толковый учебник по assemblery!!
Задачки следующие:

1) массив из задаваемого количества элементов, переставить положител. эл. массива в обратном порядке(по убыванию), не меняя положения остальных.

2) определить положение мах и мин эл. массива до и после перестановки эл., посчитать сумму положит. и удалить их.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






монтик, вот смотри, что мне пришло в голову по поводу первой задачи. Идея очень простая: проходишь по массиву 2 раза: первый раз - при встрече положительного значения заталкиваешь его в стек (отрицательные просто пропускаешь), а при втором проходе - при встрече положительного меняешь его на то, которое вытаскивается из стека. Поскольку запись/чтение стека производятся с одного конца, то получится, что после второго прохода положительные значения будут записаны в обратном порядке, а отрицательные - не изменятся вообще. Вот программа, подпрограмму вывода числа на печать writeDEC возьми здесь: Обработка символьной информации

MODEL small

stack 100
.286

DATASEG

mass dw 1, -2, 3, -4, -5, 6, 7, -8, 9, 10
massLen dw 10
sInitial db 13, 10, 'Initial array: $'
sAfter db 13, 10, 'After replace: $'

count_of_digits dw 5 ; это для writeDEC

CODESEG

writeDEC proc
; ... тут добавь реализацию
writeDEC endp

start:
mov ax,@DATA
mov ds, ax
mov es, ax

mov ah, 09h
mov dx, offset sInitial
int 21h
mov cx, massLen
mov di, offset mass
print_item:
mov ax, word ptr [di]
call writeDEC
add di, 2
loop print_item

; при dx = 0 записываем в стек, при dx = 1 восстанавливаем
mov dx, 0
mov cx, 2
cycle:
mov bx, cx

mov di, offset mass ; начало массива
mov cx, massLen
save_replace:
mov ax, word ptr [di]
cmp ax, 0
jl next
cmp dx, 0
jne to_restore
push ax
jmp next
to_restore:
pop ax
mov word ptr [di], ax
next:
add di, 2
loop save_replace

mov cx, bx
inc dx
loop cycle

mov ah, 09h
mov dx, offset sAfter
int 21h

mov cx, massLen
mov di, offset mass
print_item_2:
mov ax, word ptr [di]
call writeDEC
add di, 2
loop print_item_2

exit_prog:
mov ah, 4ch
int 21h
end start


Цитата
Кстати посоветуйте пожалуйста толковый учебник по assemblery!!
Классика - Питер Абель: Ассемблер и программирование для IBM PC, сам с него начинал когда-то...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  0  +


Хорошая идея!!! Спасибо volvo, разобрался более,менее в этой задаче. А по второй можешь что посоветовать?!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Ну, вторая связана с первой, насколько я вижу... Как найти мин/макс значение знаешь? Проход по массиву и поэлементное сравнение с содержимым двух ячеек памяти: min и max... Точно так же, как и на любом другом языке программирования.

Этот проход тебе придется сделать дважды: и до и после преобразований, произведенных в первой задаче. В том же цикле можно и считать сумму положительных элементов. А вот насчет удалить - я бы попробовал во время прохода по массиву (если текущий элемент - положительный, естественно) воспользоваться REP MOVSW для перемещения хвостовых элементов массива на один влево, одновременно уменьшая и massLen... таким образом у тебя после окончания прохода все положительные элементы будут затерты последующими отрицательными...

Попробуй начать реализацию второго задания самостоятельно, если что-то не получится - обращайся, подскажем smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  0  +


volvo, подскажи как найти мин и мах? и как оформить цикл прохода, а дальше я попробую сам додуматься! Спасибо за подсказку!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
как найти мин и мах?
Вот так:
; в сегменте данных:
min dw 32767
max dw -32768

; ...

mov di, offset mass
mov cx, massLen
find_max_min:
mov ax, word ptr [di]
cmp ax, min
jg check_max
mov min, ax
check_max:
cmp ax, max
jl do_next
mov max, ax
do_next:
add di, 2
loop find_max_min
Продолжай smile.gif

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  0  +


А что значит "воспользоваться REP MOVSW для перемещения хвостовых элементов массива на один влево, одновременно уменьшая и massLen... " ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Ты у Абеля прочитай, что делает префикс REP..., и что делает MOVS..., сам все поймешь... Я полностью программу за тебя делать не буду все равно, это не мне надо, это в первую очередь надо тебе... Не нравится REP MOVSW - делай по-другому, двумя явными вложенными циклами, от этого ничего не изменится, просто больше писать придется...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  0  +


Спасибо за совет! Буду разбирать учебник. Как сделаю напишу! good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.11.2019 2:43
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name