команды ROL,ROR на современных процах

Тема в разделе "WASM.ASSEMBLER", создана пользователем yudinetz, 21 июн 2007.

  1. yudinetz

    yudinetz New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    1
    писал прогу, компилирую тасмом, но смотрю что-то не так работает. в турбо дебаггере потрассировал и оказалось что ROL работает точно также, как и SHL. прога использует 16-разрядные регистры, для дос, инструкции 8086 проца.
    ROL должен старший бит выдвигать, записывать его в флаг переноса и на место младшего бита, так ведь?
    а у меня почему-то просто выдвигается, и получается, что происходит умножение на 2. почему такое происходит?
    и есть ли какие-нибудь другие команды для выделения отдельных битов?
    помогите плиз, очень срочно, курсовик завтра надо сдавать а работает не правильно
     
  2. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Ну вот я очень сомневаюсь, что "современные процессоры" работают кривее современных программ. Потрассируй не в 16ти битном турбо дебаггере для доса.
    rcr,rcl,and,or,xor,shld,shrd.
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Возможно, дело в этом:
    Воспользуйся альтернативой:
    ROL(reg,val) = (reg << val) | (reg >> (regsize-val))
    ROR(reg,val) = (reg >> val) | (reg << (regsize-val))
     
  4. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    IceStudent
    Это ж только на скорость влияет, т.к. либо вращать 1 раз либо 17 для 16 /или 33 для 32х/ битного регистра - результат один будет.
     
  5. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Может clc надо вставить?!
     
  6. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    А на каком проце это происходит?
    Хорошо бы посмотреть и кусок кода.
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    yudinetz
    А может из-за того что роловская остаточная часть тебе не видима! Ведь в досе ты же не все 32 бита или 64 бита регистра видишь, а только 16. Хотя смотря какаой дебагер или ты чтото не то делаешь
     
  8. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Аффтар ты куда делся?
    Или это шутка такая неудачная? :/
    Показывай кусок кода и пиши что у тебя за процессор - только что проверил, всё работает как и должно.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    asmfan
    Я к тому, что если не работает нормально rol/ror, то вставить альтернативу можно.
     
  10. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Во!

    Нужно обменять младшее и старшее слово в регистре,
    на ум пришло только

    rol eax,16

    А специальной командочки для этого нет?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Вроде нет.. есть BSWAP, но она полностью меняет порядок байт в двойном слове
     
  12. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Обычно видимо так и делается (тут влево или вправо - дело вкуса ;) )
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ykidia
    Угу.. Компилятор от 8й студии, кстати, распознаёт x = x << 16 | x >> 16 как ror x, 16, а вот от 7.1 не хотит - ему по душе shr/shl/or.