| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > вставка на asm'e |
| Автор: cupper 24.4.2010, 11:56 | ||||||
| нужно сделать свой системный вызов, в качестве одного из параметров передается указатель на функцию вот код функции делающей системный вызов
при компиляции получаю
190 строчка это __asm__ __volatile__ ( тип read_proc_t определен так
Я не могу понять чего мне сообщает компилятор. Предполагаю что проблема как раз именно в этом параметре ибо остальные ничего особенного из себя не представляют. Возможно к проблеме имеет отношения ранее возникшая и скорее всего неправильно решенная проблема с объявлением этой функции в другом файле. Эта проблема описана тут http://forum.vingrad.ru/forum/topic-298481.html |
| Автор: MAKCim 24.4.2010, 13:48 |
| cupper, вы попробуйте постепенно уменьшать число параметров и одновременно смотреть, исчезает ли проблема |
| Автор: cupper 24.4.2010, 18:28 | ||
попробовал убрать передачу функции, результат тот же. Щас все параметры убрал оставил только вызов int 0x80 и загрузку результата в регистр eax. Осложняется все тем что до момента ошибки компиляция доходит минут за 25 :( |
| Автор: cupper 24.4.2010, 19:36 |
| судя по прошедвешу времени компиляции ошибка миновала, щас блин придеться всетаки поочереди все отключать параметры :( PS. балин :( я когда убирал передачу указателя на функцию забыл изменить порядок регистров, это имеет значение ? обязательно чтобы параметры передавались через регистры именно в таком порядке ebx, ecx, edx, esi, edi ? или регистры можно в любом порядке загружать ? |
| Автор: cupper 25.4.2010, 16:56 | ||
мое незнание как это сделать я как то ядро умею компилявить только глобально с помощью make |
| Автор: cupper 26.4.2010, 22:24 | ||||
| бейте меня ногами но предложенный способ мне не посилам. уже хренову кучу времени убил, а только проверил что без
вылазает ошибка, а если убрать все и оставить только вызов int 0x80 то ошибки нет. Два остальных праметра вообще ничем не примечательно, остаеться только что либо эти оба параметра плохие, либо каким то непонятным образом эти совсем обычный параметры ему ненравяться :(
чтобы это проверить у меня йудет еще блин несколько дней :( и даже найдя проблемный параметр... что я с ним буду делать не зная в чем проблема :( Прошу теоретической помощи... что не может быть передано через регистры и почему, может есть где подробная инфа по вставкам __asm__ а то я находил только отрывки и то описывающих только простейшие действия :( ничего применительно к моей проблеме не нашел |
| Автор: MAKCim 27.4.2010, 09:18 |
| уберите eax из clobbered-list'а |
| Автор: cupper 27.4.2010, 20:53 | ||
доктор, а как поможет ампутация руки при спиде ?) PS. ампутация не помогла, слава богу осталась правая Хорошо что мы не врачи )) |
| Автор: MAKCim 27.4.2010, 22:32 |
http://gcc.gnu.org/ml/gcc-help/2007-04/msg00200.html судя по всему clobbered ist вообще должен быть пуст в данном случае |
| Автор: cupper 28.4.2010, 17:29 | ||||||
в силу слабого знания инглиша я не понял чего там было в переписке сказанно. Я попробую и так сделать. Ме сказала что проблема так же может возникать при попытке положить в регистр 16ричного числа если переменная передаваемая в asm будет с меткой "r". Вопрос PS.
так сразу ошибка
судя по приведенной ссылке совсем не правильно понял что такое клобберед лист, там чета вообще непонятное происходит :( |
| Автор: MAKCim 28.4.2010, 22:45 |
| cupper, последнее : не нужно |
| Автор: cupper 29.4.2010, 19:12 | ||||
спасибо В итоге вот такой вариант скомпилировался
теперь надо еще проверить работает ли он. Еще щас попробую назад пернуть r вместо g и mowl. И кстати а чем данный варинт кода особенен что нужно без клобберед листа ? |
| Автор: MAKCim 29.4.2010, 23:02 | ||||
юзаются все регистры общего назначения за исключением ebp/esp компилятор не сможет их юзать для чего-то еще и вообще, лучше так
|