Тут я столкнулся недавно с пародоксальной для меня вещью: Delphi может скомпилировать инструкцию типа asm out ax, $340; {дельфи я плохо знаю} а Visual studio аналогичную __asm out ax, $340; - не может... И тут у меня возникает вопрос... Как заставить? Расскажите, по возможности, плиз...
Тьфу... перепутал in вместо out Типа поздно уже Самое главное то, что 340>255. Мой вопрос касается именно этого...
ubil Ну в VC нужно писать 0x340, а делфи наверно жульничает и компилирует в 2 инструкции: mov dx,$340 in ax,dx
2Black_mirror: Поразительно... Компилируется... Спасибо! Я писал такие две инструкции, но не рядом Вот прямо сейчас наблюдал, как VC6 при такой компиляции (не рядом) повис...
Нет... Нифига не компилируется... В конслоьном приложении я поставил такую вот штуку: __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, каким-нибудь простым способом, желательно пока без привлечения драйверов. Я знаю, что это возможно, поскольку Дельфи это делает. Сам сегодня видел/делал!
Ну дык нет если такой команды 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.
S_T_A_S_ Спасибо за конструктивный ответ! Ты мне все прояснил Все гениальное - просто & ассемблер рулит to_all: Но я еще вернусь, кто знает, что там эта CCD-камера мне завтра преподнесет
У меня возник новый вопрос, который не касается темы 1-го сообщения... Кто-нибудь здесь сталкивался с программированием CCD камер (enhanced Mk2 command set)? Или, хотябы, мне бы хотелось узнать, где можно почитать какие-нибудь ФАКью по этой теме. А то как-то себя странно она ведет, то данные не посылает, то шаттером щелкать не хочет... И в мануале не все четко освещено... Можете посоветовать, каким образом стоит действовать, чтобы быстро понять, как работает новое устройство?(При наличии мануала, ессно). Мне вначале показалось привлекательным тестить камеру, как это делали до меня, помощью программы на Дельфи под 98 винду. Теперь я Дельфи ненавижу... Visual Studio оказалась тоже не лучше: она вообще иногда просто виснет, когда долго курсор держишь в ассемблерном коде Естественно, в этих программах не шла речь об обработке прерываний... Они просто писали и читали порты. Теперь я хочу написать прогу на ассемблере под ДОС с обработкой прерываний. Посмотрим, что из этого выйдет... А как бы Вы на моем месте стали "познавать" этот мазафакин дивайс??)
Ну, ладно... Хотябы нормальный MASM под ДОС, 16-битный посоветуйте, плиз. А то я какой-то скачал, а он не хочет .data, .code, .model tiny понимать... Можно, конечно эти сегменты самому создавать, но вот как присвоить sp при компиляции я не помню... А старая добрая ml, которой так лихо в Зубкове компилируется самая первая программа выдает instruction or register not accepted in current CPU mode и вообще не запускается под ДОС. Хотя я ее на сайте книги специально скачал. Куда мир катится...
мало смысла задавать разные вопросы в одном топе - ты сам сужаешь круг тех, кто может ответить. под ДОС посмотри fasm - он компилирует всё что угодно и не требует линкер. лучше всего скачай версию для ДОС с оф.сайта - там должны быть примеры (синтаксис отличается от masm).
Вот теберь вопрос по теме В-общем, я после долгих часов сношения с этой камерой обнаружил, что если из С++ и ассемблера писать в нужный мне порт(в данном случае 0340h), то это не произведет вообще никаких последствий, а если из встроенного ассемблера Дельфи - то все работает как надо(включаются/выключаются вентиляторы, щелкает шаттер...). Я, конечно, понимаю, что это звучит абсурдно, я уже себя столько раз перепроверил, что, по-моему, дело не в какой-нибудь глупой ошибке... Ну, в конце-концов, команды mov dx, 0340h mov ax, 0A00h ; выключить вентиляторы out dx, ax Должны выключать вентиляторы, но не делают этого! Хотя, почти то же самое когда-то кто-то написал на Дельфи, и оно работает и по сей день... В чем же дело? Может, сигнала не хватает? Типа, подольше, желательно, чтобы команда аут работала? Все-таки, дивайс старенький, 97-года... А этот 340-вой порт на исашной плате. А Вот комп - современный, даже не знаю, скока он там...
Похоже, хоть какое-то "почти" я уловил там стоит 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 бит)
Я, кажется, понимаю, почему не работает out. Судя по всему, в программе на Дельфи команды обращения к портам находятся в dll, которая загружается в область адресов, откуда эти команды доступны. Я уже не совсем помню этот механизм передач привилегий, но, по-моему, дело именно в этом... Теперь я Сишную прогу перепишу с использованием dll, а ассемблерную - попробую запустить в Чистом ДОСе(К сожалению, из-за наличия отсутствия на том компе FDD, в прошлый раз этого сделать не получилось )