![]() |
|
|
![]()
|
|
| pdiman58 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 1.10.2009 Репутация: нет Всего: нет |
Задание таково:
Найти минимальный элемент массива. Размерность выборки - 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 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: нет Всего: 146 |
|
|||
|
||||
| iff |
|
||||||
![]() Администратор ![]() ![]() Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 5 Всего: 16 |
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, опередил меня Это сообщение отредактировал(а) iff - 4.3.2010, 18:53 -------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
||||||
|
|||||||
| pdiman58 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 1.10.2009 Репутация: нет Всего: нет |
Ответьте еще пожалуйста на вышеподписанные вопросы.. Прост мы ассемблер практически не изучали, я знаю оттуда только mov, add, sub, mul, div, cmp, и переходы.. Это сообщение отредактировал(а) pdiman58 - 4.3.2010, 20:56 |
|||
|
||||
| iff |
|
|||
![]() Администратор ![]() ![]() Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 5 Всего: 16 |
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? -------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
|||
|
||||
| iff |
|
|||
![]() Администратор ![]() ![]() Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 5 Всего: 16 |
Если jge заменяется на jnl, то всё нормально.
А почему вы решили что идёт поиск максимального числа? Вы сказали, что в массиве находятся знаковые числа. Вот к примеру представте, что ячейка с адресом 200 содержит FF, а ячейка с адресом 201 содержит 01. Что по-вашему меньше? (а меньше FF, т.к. мы работаем со знаковыми числами) FF это -1 01 это +1 -------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
|||
|
||||
| pdiman58 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 1.10.2009 Репутация: нет Всего: нет |
1. а как можно простыми словами сказать первый пункт, просто не понимаю а зачем это нужно.. Добавлено через 4 минуты и 36 секунд
да заменяется jnl я ввел числа: 04 06 08 01 10 44 45 07 02 03 в результат он выдает число 45.. минимальный элемент массива.. пробовал калькулятором переводить получается что 45 и в десятичной и в шестнадцатиричной системе максимальное.. Это сообщение отредактировал(а) pdiman58 - 4.3.2010, 22:15 |
||||
|
|||||
| pdiman58 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 1.10.2009 Репутация: нет Всего: нет |
мне нужно обязательно с loop.. |
||||
|
|||||
| iff |
|
|||
![]() Администратор ![]() ![]() Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 5 Всего: 16 |
Ой, в первой строке ошибка!
Замените 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 секунд
-------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
|||
|
||||
| pdiman58 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 1.10.2009 Репутация: нет Всего: нет |
iff, спасибо за помощь и разъяснение..
я попробовал вот так сделать вроде бы тоже работает..
|
|||
|
||||
| iff |
|
|||
![]() Администратор ![]() ![]() Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 5 Всего: 16 |
Работать будет, но толко понять этот код будет сложнее (тому кто читает). Мой вариант понятнее будет.
Да и он поворяет классический алгоритм нахождения минимума:
-------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
|||
|
||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |