Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сравнить строки, помогите найти ошибку 
V
    Опции темы
Vovarza
Дата 18.5.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



есть 2 одинаковые строки:
            message db 'HI!$'    
    message2 db 'HI!$'

сравниваю строки следующим образом:
            cld
    mov cx,10
 l1:    mov si,offset message    
    mov di,offset message2
    repe cmpsb
    jnz m1
    lea dx,acc
    mov ah,09
    int 21h
        
 exit:    mov ah,8
    int 21h
    mov ah,4ch
    int 21h

m1:    lea dx,no_a
    mov ah,09
    int 21h
    jmp exit

запускаю программу и она выдает разные результаты..
то говорит, что строки равны, а после перезапуска уже выдает сообщение о несовпадении строк..
еще раз скомпиллировал и теперь она выдает только сообщение о несовпадении
вот, кстати, сообщения, которые используются в коде:
            acc db 'sovpali$'    
    no_a db 'ne sovpali$'
PM MAIL   Вверх
dumb
Дата 18.5.2009, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



регистр cx должен содержать кол-во шагов сравнения, т.е. в данном случае(cmpsB) - количество символов.
PM MAIL   Вверх
Mikl_
Дата 18.5.2009, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vovarza, при сравнении через repe compsb cx должен быть равен длине сравниваемых строк, то есть 4. Если строки одинаковы то при выходе из цикла cx равно 0, если не одинаковы то регистры di и si указывают на следующий символ за несовпавшим
Код
cld
    mov cx,4; длина строк
    mov si,offset message    
    mov di,offset message2
    repe cmpsb
    mov ah,9 ; общая часть для обоих сообщений
    jzcx a1; если cx равен нулю -- строки совпали сообщим об этом
    lea dx,no_a ; если cx не равен нулю -- строки не совпали сообщим об этом
    int 21h
    jmp a2; идем на выход из программы
a1: lea dx,acc
    int 21h
a2: mov ah,4ch ; в любом случае выходим из программы
    int 21h


Это сообщение отредактировал(а) Mikl_ - 18.5.2009, 05:33
PM MAIL   Вверх
Vovarza
Дата 18.5.2009, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо за советы, но компиллятор выдает ошибку "Illegal instruction" в этой строке: 
Код

jzcx a1; если cx равен нулю -- строки совпали сообщим об этом


Добавлено через 3 минуты и 53 секунды
Делаю следующим образом:
Код

cld
     mov cx,4; длина строк
     mov si,offset message    
     mov di,offset message2
     repe cmpsb
     mov ah,9 ; общая часть для обоих сообщений
     cmp cx,0
    jz a1; если cx равен нулю -- строки совпали сообщим об этом
     lea dx,no_a ; если cx не равен нулю -- строки не совпали сообщим об этом
     int 21h
     jmp a2; идем на выход из программы
a1:    lea dx,acc
     int 21h
a2:    mov ah,8
    int 21h
    mov ah,4ch ; в любом случае выходим из программы
     int 21h

но в итоге все равно программа выдает сообщение о несовпадении строк(

Добавлено через 10 минут и 17 секунд
прогнал в турбо дебагере и получается, что вывод сообщения происходит при cx=3
то есть первые символы не совпадают.. 
PM MAIL   Вверх
Mikl_
Дата 18.5.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vovarza, 
1) банальная опечатка команда jcxz a1  - заменяет cmp cx,0/jz a1
2) сравниваются две области памяти ds:si и es:di -- над командой cld поставь push ds/pop es smile 
полность рабочая программа
Код
.model small
.286
.data
message db 'Hi, packer!'
message2 db 'Hi, hacker!'
len = $-message2
acc  db 'строки совпадают$'
no_a db 'строки не совпадают$'

.code
start: mov ax,@data
    mov ds,ax
    mov es,ax    
    cld
    mov cx,len; длина строк
    mov si,offset message    
    mov di,offset message2
    repe cmpsb
    mov ah,9 ; общая часть для обоих сообщений
    jcxz a1; если cx равен нулю -- строки совпали сообщим об этом
    lea dx,no_a ; если cx не равен нулю -- строки не совпали сообщим об этом
    int 21h
    jmp a2; идем на выход из программы
a1: lea dx,acc
    int 21h
a2: mov ah,4ch ; в любом случае выходим из программы
    int 21h
end start


Это сообщение отредактировал(а) Mikl_ - 18.5.2009, 11:31
PM MAIL   Вверх
Vovarza
Дата 18.5.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо, Mikl_,  все работает!  smile 
а как работает 
Код

            push ds
    pop es

помещение в стек ds и извлечение es в данном примере?
PM MAIL   Вверх
Mikl_
Дата 18.5.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vovarza, сделать содержимое в es равным содержимому в ds
то же что и mov ax,ds/mov es,ax но короче
PM MAIL   Вверх
Vovarza
Дата 18.5.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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


 




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


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

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