![]() |
|
|
![]()
|
|
| Vovarza |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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$' |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 4 Всего: 158 |
регистр cx должен содержать кол-во шагов сравнения, т.е. в данном случае(cmpsB) - количество символов.
|
|||
|
||||
| Mikl_ |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
Vovarza, при сравнении через repe compsb cx должен быть равен длине сравниваемых строк, то есть 4. Если строки одинаковы то при выходе из цикла cx равно 0, если не одинаковы то регистры di и si указывают на следующий символ за несовпавшим
Это сообщение отредактировал(а) Mikl_ - 18.5.2009, 05:33 |
|||
|
||||
| Vovarza |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 3.5.2009 Репутация: нет Всего: нет |
спасибо за советы, но компиллятор выдает ошибку "Illegal instruction" в этой строке:
Добавлено через 3 минуты и 53 секунды Делаю следующим образом:
но в итоге все равно программа выдает сообщение о несовпадении строк( Добавлено через 10 минут и 17 секунд прогнал в турбо дебагере и получается, что вывод сообщения происходит при cx=3 то есть первые символы не совпадают.. |
||||
|
|||||
| Mikl_ |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 полность рабочая программа
Это сообщение отредактировал(а) Mikl_ - 18.5.2009, 11:31 |
|||
|
||||
| Vovarza |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 3.5.2009 Репутация: нет Всего: нет |
спасибо, Mikl_, все работает!
а как работает
помещение в стек ds и извлечение es в данном примере? |
|||
|
||||
| Mikl_ |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
Vovarza, сделать содержимое в es равным содержимому в ds
то же что и mov ax,ds/mov es,ax но короче |
|||
|
||||
| Vovarza |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 3.5.2009 Репутация: нет Всего: нет |
да, я в дебагере это проследил..
спасибо, Mikl, теперь все понятно! |
|||
|
||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |