Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объясните пожалуйста с loop.. 
:(
    Опции темы
pdiman58
Дата 4.3.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.. 


объясните пожалуйста как это будет на ассемблере..
PM MAIL   Вверх
586
Дата 4.3.2010, 18:29 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: нет
Всего: 146



Код
        mov bx, 0200     ; указатель на нулевой элемент массива
        mov si, 0201      ; указатель на первый элемент массива 
        mov al, [bx] 

a15:
        cmp [si], al              ; происходит сравнение чисел
        jge a20                     ; прыжок, если byte ptr  [si] >= al
        mov bx, si
        mov al, [bx]

a20:
      inc si
      cmp si, 020A
      jb a15

; цикл завершен. по указателю bx можно получить доступ к элементу массива
; bx-0200  -- индекс в массиве
; byte ptr [bx]  -- доступ к элементу в массиве (а ещё, это значение осталось в регистре al)

PM   Вверх
iff
Дата 4.3.2010, 18:52 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 5
Всего: 16



1. Инструкция loop
инструкция loop работает так: уменьшает содержимое регистра cx на 1, и если cx не равен 0, то переходит на указанную в операнде метку, адрес перехода имеет тип short т.е. находится на расстоянии от -128 до +127 байт от текущего IP.
Пример:
Код

mov cx, 0ah       ;Поместить в cx 10
start:

;Расположенный здесь код исполнять 10 раз

loop start

Следите, за тем меняет ли тело цикла содержимое cx, если да, то сохраняйте его (cx) в стеке и извлекайте от тудого при помощи инструкции push cx (в начале тела цикла) и pop cx (в конце тела цикла).

2. Для "пробега" по массиву используйте индексную адресацию (что-то вроде mov byte ptr al, [di]) или индексную адресацию со смещением (что-то вроде mov byte ptr al, [di+200]). В конце тела цикла используйте инструкцию инкремента выбранного вами для индексной адресации регистра (inc di).

4. После инструкций
Код

mov al, [0200]
mov [0213], al
mov bl, [0213]

al будет равен bl

3. Ваша программа:
Код

        not     al                 ;mov al, 0ffh
        mov     di, 200
        mov     cx, 10
a10:    cmp     byte ptr al, [di]
        jge     a20
        mov     byte ptr al, [di]
a20:    inc     di
        loop    a10
;al - наименьший элемент



P.S. 586, опередил меня smile

Это сообщение отредактировал(а) iff - 4.3.2010, 18:53


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
pdiman58
Дата 4.3.2010, 20:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 1.10.2009

Репутация: нет
Всего: нет



Цитата

    not     al     \\а что вот это значит??            ;mov al, 0ffh \\ а вот получается одно и тоже что и перед этим?? 0ffh - это что за адрес??
        mov     di, 200
        mov     cx, 10
a10:    cmp     byte ptr al, [di]  \\ byte ptr - что это такое?? можно ли просто написать al?? 
        jge     a20  \\ jge почему то заменяется другим.. и получается что идет поиск максимального элемента..
        mov     byte ptr al, [di]
a20:    inc     di   \\ что такое inc??
        loop    a10  
;al - наименьший элемент

    
Ответьте еще пожалуйста на вышеподписанные вопросы..
Прост мы ассемблер практически не изучали, я знаю оттуда только mov, add, sub, mul, div, cmp, и переходы..

Это сообщение отредактировал(а) pdiman58 - 4.3.2010, 20:56
PM MAIL   Вверх
iff
Дата 4.3.2010, 21:30 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 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, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
iff
Дата 4.3.2010, 22:06 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 5
Всего: 16



Если jge заменяется на jnl, то всё нормально.
А почему вы решили что идёт поиск максимального числа?
Вы сказали, что в массиве находятся знаковые числа. Вот к примеру представте, что ячейка с адресом 200 содержит FF, а ячейка с адресом 201 содержит 01. Что по-вашему меньше? (а меньше FF, т.к. мы работаем со знаковыми числами)
FF это -1
01 это +1


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
pdiman58
Дата 4.3.2010, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 1.10.2009

Репутация: нет
Всего: нет



Цитата(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?


1. а как можно простыми словами сказать первый пункт, просто не понимаю а зачем это нужно..

Добавлено через 4 минуты и 36 секунд
Цитата(iff @ 4.3.2010,  22:06)
Если jge заменяется на jnl, то всё нормально.
А почему вы решили что идёт поиск максимального числа?
Вы сказали, что в массиве находятся знаковые числа. Вот к примеру представте, что ячейка с адресом 200 содержит FF, а ячейка с адресом 201 содержит 01. Что по-вашему меньше? (а меньше FF, т.к. мы работаем со знаковыми числами)
FF это -1
01 это +1

да заменяется jnl

я ввел числа:

04  06   08   01   10   44   45   07

02  03


в результат он выдает число 45.. минимальный элемент массива..
пробовал калькулятором переводить получается что 45 и в десятичной и в шестнадцатиричной системе максимальное..

Это сообщение отредактировал(а) pdiman58 - 4.3.2010, 22:15
PM MAIL   Вверх
pdiman58
Дата 5.3.2010, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 1.10.2009

Репутация: нет
Всего: нет



Цитата(586 @ 4.3.2010,  18:29)
Код
        mov bx, 0200     ; указатель на нулевой элемент массива
        mov si, 0201      ; указатель на первый элемент массива 
        mov al, [bx] 

a15:
        cmp [si], al              ; происходит сравнение чисел
        jge a20                     ; прыжок, если byte ptr  [si] >= al
        mov bx, si
        mov al, [bx]

a20:
      inc si
      cmp si, 020A
      jb a15

; цикл завершен. по указателю bx можно получить доступ к элементу массива
; bx-0200  -- индекс в массиве
; byte ptr [bx]  -- доступ к элементу в массиве (а ещё, это значение осталось в регистре al)

мне нужно обязательно с loop..
PM MAIL   Вверх
iff
Дата 5.3.2010, 13:03 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 5
Всего: 16



Ой, в первой строке ошибка! 
Замените not al на mov al, 7fh

В чем смысл этого действия: поместить в al максимальное значение, которое вообще может быть. при использовании not al, мы помещаем в al - ff. Но ведь ff это не 256 (как в беззнаковых данных), а -1. А максимальное знаковое число, которое умещается в 1 байт это +127.

Добавлено через 7 минут и 43 секунды
Ещё одна ошибка  smile 
В строке 4
a10:    cmp     byte ptr al, [di]
заменить на:
a10:    cmp     byte ptr [di], al

Добавлено через 8 минут и 55 секунд
Код

        mov     al, 7fh
        mov     di, 200
        mov     cx, 10
a10:    cmp     byte ptr [di], al
        jnl     a20
        mov     byte ptr al, [di]
a20:    inc     di
        loop    a10



--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
pdiman58
Дата 5.3.2010, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 1.10.2009

Репутация: нет
Всего: нет



iff, спасибо за помощь и разъяснение..

я попробовал вот так сделать вроде бы тоже работает..

Код
 
           mov al, 07Fh
           mov di, 200
           mov cx, 0Ah
15a:    cmp byte ptr al, [di]
           jle  20a
           mov byte ptr al, [di]
20a:    inc di
           loop 15a

PM MAIL   Вверх
iff
Дата 5.3.2010, 19:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 5
Всего: 16



Работать будет, но толко понять этот код будет сложнее (тому кто читает). Мой вариант понятнее будет.
Да и он поворяет классический алгоритм нахождения минимума:
Код

Алгоритм Поиск_минимального_среди_ элементов
{ универсальный алгоритм } 
        Начало 
                ввод ( N, A[ 1: N ] )
                Min := 1E38 
                { в качестве начального значения Min присваивается очень большое значение, в
                качестве начального значения Max - очень маленькое -1E38 для массива вещественного типа}
                цикл от I := 1 до N 
                        если A[ I ] < Min то
                                Min := A[ I ]
                        все 
                кц
                вывод (Min) 
        Конец



--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.