Начали изучать assembler, и сразу посыпались задачи перед сессией!!! Уважаемые форумчане, может кто сможет помочь решить задачу, а то я не бельмеса не могу сообразить! Кстати посоветуйте пожалуйста толковый учебник по assemblery!! Задачки следующие:
1) массив из задаваемого количества элементов, переставить положител. эл. массива в обратном порядке(по убыванию), не меняя положения остальных.
2) определить положение мах и мин эл. массива до и после перестановки эл., посчитать сумму положит. и удалить их.
volvo
7.12.2008 23:57
монтик, вот смотри, что мне пришло в голову по поводу первой задачи. Идея очень простая: проходишь по массиву 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!!
Хорошая идея!!! Спасибо volvo, разобрался более,менее в этой задаче. А по второй можешь что посоветовать?!
volvo
8.12.2008 20:10
Ну, вторая связана с первой, насколько я вижу... Как найти мин/макс значение знаешь? Проход по массиву и поэлементное сравнение с содержимым двух ячеек памяти: min и max... Точно так же, как и на любом другом языке программирования.
Этот проход тебе придется сделать дважды: и до и после преобразований, произведенных в первой задаче. В том же цикле можно и считать сумму положительных элементов. А вот насчет удалить - я бы попробовал во время прохода по массиву (если текущий элемент - положительный, естественно) воспользоваться REP MOVSW для перемещения хвостовых элементов массива на один влево, одновременно уменьшая и massLen... таким образом у тебя после окончания прохода все положительные элементы будут затерты последующими отрицательными...
Попробуй начать реализацию второго задания самостоятельно, если что-то не получится - обращайся, подскажем
монтик
8.12.2008 20:22
volvo, подскажи как найти мин и мах? и как оформить цикл прохода, а дальше я попробую сам додуматься! Спасибо за подсказку!!
volvo
8.12.2008 20:37
Цитата
как найти мин и мах?
Вот так:
; в сегменте данных: 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
Продолжай
монтик
8.12.2008 20:47
А что значит "воспользоваться REP MOVSW для перемещения хвостовых элементов массива на один влево, одновременно уменьшая и massLen... " ?
volvo
8.12.2008 21:06
Ты у Абеля прочитай, что делает префикс REP..., и что делает MOVS..., сам все поймешь... Я полностью программу за тебя делать не буду все равно, это не мне надо, это в первую очередь надо тебе... Не нравится REP MOVSW - делай по-другому, двумя явными вложенными циклами, от этого ничего не изменится, просто больше писать придется...
монтик
8.12.2008 21:12
Спасибо за совет! Буду разбирать учебник. Как сделаю напишу!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.