.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 cmpsb - я не понимаю эту инструкцию
тут про команды cmpsb и repne
вот код
читаем:
читаем:
а если равны напишем yes
запускаем: пусто... почему??!
пограмма работает правильно только так:
но почему понять не могу
Прошу объяснить.
к нашим баранам, и так нужно сравнить побайтно две строки, читаем
вот код
Код:
читаем:
Цитата:
с префиксами REPNE и REPNZ команда используется для
поиска одинаковых элементов строк.
поиска одинаковых элементов строк.
ок
Код:
repnz cmpsb
читаем:
Цитата:
используются с командами CMPS и SCAS, обеспечивая повторение, пока
содержимое флажка ZF = 0
содержимое флажка 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
.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
Прошу объяснить.
префикс 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
jz Mx
у мну так работает .