0 / 0 / 1
Регистрация: 01.08.2016
Сообщений: 11
|
||||||
1 | ||||||
Строка с максимальной суммой элементов в массиве17.12.2016, 18:17. Показов 1652. Ответов 14
Метки нет Все метки)
(
Здравствуйте, начала изучать ассемблер совсем недавно. И определенно в код закралась какая-то дурацкая ошибка.
Не могли бы вы подсказать, в чем дело?
0
|
|
17.12.2016, 18:17 | |
Ответы с готовыми решениями:
14
В двумерном N*K массиве целых чисел поменять строку с максимальной суммой элементов со строкой с минимальной суммой элементов. В двумерном массиве найти строку с максимальной суммой элементов Найти строку с максимальной суммой элементов в двумерном массиве Найти строку с максимальной суммой элементов в двумерном массиве |
Модератор
![]() |
|
17.12.2016, 19:20 | 2 |
Перед суммированием по строке не обнуляется текущая сумма (edx).
Строка 25 - комментарий правильный, но inc - всего лишь увеличение на 1. Нужно add. Добавлено через 1 минуту Не по теме: Немного растерялся. Назовите, пожалуйста компилятор и ОС. Подозреваю gas и Linux.
1
|
0 / 0 / 1
Регистрация: 01.08.2016
Сообщений: 11
|
|
17.12.2016, 19:25 [ТС] | 3 |
Синтаксис AT&T, да, действительно gas, Linux
0
|
Модератор
![]() |
|
17.12.2016, 19:31 | 4 |
Не по теме: Sorry, за стохастические перемещения. Но всё остальное - должно помочь.
0
|
0 / 0 / 1
Регистрация: 01.08.2016
Сообщений: 11
|
||||||
17.12.2016, 19:36 [ТС] | 5 | |||||
Но он ведь благодаря inc все равно проходит по каждому элементу массива...
Проблема еще была почему-то в размере массива. Написала константой и тогда проверка прошла. Я добавила обнуление текущей суммы, но теперь у меня конечный результат - это сумма последней строки. Хотя edx (текущая сумма) считается верно в каждой строке...
0
|
Модератор
![]() |
|||||||||||
17.12.2016, 20:05 | 6 | ||||||||||
addl array(,%ebx,4), %edx означает примерно addl array(%ebx*4), %edx . Я ошибался. Всё правильно с incl %ebx .Вы не туда отправляете в строке 24 У вас должно быть 2 цикла. Один по строкам, и вложенный по столбцам. Без проверки наберу, а вы проверьте
array_end: равно скорее всего 4+4*4=20 - т.е. смещению от начала сегмента до метки в байтах. А это будет длина строки printf_format и длина массива.Может быть хранить в стеке eax перед вызовом printf ? Добавлено через 4 минуты Адрес последнего элемента можно вычислить так (array_end-array)/4
1
|
0 / 0 / 1
Регистрация: 01.08.2016
Сообщений: 11
|
|||||||||||
17.12.2016, 20:26 [ТС] | 7 | ||||||||||
Это для отслеживания значения? Поясните, пожалуйста
0 23 7 2 Далее огромное количество нулей, потом выдает ошибку сегментирования, дамп памяти Длина массива вычисляется верно ![]() Весь код выглядит так:
0
|
Модератор
![]() |
|
17.12.2016, 20:35 | 8 |
После строки 24 нужно чистить стек? Или printf сама очищает?
0
|
0 / 0 / 1
Регистрация: 01.08.2016
Сообщений: 11
|
|||||||||||
17.12.2016, 20:47 [ТС] | 9 | ||||||||||
На сколько я знаю, функция не очищает стек от параметров. Поэтому в loop_end
0
|
Модератор
![]() |
|
17.12.2016, 20:56 | 10 |
Вот её бы в 25 строку.
0
|
0 / 0 / 1
Регистрация: 01.08.2016
Сообщений: 11
|
|
17.12.2016, 21:00 [ТС] | 11 |
Я уже добавляла, тот же результат, к сожалению.
0
|
Модератор
![]() |
|
17.12.2016, 21:34 | 12 |
Что-то не так с вычислением условия окончания цикла.
Хоть MinGW ставь для проверки... Сейчас попробую набрать под masm32 и проверить под отладчиком. Если что - должно перенестись и работать нормально. Добавлено через 1 минуту Набрал и увидел - после сравнения в строке 28 переход на цикл суммирования, а нужно на проверку ebx. Добавлено через 32 секунды Ну и после printf в 25 строке очистить стек. Добавлено через 1 минуту Я воспользовался отладчиком под Windows - OllyDbg. Под Linux тоже должны существовать отладчики.
1
|
0 / 0 / 1
Регистрация: 01.08.2016
Сообщений: 11
|
||||||
17.12.2016, 22:07 [ТС] | 13 | |||||
А почему нельзя просто условие поменять на ja?
0
|
Модератор
![]() |
||||||
17.12.2016, 22:14 | 14 | |||||
![]() Решение
В псевдокоде должно быть
Код
if edx>eax then eax:=edx; if ebx>=4 then break; Код
if edx>eax then begin eax:=edx; if ebx>=4 then break; end;
1
|
0 / 0 / 1
Регистрация: 01.08.2016
Сообщений: 11
|
||||||
17.12.2016, 22:38 [ТС] | 15 | |||||
![]() Решение
Огромнейшее вам спасибо за такое подробное объяснение! Все замечательно работает
![]() И конечный код:
0
|
17.12.2016, 22:38 | |
17.12.2016, 22:38 | |
Помогаю со студенческими работами здесь
15
Выполнить в двумерном массиве поиск столбца с максимальной суммой элементов
Определить в двумерном массиве строку с максимальной и столбец с минимальной суммой элементов
Изменить заданную прямоугольную матрицу так, чтобы на первом месте стояла строка с максимальной суммой элементов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |