команда in/out

Тема в разделе "WASM.ELECTRONICS", создана пользователем ubil, 31 янв 2005.

  1. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Тут я столкнулся недавно с пародоксальной для меня вещью: Delphi может скомпилировать инструкцию типа



    asm out ax, $340; {дельфи я плохо знаю}

    а Visual studio аналогичную



    __asm out ax, $340; - не может...



    И тут у меня возникает вопрос... Как заставить?:)

    Расскажите, по возможности, плиз...
     
  2. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Тьфу... перепутал:) in вместо out:) Типа поздно уже:)

    Самое главное то, что 340>255.

    Мой вопрос касается именно этого...
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    ubil

    Ну в VC нужно писать 0x340, а делфи наверно жульничает и компилирует в 2 инструкции:



    mov dx,$340

    in ax,dx
     
  4. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    2Black_mirror:



    Поразительно... Компилируется... Спасибо!:)

    Я писал такие две инструкции, но не рядом:)



    Вот прямо сейчас наблюдал, как VC6 при такой компиляции (не рядом) повис...
     
  5. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Нет... Нифига не компилируется...

    В конслоьном приложении я поставил такую вот штуку:

    __asm

    {

    mov cx, 0x056F; //random :)

    mov dx, 0x340; //baseaddr

    out dx, сx;

    };

    VS сначала ругнулся "impropper operand type"

    И через секунды 2 повис безвозвратно...

    Скажите, это глюк, или так надо?:)



    2Black_mirror: ...А я и в самом начале писал 0x



    ...Все-равно чудеса выдает MSVS

    __asm in ax, 0x61 - компилируется

    __asm in ax, 0x610 - нет, impropper operand type

    __asm in ax, dl - нет, аналогично

    __asm

    {

    mov dl, 0x61

    in ax, dl

    } - нет, аналогично...

    Может, я что-то не так делаю... А то начинаю в VS разочаровываться...



    А вообще, для меня сейчас главное - научиться писать в порт 0x340 из VS под WIN98, каким-нибудь простым способом, желательно пока без привлечения драйверов. Я знаю, что это возможно, поскольку Дельфи это делает. Сам сегодня видел/делал!:)
     
  6. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    [deleted]
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754




    Ну дык нет если такой команды



    IN AL,imm8 - Input byte from imm8 I/O port address into AL.

    IN AX,imm8 - Input byte from imm8 I/O port address into AX.

    IN EAX,imm8 - Input byte from imm8 I/O port address into EAX.

    IN AL,DX - Input byte from I/O port in DX into AL.

    IN AX,DX - Input word from I/O port in DX into AX.

    IN EAX,DX - Input doubleword from I/O port in DX into EAX.
     
  8. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    S_T_A_S_

    Спасибо за конструктивный ответ! Ты мне все прояснил:) Все гениальное - просто & ассемблер рулит:)



    to_all: Но я еще вернусь, кто знает, что там эта CCD-камера мне завтра преподнесет;)
     
  9. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    У меня возник новый вопрос, который не касается темы 1-го сообщения...

    Кто-нибудь здесь сталкивался с программированием CCD камер (enhanced Mk2 command set)? Или, хотябы, мне бы хотелось узнать, где можно почитать какие-нибудь ФАКью по этой теме. А то как-то себя странно она ведет, то данные не посылает, то шаттером щелкать не хочет... И в мануале не все четко освещено...



    Можете посоветовать, каким образом стоит действовать, чтобы быстро понять, как работает новое устройство?(При наличии мануала, ессно). Мне вначале показалось привлекательным тестить камеру, как это делали до меня, помощью программы на Дельфи под 98 винду. Теперь я Дельфи ненавижу...:) Visual Studio оказалась тоже не лучше: она вообще иногда просто виснет, когда долго курсор держишь в ассемблерном коде:) Естественно, в этих программах не шла речь об обработке прерываний... Они просто писали и читали порты. Теперь я хочу написать прогу на ассемблере под ДОС с обработкой прерываний. Посмотрим, что из этого выйдет...



    А как бы Вы на моем месте стали "познавать" этот мазафакин дивайс??)
     
  10. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Ну, ладно...

    Хотябы нормальный MASM под ДОС, 16-битный посоветуйте, плиз.

    А то я какой-то скачал, а он не хочет .data, .code, .model tiny понимать... Можно, конечно эти сегменты самому создавать, но вот как присвоить sp при компиляции я не помню...

    А старая добрая ml, которой так лихо в Зубкове компилируется самая первая программа выдает instruction or register not accepted in current CPU mode и вообще не запускается под ДОС. Хотя я ее на сайте книги специально скачал. Куда мир катится...:)
     
  11. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    мало смысла задавать разные вопросы в одном топе - ты сам сужаешь круг тех, кто может ответить.



    под ДОС посмотри fasm - он компилирует всё что угодно и не требует линкер.

    лучше всего скачай версию для ДОС с оф.сайта - там должны быть примеры (синтаксис отличается от masm).
     
  12. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Вот теберь вопрос по теме:)

    В-общем, я после долгих часов сношения с этой камерой обнаружил, что если из С++ и ассемблера писать в нужный мне порт(в данном случае 0340h), то это не произведет вообще никаких последствий, а если из встроенного ассемблера Дельфи - то все работает как надо(включаются/выключаются вентиляторы, щелкает шаттер...).

    Я, конечно, понимаю, что это звучит абсурдно, я уже себя столько раз перепроверил, что, по-моему, дело не в какой-нибудь глупой ошибке...

    Ну, в конце-концов, команды

    mov dx, 0340h

    mov ax, 0A00h ; выключить вентиляторы

    out dx, ax

    Должны выключать вентиляторы, но не делают этого! Хотя, почти то же самое когда-то кто-то написал на Дельфи, и оно работает и по сей день...

    В чем же дело? Может, сигнала не хватает?:) Типа, подольше, желательно, чтобы команда аут работала?:) Все-таки, дивайс старенький, 97-года... А этот 340-вой порт на исашной плате. А Вот комп - современный, даже не знаю, скока он там...
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    >




    возможно в этом "почти" и разница. отдизасмь рабочий код из делфей и скопируй его в __asm { }
     
  14. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Похоже, хоть какое-то "почти" я уловил там стоит edx вместо dx:

    procedure OutPort8_9x(PortAdr: Word32; Val: Word8); stdcall;

    {...}

    procedure OutPort8_9x;

    asm

    MOV EDX, PortAdr

    MOV AL, Val

    OUT DX, AL

    end;



    Возникает вопрос: эта буковка e могла на что-то повлиять? (если учесть, что число 340h прекрасно укладывается в 16 бит)
     
  15. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    imho 'e' ни на что не влияет
     
  16. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Я, кажется, понимаю, почему не работает out. Судя по всему, в программе на Дельфи команды обращения к портам находятся в dll, которая загружается в область адресов, откуда эти команды доступны. Я уже не совсем помню этот механизм передач привилегий, но, по-моему, дело именно в этом...

    Теперь я Сишную прогу перепишу с использованием dll, а ассемблерную - попробую запустить в Чистом ДОСе(К сожалению, из-за наличия отсутствия на том компе FDD, в прошлый раз этого сделать не получилось:) )