Инстркция repe scasb

Тема в разделе "WASM.ASSEMBLER", создана пользователем artkar, 1 июн 2010.

  1. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    Добрый день коллеги!
    Помогите плиз проблема:

    Инстркция
    Код (Text):
    1. std
    2. repe scasb
    ищем символ,
    По окончании сканирования в регистрах edi и есх на два байта дальше, то есть сканирование "пролетает на два байта дальше" в чём косяк? ведь должна сканироваться цепочка байтов, а такое ощущение что сканирование ведется Dword и причем проверяется младшая тетрада а не всё Dword??? Или я туплю
     
  2. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    Вы сканируете строку с конца (std)? Приведите весь код.
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    artkar
    Ищешь совпадение или различие?
    Допустим различие среди цепочки одинаковых символов (раз написано repe scasb) останов произойдет не на том символе где начинаются различия, а на следующем за ним
     
  4. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    Да да именно с конца, Я и привел весь код
    Во Во! именно останов происходит на следуещем плюс адин (байт)
     
  5. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    artkar,

    «Всё согласно уговору — и рисунок, и колёр».
    Переход к следующему байту/слову/etc. происходит независимо от результата сравнения. То же и для ecx. Там ведь псевдо-код приведён. «Любите книгу — источник знаний.»
     
  6. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    baldr
    Блин, ну я же повторяю что на ДВА переходит
    Т.е. допустим пример
    Цепочка:
    длапоыдлпыц*********
    сканирую байты(!!!) с конца, остановить когда байт <> *
    по идее должно остановиться на ц но останавливается на ы
     
  7. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    правильно он останавливается - показывает на символ, следующий (а если поиск с конца - на предыдущий) за символом, который удовлетворяет условию.
     
  8. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    «Не» удовлетворяет — там repe. :derisive:
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    artkar
    Посмотреть в манах на процессор.
     
  10. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    shoo
    То есть я всё таки туплю? Просто я думал по причине своего ламерства, чё то там указал не то или забыл чего-то (хотя всё вроде проверил) и проц рубит словами не взирая на инструкцию "байт", а Вы утверждаете что значит так и должно?
    Clerk
    а что это МАНАХ?
     
  11. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    artkar
    Это то, что написал мануэль :)
    после косметики -
    раз:
    Код (Text):
    1. SCAS/SCASB/SCASW/SCASD—Scan String
    2.  
    3. IF (Byte cmparison) THEN
    4.     temp <- AL - SRC;
    5.     SetStatusFlags(temp);
    6.     IF DF = 0
    7.         THEN (E)DI < (E)DI + 1;
    8.         ELSE (E)DI < (E)DI – 1;
    9.     FI;
    10. ELSE IF (Word comparison) THEN
    11.     temp <- AX - SRC;
    12.     SetStatusFlags(temp);
    13.     IF DF = 0
    14.         THEN (E)DI <- (E)DI + 2;
    15.         ELSE (E)DI <- (E)DI – 2;
    16.     FI;
    17. ELSE IF (Doubleword comparison)
    18. THEN
    19.     temp <- EAX – SRC;
    20.     SetStatusFlags(temp);
    21.     IF DF = 0
    22.         THEN (E)DI <- (E)DI + 4;
    23.         ELSE (E)DI <- (E)DI – 4;
    24.     FI;
    25. FI;FI;FI;
    два:
    Код (Text):
    1. REP/REPE/REPZ/REPNE/REPNZ—Repeat String Operation Prefix
    2.  
    3. IF AddressSize = 16 THEN
    4.     Use CX for CountReg;
    5. ELSE IF AddressSize = 64 and REX.W used THEN
    6.     Use RCX for CountReg;
    7. ELSE
    8.     Use ECX for CountReg;
    9. FI;FI;
    10. WHILE CountReg != 0
    11. DO
    12.     Service pending interrupts (if any);
    13.     Execute associated string instruction;
    14.     CountReg < (CountReg – 1);
    15.     IF CountReg = 0
    16.         THEN exit WHILE loop;
    17.     FI;
    18.     IF (Repeat prefix is REPZ or REPE) and (ZF = 0)
    19.             or (Repeat prefix is REPNZ or REPNE) and (ZF = 1)
    20.         THEN exit WHILE loop;
    21.     FI;
    22. OD;
    так что все одобрено священным синодом. Еще вопросы есть?
    Я потратил 6(шесть) минут.
    Большую часть на редактирование. :)
    Clerk
    Ох, как я иногда вас понимаю... :)
     
  12. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Ustus
    "Clerk
    Ох, как я иногда вас понимаю... :)"


    Очень сомнительно.
     
  13. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    deLight
    ???
     
  14. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    Mikl___
    baldr
    Ustus
    Спасибо тема закрыта