Здравствуйте уважаемые Программисты, знающие этот Великолепный язык - Ассемблер! Я начинающий программист в этой области У меня возникла проблема, обращаюсь к Вам за помощью как к Старшим товарищам Хочу написать на Ассемблере программу (в МАСМЕ) под Windows для чипсета ICH10. По документации Intel нащел смещение под PPO - Port Power Off, как я понял он отключает питание USB, так вот, не могу понять, какой адрес написать в программе? Вот сама программа: Code (Text): pushad mov eax, 80000064h <= какой адрес сюда вставить? mov dx, 0CF8h out dx, eax mov dx, 0CFCh <= какой порт написать здесь?Должен быть адрес порта данных, но какой? in eax, dx or eax, 0000h <= это значение по-умолчанию, чтобы отключить питание нужно 0001h? out dx, eax popad ret Как мне сделать чтобы она исполнялась под Windows? И какие адреса там поставить? Никак не могу найти...
Какой не напиши - работать под Windows не будет. Для таких вещей надо драйвер писать. 80000064h - это адрес (Busevice:Function) устройства на PCI, если у тебя размещение на шине другое - надо менять. 0CF8h, 0CFCh - это I/O порты для работы с PCI, не надо их менять.
Под Windows такое конечно не прокатит, но - пишите драйвер, или открывайте IO Map. Судя по документации. В адресном пространстве памяти PPO находится по смещению: 3524–3525h. Значение по умолчанию 0000h. Тип доступа R\W. Как видим - размер 2 байта. Чтоб туда, что либо записать, читаем доку по работе с PCI. на сколько помню там есть несколько методов доступа. один из них: Адрес памяти записывается в порт 0CFBh. Значение которое хочется прочитать или записать - читается или пишется в порт 0CFCh (вроде не напутал, если что - поправьте меня). Следовательно: Code (Text): mov ax, 3524h mov dx, 0CFBh out dx,ax ;устанавливаем адрес mov dx, 0CFCh in ax,dx ;читаем значение из контроллера inc ax out dx,ax ;пишем что в контроллер А что именно нужно писать - чтобы отключить ? Читаем доку ) Делаем выводы (ИМХО). Вы не читали документацию (наверно даже не скачали, а она тут) Но ничего, может быть потом почитаете.
Огромное спасибо за помощь! Я скачал документацию, и даже читал то, что Вы цитируете, но опыта к сожалению маловато... Я извиняюсь за свою некомпетентность в этом вопросе А есть ли какой нибудь совсем простой вариант-реализация работы с PCI под виндой, чтобы можно было наглядно показать запись? Заранее спасибо.
TermoSINteZ Может я чего не понимаю... Не поясните мне, причём здесь вообще работа с PCI, если согласно документации PPO никакого отношения к конфигурационному пространству PCI не имеет, а отмаплен в память? Смещение (но не только!) в конфигурационном пространстве записывается в порт 0CF8h. А вот читаются/пишутся данные из/в один из четырёх портов, начиная с 0CFCh, в зависимости от последних двух бит смещения. Код в #3 у Вас, разумеется, неверный, т.к. то, что размер данных — два байта, не означает, что в 0CF8h нужно писать двухбайтовый адрес. Не говоря уже о том, что помимо смещения в 0CF8h надо писать номер шины (для устройств чипсета (MCH и ICH) это DMI, т.е. логически нулевая шина PCI), устройства, функции и устанавливать бит разрешения транзакции.
Нет, Вы всё правильно понимаете, работа с PCI - это второй вопрос. TermoSINteZ - большое спасибо за аттач Дело в том, что мне нужно было остановить USB, т.е отключить его, а там я так понимаю с PCI всё завязано, но я так понял что windows мне это сделать не даст, а ещё один вопрос заключается в написании простейшего консольного приложения: берем два числа, одно складываем с другим и делаем вывод на экран, однако как я его не делаю, выходит ошибка ассемблирования, в МАСМЕ. Вот такая вот проблема. Может быть у Вас имеется возможность вкратце хотя бы написать такое консольное приложение для МАСМа, с остальными ассемблерами я ещё не научился работать? Спасибо за ответы
l_inc Да я немного ошибся, с тем что нужно читать\писать и другие адреса, естественно оно не будет писать сразу 2 байта. А про бит разрешения забыл, спасибо что напомнили. Но на счет промаплено в память - хз, не уверен ибо не проверял. /ADD maxwelldream На счет проблемы с масмом - создавайте отдельную тему в беггинерс разделе.
А вообще сделать исполнимую программу из этого: Code (Text): pushad mov eax, 80000064h mov dx, 0CF8h out dx, eax mov dx, 0CFCh in eax, dx or eax, 0000h out dx, eax popad ret Возможно? Меня препод уже достал, взял этот кусок кода из книги - BIOS дизассемблирование, и требует от меня его сделать исполнимым, чтобы просмотреть потом в олли, я вообще не понимаю чего он хочет Можно ли его сделать исполняемым?
maxwelldream Для реализации ОС в Процессоре предусмотрены механизмы защиты. Грубо говоря идет деление программ на 2 класса. 1. Пользовательские. 2. Системные. (драйвера, ядро , гипервизоры, код БИОСа) Так вот первые ограничены в возможностях. Одно из таких ограничений это доступ к портам в/в. При вызове out dx, eax, in eax,dx Произойдет исключение. Процессор прервет работу пользовательской программы и вызовит обработчик исключения. Этот обработчик находится в ядре ОС. Как быть? Ну тут масса варинтов. 1) Написать драйвер. 2) Использовать уже имеющийся драйвер(их много GiveIO.sys, port.sys, inpout32.dll и ид). Делается через вызов драйвера. 3) "Открыть порты". Получить разрешение на работу с портами в/В для пользовательского приложения. (Были такие программы) Вот посмотри. http://www.pcports.ru/Articles.php http://www.pcports.ru/articles/3.php