Добрый день коллеги! Помогите плиз проблема: Инстркция Код (Text): std repe scasb ищем символ, По окончании сканирования в регистрах edi и есх на два байта дальше, то есть сканирование "пролетает на два байта дальше" в чём косяк? ведь должна сканироваться цепочка байтов, а такое ощущение что сканирование ведется Dword и причем проверяется младшая тетрада а не всё Dword??? Или я туплю
artkar Ищешь совпадение или различие? Допустим различие среди цепочки одинаковых символов (раз написано repe scasb) останов произойдет не на том символе где начинаются различия, а на следующем за ним
Да да именно с конца, Я и привел весь код Во Во! именно останов происходит на следуещем плюс адин (байт)
artkar, «Всё согласно уговору — и рисунок, и колёр». Переход к следующему байту/слову/etc. происходит независимо от результата сравнения. То же и для ecx. Там ведь псевдо-код приведён. «Любите книгу — источник знаний.»
baldr Блин, ну я же повторяю что на ДВА переходит Т.е. допустим пример Цепочка: длапоыдлпыц********* сканирую байты(!!!) с конца, остановить когда байт <> * по идее должно остановиться на ц но останавливается на ы
правильно он останавливается - показывает на символ, следующий (а если поиск с конца - на предыдущий) за символом, который удовлетворяет условию.
shoo То есть я всё таки туплю? Просто я думал по причине своего ламерства, чё то там указал не то или забыл чего-то (хотя всё вроде проверил) и проц рубит словами не взирая на инструкцию "байт", а Вы утверждаете что значит так и должно? Clerk а что это МАНАХ?
artkar Это то, что написал мануэль после косметики - раз: Код (Text): SCAS/SCASB/SCASW/SCASD—Scan String IF (Byte cmparison) THEN temp <- AL - SRC; SetStatusFlags(temp); 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); IF DF = 0 THEN (E)DI <- (E)DI + 2; ELSE (E)DI <- (E)DI – 2; FI; ELSE IF (Doubleword comparison) THEN temp <- EAX – SRC; SetStatusFlags(temp); IF DF = 0 THEN (E)DI <- (E)DI + 4; ELSE (E)DI <- (E)DI – 4; FI; FI;FI;FI; два: Код (Text): REP/REPE/REPZ/REPNE/REPNZ—Repeat String Operation Prefix IF AddressSize = 16 THEN Use CX for CountReg; ELSE IF AddressSize = 64 and REX.W used THEN Use RCX for CountReg; ELSE Use ECX for CountReg; FI;FI; WHILE CountReg != 0 DO Service pending interrupts (if any); Execute associated string instruction; CountReg < (CountReg – 1); IF CountReg = 0 THEN exit WHILE loop; FI; IF (Repeat prefix is REPZ or REPE) and (ZF = 0) or (Repeat prefix is REPNZ or REPNE) and (ZF = 1) THEN exit WHILE loop; FI; OD; так что все одобрено священным синодом. Еще вопросы есть? Я потратил 6(шесть) минут. Большую часть на редактирование. Clerk Ох, как я иногда вас понимаю...