Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Asm для начинающих > Удаление элемента, массив |
Автор: droha 5.10.2010, 20:58 | ||
Помогите, плиз, с таким заданием: Найти минимальный нечетный элемент и удалить его из массива. Нужно сделать - передачей параметров через стек. Минимальный нечетный я нашел:
Помогите с удалением. P.S. Заранее огромнейшее спасибо!!! |
Автор: iff 9.10.2010, 18:38 | ||
Знаком ";!!!" я пометил те строки, которые я добавил, а знаком ";*" - те, которые изменил. Изменения косаются строк "sseg segment para stack" и "assume cs:cseg, ss:sseg, ds:dseg, es:dseg". В первой я добавил параметр para stack чтобы компилятор понимал, что это сегмент стека. Во второй я дописал es:dseg т.к. в моей подпрограмме используется регистр es. |
Автор: droha 10.10.2010, 12:17 |
Спасибо огромное!!! Но есть вопросик! 1. В первом массиве удаляется минимум, но следующее число дублируется 2 раза, как это исправить? 2. А во втором массиве происходит зацикливание? Заранее спасибо за ответ! |
Автор: iff 10.10.2010, 19:51 | ||
1. При отладке кода вам действительно может показаться что последнее число дублируется, но это не так. Что значит удалить элемент из массива? Итак, синим цветом и жирно я выделил сам массив (адрес - ds:0000), зеленым - его длину (адрес - ds:000E), а красным минимум, элемент со значением которого будет удален (адрес - ds:0010). Все остальное, черного цвета, - мусор. Исходный массив соответственно содержит 0004 0008 0045 0003 0001 0005 0058 Шаг 1. Пусть имеется вот такие данные (дамп после выполнения подпрограммы поиска минимума): ds:0000 0004 0008 0045 0003 ds:0008 0001 0005 0058 0007 ds:0010 0001 0019 0009 000D (Выполнение моей подпрограммы): Шаг 2. Найдем индекс элемента содержащего 1 инструкцией repne scasw. Шаг 3. Сместим (копируем инструкцией rep movsb) элементы, стоящее правее удаляемого, влево на слово. Получим: ds:0000 0004 0008 0045 0003 ds:0008 0005 0058 0058 0007 ds:0010 0001 0019 0009 000D Шаг 4. Уменьшим длину массива на 1 элемент. Т.е. уменьшем значение переменной nx (или ny) на 1. Получим: ds:0000 0004 0008 0045 0003 ds:0008 0005 0058 0058 0006 ds:0010 0001 0019 0009 000D Т.е. раньше мы имели массив 0004 0008 0045 0003 0001 0005 0058, а теперь он содержит 0004 0008 0045 0003 0005 0058. Для большей наглядности просмотрите этот анимированный рисунок: http://ipicture.ru/ 2. Моя подпрограмма в принцепе не может перейти в бесконечный цикл. Но из-за оштбки действительно, цикл смещения элементов массива повторяется слишком много раз. Для исправления ошибки добавь после 104 строки строку add cx, [bp+8]. Т.е. у вас должно получиться:
|
Автор: droha 10.10.2010, 20:30 |
Все, вроде разобрался! Огромнейшее спасибо за помощь!!!!! |