| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Объясните пожалуйста с loop.. |
| Автор: pdiman58 4.3.2010, 14:58 |
| Задание таково: Найти минимальный элемент массива. Размерность выборки - 10 элементов. Формат исходных данных - целое со знаком, размерность байт. Делаем мы это в Turbo Debugger 2.0, 3.0 на процессоре CPU 80486 Я думаю что делать нужно так.. В нижнем в окне Дата-сегмент, вбиваем 10 чисел, с 200 по 209 ячейку памяти.. Затем в окне поле команд: mov al, [0200] \\ в al записывается число из 200 ячейки памяти mov [0213], al \\ это число записывается в 213 ячеку паямти mov bl, [0213] \\ bl присваивается занчение ячейки 213 a15: ... cmp al, bl \\ происходит сравнение чисел jl a20 \\сравнение меньше mov [0213], al \\если al меньше то записывается в 213 ячейку памяти mov bl, [0213] \\ новое значение присваивается bl a20: loop a15 \\ по циклу переходит наверх.. там где стоят три точки, я считаю должно быть описано: то что проход должен осуществляться 10 раз.. и как можно записать чтобы он повышался каждый раз на ячейку больше.. предполагая что перменной-счетчику нужно присвоить значение 200, и с каждым разом повышать на 1.. объясните пожалуйста как это будет на ассемблере.. |
| Автор: 586 4.3.2010, 18:29 | ||
|
| Автор: iff 4.3.2010, 18:52 | ||||||
| 1. Инструкция loop инструкция loop работает так: уменьшает содержимое регистра cx на 1, и если cx не равен 0, то переходит на указанную в операнде метку, адрес перехода имеет тип short т.е. находится на расстоянии от -128 до +127 байт от текущего IP. Пример:
Следите, за тем меняет ли тело цикла содержимое cx, если да, то сохраняйте его (cx) в стеке и извлекайте от тудого при помощи инструкции push cx (в начале тела цикла) и pop cx (в конце тела цикла). 2. Для "пробега" по массиву используйте индексную адресацию (что-то вроде mov byte ptr al, [di]) или индексную адресацию со смещением (что-то вроде mov byte ptr al, [di+200]). В конце тела цикла используйте инструкцию инкремента выбранного вами для индексной адресации регистра (inc di). 4. После инструкций
al будет равен bl 3. Ваша программа:
P.S. 586, опередил меня |
| Автор: pdiman58 4.3.2010, 20:45 | ||
Ответьте еще пожалуйста на вышеподписанные вопросы.. Прост мы ассемблер практически не изучали, я знаю оттуда только mov, add, sub, mul, div, cmp, и переходы.. |
| Автор: iff 4.3.2010, 21:30 |
| 1. not al - инверитрует все биты al. Поскольку изначально al содержит 00000000B, то после выполнения not al, будет содержать 11111111B, т.е. 0ffh. 0ffh- это не адрес, это значение, которое будет иметь регистр al 2. byte ptr указывает на то, что при работе с памятью нужно извлекать из неё один байт (а не слово или двойное слово). Здесь его убрать можно, но я не рекомендую. В некоторых ситуациях использование byte ptr уменьшает длину машинного кода, в который транслируется программа 3. Инструкция inc увеличивает содержимое операнда на 1. inc di => add di, 1. Однако add di, 1 выполняется процессором медленнее и транслируется в более объёмный машинный код, чем inc di. 4. чем заменяется jge? |
| Автор: iff 4.3.2010, 22:06 |
| Если jge заменяется на jnl, то всё нормально. А почему вы решили что идёт поиск максимального числа? Вы сказали, что в массиве находятся знаковые числа. Вот к примеру представте, что ячейка с адресом 200 содержит FF, а ячейка с адресом 201 содержит 01. Что по-вашему меньше? (а меньше FF, т.к. мы работаем со знаковыми числами) FF это -1 01 это +1 |
| Автор: pdiman58 4.3.2010, 22:12 | ||||
1. а как можно простыми словами сказать первый пункт, просто не понимаю а зачем это нужно.. Добавлено через 4 минуты и 36 секунд
да заменяется jnl я ввел числа: 04 06 08 01 10 44 45 07 02 03 в результат он выдает число 45.. минимальный элемент массива.. пробовал калькулятором переводить получается что 45 и в десятичной и в шестнадцатиричной системе максимальное.. |
| Автор: pdiman58 5.3.2010, 00:55 | ||||
мне нужно обязательно с loop.. |
| Автор: iff 5.3.2010, 13:03 | ||
| Ой, в первой строке ошибка! Замените not al на mov al, 7fh В чем смысл этого действия: поместить в al максимальное значение, которое вообще может быть. при использовании not al, мы помещаем в al - ff. Но ведь ff это не 256 (как в беззнаковых данных), а -1. А максимальное знаковое число, которое умещается в 1 байт это +127. Добавлено через 7 минут и 43 секунды Ещё одна ошибка В строке 4 a10: cmp byte ptr al, [di] заменить на: a10: cmp byte ptr [di], al Добавлено через 8 минут и 55 секунд
|
| Автор: pdiman58 5.3.2010, 13:58 | ||
| iff, спасибо за помощь и разъяснение.. я попробовал вот так сделать вроде бы тоже работает..
|
| Автор: iff 5.3.2010, 19:13 | ||
| Работать будет, но толко понять этот код будет сложнее (тому кто читает). Мой вариант понятнее будет. Да и он поворяет классический алгоритм нахождения минимума:
|