Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

repne cmpsb - я не понимаю эту инструкцию

18K
24 ноября 2010 года
logree
102 / / 27.09.2008
к нашим баранам, и так нужно сравнить побайтно две строки, читаем тут про команды cmpsb и repne
вот код
Код:
.model small
.stack 10h

.data
str1        db 'qwerty'
str2        db 'qwerty'
len         = $ - str2
mess        db 'yes$'
.code

begin:
    mov     ax,@data
    mov     ds,ax
    mov     es,ax
   
    mov     cx,len
    mov     si,offset str1
    mov     di, offset str2
    repnz cmpsb
    jz      ext
   
    mov     ah,9
    mov     dx,offset mess
    int     21h    
   
ext:
    mov     ax,4c00h
    int     21h
   
end begin


читаем:
Цитата:
с префиксами REPNE и REPNZ команда используется для
поиска одинаковых элементов строк.


ок

 
Код:
repnz cmpsb

читаем:
Цитата:
используются с командами CMPS и SCAS, обеспечивая повторение, пока
содержимое флажка ZF = 0


т е если флаг был поднят значит строки не равны
ок

 
Код:
jz      ext

а если равны напишем yes
запускаем: пусто... почему??!
пограмма работает правильно только так:
Код:
.model small
.stack 10h

.data
str1        db 'qwerty'
str2        db 'qwerty'
len         = $ - str2
mess        db 'yes$'
.code

begin:
    mov     ax,@data
    mov     ds,ax
    mov     es,ax
   
    mov     cx,len
    mov     si,offset str1
    mov     di, offset str2
    repe cmpsb
    jne     ext
   
    mov     ah,9
    mov     dx,offset mess
    int     21h    
   
ext:
    mov     ax,4c00h
    int     21h
   
end begin
но почему понять не могу
Прошу объяснить.
8.2K
24 ноября 2010 года
bagie2
299 / / 26.10.2008
попытка объяснить

префикс REP:
while (e)cx > 0
{
...
}

префикс REPE(Z): ; цикл пока равно и (e)cx>0
while (e)cx > 0
{
... ; cmpsb
if ZF == 0 break ; если не равно
}

префикс REPNE(NZ): ; цикл пока не равно и (e)cx>0
while (e)cx > 0
{
... ; cmpsb
if ZF == 1 break ; если равно
}

cmpsb:
if byte ptr (e)si == byte ptr (e)di
ZF = 1
else
ZF = 0
(e)si += 1 ; не трогая флаги
(e)di += 1
252
24 ноября 2010 года
koderAlex
1.4K / / 07.09.2005
repz cmpsb
jz Mx
у мну так работает .
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог