scasb и ему подобные
Знает ли кто такую фишку?
при выполнении сабжевой команды сначала что происходит? Сравнение содержимого al\ax\eax с
es:[di] или проверка cx на 0.
На РТФМ прошу не посылать. Там я такого нюанса нигде не нашёл.
Здраствуй All
Знает ли кто такую фишку?
при выполнении сабжевой команды сначала что происходит? Сравнение содержимого al\ax\eax с
es:[di] или проверка cx на 0.
На РТФМ прошу не посылать. Там я такого нюанса нигде не нашёл.
scasx ; x - разрядность операнда
работает следущим образом:
;-- устанавливаем флаги
cmp xAx,[ES:(E)DI] ; в зависимости от разрядности
;-- смотрим DF
* ; -0-> наращиваем XDI
* ; -1-> екебана
Условие выхода зависит от префикса повторения (если некий вообще имееться), который в свою очередь задаёться программистом.
repe/repz (0F3h) - Find non-xAx data starting at [ES:(E)DI]
repne/repnz (0F2h) - Find xAx data starting at [ES:(E)DI]
Скомбинировав <repxx> c <loop _some_label> можно лимитировать цыкл счётчиком.
;-- eg. ---------------------
pusha
mov CX,0Bh
mov AL,30h
mov EDI,_string
clc
_label0:
scasb
loopnz _label0
..
..
popa
retn
;-- EOF ---------------------
А ето алг.
IF (byte cmparison)
THEN
temp ← AL − SRC;
SetStatusFlags(temp);
THEN IF DF = 0
THEN (E)DI ← (E)DI + 1;
ELSE (E)DI ← (E)DI – 1;
FI;
ELSE IF (word comparison)
THEN
temp ← AX − SRC;
SetStatusFlags(temp)
THEN IF DF = 0
THEN (E)DI ← (E)DI + 2;
ELSE (E)DI ← (E)DI – 2;
FI;
ELSE (* doubleword comparison *)
temp ← EAX − SRC;
SetStatusFlags(temp)
THEN IF DF = 0
THEN (E)DI ← (E)DI + 4;
ELSE (E)DI ← (E)DI – 4;
FI;
FI;
FI;
Здраствуй All
Знает ли кто такую фишку?
при выполнении сабжевой команды сначала что происходит? Сравнение содержимого al\ax\eax с
es:[di] или проверка cx на 0.
На РТФМ прошу не посылать. Там я такого нюанса нигде не нашёл.
Проверки cx на ноль тут вообще не происходит :)
Проверки cx на ноль тут вообще не происходит :)
Да согласен я вопрос задал некорректно.
Я имел в виду repnz scasb.
Спасибо всем кто ответил. Я разобрался.
С виду мелочь, а полдня на её убил :(