В-общем, я хочу потренероваться в написании драйвера для pci устройства, например, для звуковой карточки как у меня стоит (sb 128). И я столкнулся с такой проблемой, что не могу найти документацию по программированию ее на низком уровне... На сайте creative.com вроде не нашел... Может поскажете чего?
бери дрова от линукса. я сам так делал. а креативу.ком надо лопату в задницу потому что они мне как пользователю их железа не выслали документацию даже в электронном виде. а обязаны.
... А получить документацию в чистом виде никак нельзя? Без выковыривания ее из исходников дров для Линукса... Она же точно должна где-то быть... Это же, вроде, не "платная" информация вроде сосканенной the windows 2000 device driver book, которую нигде не найдешь... Насчет того, что не выслали... А я по-прежнему уже 2-ые сутки наивно жду что они пришлют
Если я не ошибаюсь, звуковуха о которой идёт речь называется Ensonic Soundscape (возможно 1373). Когда PCI чипы Ensonic только появились, по ним было много инфы (в основном рекламы, конечно) - может быть искать лучше с этой стороны. Вообще SB 128 - это фикция, нужно смотреть model number, инфу на чипе.. Вообще Narkomanius прав, зачастую единственная дока - сорцы линукса
Мне, вообще-то это надо чтобы потренероваться перед написанием драйвера для другого девайса, по которому все доки есть, только вот самого девайса под рукой нет... Ладно, если что - на Спикере потренеруюсь
Подскажите кто-нибудь, плиз, как в MS Visual Studio добавлять ассемблерные вставки. Странно, почему-то asm {...} и, например, asm push al не работают. Во втором случае компилятор не знает что такое push
Так Код (Text): __asm { push OFFSET _except_handler push DWORD PTR fs:[0] // address of next ERR structure mov fs:[0], esp // give FS:[0] the ERR address just made mov seh.SafeEip, OFFSET SafePlace mov seh.PrevEsp, esp mov seh.PrevEbp, ebp } или так Код (Text): __asm _emit 0xCC; или так Код (Text): __asm push eax;
А, да... Я загнул что-то И вправду не ассемблируется... Видно давно на ассемлере не программировал... Последний раз это было 0.5 года назад, и то под какие-то PIC и МК процессоры.
Тут я начал разбираться со встроенным ассемблером в visual studio и обнаружил некоторое неудобство: #include "stdafx.h" #include "iostream.h" int main(int argc, char* argv[]) { int *px, x =5; px=&x; printf("Hello World!\n"); __asm { push esi; push edi; push eax; mov esi, px; // Эта строка // mov eax, esi; push esi; pop eax; mov edi, eax; cld; lodsd; inc eax; stosd; pop eax; pop edi; pop esi; }; cout << x << "\n"; cin >> x; return 0; } Эта программа компилируется и работает. Но если в помеченной строке написать сразу mov offset x;, то программа компилироваться не будет. Разве что если х определить вне main... Кто-нибудь может мне объяснить, почему так?
Потому что x - локальная переменная и адрес ее выглядит так: ebp+x<sub>offset</sub>. А опкода mov esi,ebp+imm не существует
Код (Text): #include <iostream> using namespace std; int main() { int x = 5; printf("Hello World!\n"); __asm { lea eax,x inc dword ptr[eax] } cout << x << "\n"; }
ubil > Кстати, а что там значат seh.SafeEip & seh.PrevEsp? Члены структуры Код (Text): typedef struct _SEH { DWORD SafeEip; // The offset where it's safe to continue execution DWORD PrevEsp; // The previous value of esp DWORD PrevEbp; // The previous value of ebp } SEH; SEH seh;
Ну, спасибо всем кто ответил, все разрулили Такой "огромный" код у меня получился в процессе выяснения почему он не хотел компилироваться... Но, конечно, lea хорошая команда, надо ее добавить в свой командный запас