zloi7777
Постоялец
Offline
|
|
« : 21-04-2010 09:35 » |
|
Как в Си задать аналог ассемблернной строчки: ASM: call [pword _test] ... public _test _test label proc _test_off dd 0 ;32-bit offset _test_seg dw 0140h ;16-bit selector Си: ? Для 32-х битного адреса все просто ASM: call [dword _test] ... public _test _test label proc _test_off dd 0 ;32-bit offset Си: extern "C" void (*test)(void); ... test(); Но как сишному компилятору сказать что функция test имеет 48-ми битный адрес???
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #1 : 21-04-2010 10:41 » |
|
Какой компилятор, какая целевая процессорная платформа?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #2 : 21-04-2010 11:31 » |
|
Borland (CodeGear) bcc32
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #3 : 22-04-2010 03:03 » |
|
1. какая-то неувязочка Borland (CodeGear) bcc32
и Но как сишному компилятору сказать что функция test имеет 48-ми битный адрес???
2. как данные public _test _test label proc _test_off dd 0 ;32-bit offset _test_seg dw 0140h ;16-bit selector связаны с вызовом call [dword _test] или call [pword _test] 3. и моё самое любимое:) Зачем? Что ты с этого получишь и зачем пытаться перехитрить компилятор? PS: не долгое гугление привело нас сюда http://www.codenet.ru/progr/cpp/4/r77_1.phpвсё подробно расписано (поищи в тексте фразу "Объявление ближних или дальних функций ") да и вообще всё это для старого доброго доса и реального режима, как это связано с защищённым режимом не понятно
|
|
« Последнее редактирование: 22-04-2010 03:56 от Алексей1153++ »
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 22-04-2010 03:57 » |
|
LogRus, с форматированием был косячок - я поправил
|
|
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #5 : 22-04-2010 04:48 » |
|
3. и моё самое любимое:) Зачем? Что ты с этого получишь и зачем пытаться перехитрить компилятор? PS: не долгое гугление привело нас сюда http://www.codenet.ru/progr/cpp/4/r77_1.phpвсё подробно расписано (поищи в тексте фразу "Объявление ближних или дальних функций ") да и вообще всё это для старого доброго доса и реального режима, как это связано с защищённым режимом не понятно Я как раз и использую защищенный режим, и 48-ми битная адресация функции нужна для межсигментного вызова в защищенном режиме. 2. как данные Цитата: zloi7777 от Вчера в 08:35 Код: (asm) public _test _test label proc _test_off dd 0 ;32-bit offset _test_seg dw 0140h ;16-bit selector связаны с вызовом call [dword _test] или call [pword _test] В данных описан адрес функции. 1. какая-то неувязочка в чем? компилятор Borland Builder C++.
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #6 : 22-04-2010 06:23 » |
|
А где про такое написано? Можно ссылку (или название книги)?
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #7 : 22-04-2010 06:37 » |
|
я про программировании защищенного режима 0, так что пара вопросов В данных описан адрес функции.
т.е. функция на этапе кодирования знает свой адрес? не всё ли ей равно, как её вызывают (говорим про stdcall, не fastcall), дёрнул ret и был таков? Алексей1153++, спасибо.
|
|
|
Записан
|
Странно всё это....
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #8 : 22-04-2010 06:52 » |
|
т.е. функция на этапе кодирования знает свой адрес? не всё ли ей равно, как её вызывают (говорим про stdcall, не fastcall), дёрнул ret и был таков? Это указатель на функцию. Я в первом посте про это написал.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #9 : 22-04-2010 07:10 » |
|
ах, вот оно что. так вот в C++ указатели всегда одного размера 32 бита (на x86), этого вполне достаточно для покрытия всего адресного пространства и дополнительных 16 бит тут не нужно.
|
|
|
Записан
|
Странно всё это....
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #10 : 22-04-2010 07:19 » |
|
ах, вот оно что. так вот в C++ указатели всегда одного размера 32 бита (на x86), этого вполне достаточно для покрытия всего адресного пространства и дополнительных 16 бит тут не нужно. Его достаточно для работы в пределах одного сегмента ( короткий переход ), для вызова функции из другого сегмента надо 48 бит: 32 (как при коротком переходе ) это смещение и 16 селектор сегмента.
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #11 : 22-04-2010 07:23 » |
|
Ну походу никак такое не сделаешь. Напиши inline функцию или максрос и всё
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #12 : 22-04-2010 07:29 » |
|
быыырррр
ладно вернём к главному вопросу, какая цель иметь длинные переходы, какую задачу ты решаешь?
|
|
|
Записан
|
Странно всё это....
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #13 : 22-04-2010 07:35 » |
|
Ну походу никак такое не сделаешь. Напиши inline функцию или максрос и всё енто понятно и написано , но выглядин не так красиво....
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #14 : 22-04-2010 07:36 » |
|
LogRus, он видимо хочет переключить задачу в защищенном режиме
zloi7777, нормально выглядит. Если пишешь такие вещи, то без ассемблера полюбому не обойтись.
|
|
« Последнее редактирование: 22-04-2010 07:37 от resource »
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #15 : 22-04-2010 07:44 » |
|
ладно вернём к главному вопросу, какая цель иметь длинные переходы, какую задачу ты решаешь? шлюз вызова, сегмент задачи ( прога под свою ос)
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #16 : 22-04-2010 07:51 » |
|
zloi7777, какой формат исполняемых файлов в "своей" ОС ?
|
|
« Последнее редактирование: 22-04-2010 07:54 от resource »
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #17 : 22-04-2010 07:59 » |
|
Если пишешь такие вещи, то без ассемблера полюбому не обойтись. ясен пень все написано и работает, осдалось оформить хедер файл для кончного пользования, которы будит писать свои проги на Си используя указатели на мои функции..., и тут встала затыка в указателях на 48бит. понятно что можно написать: #define test_cpp() asm { call [PWORD PTR test_asm] } с параметрами чуть страшнее. Или написать функция на ассемблере, но это лишнии операции и размер.
|
|
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #18 : 22-04-2010 08:00 » |
|
какой формат исполняемых файлов в "своей" ОС ? exe (PE)
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #19 : 22-04-2010 08:05 » |
|
Переключать задачи должна только ОС. Программам это не нужно (нельзя) делать. PE ? Что PE лодер написал? Уже целую ОС наверное сделал... ну что-то PE уж какой-то чисто виндовый формат.
|
|
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #20 : 22-04-2010 08:15 » |
|
Переключать задачи должна только ОС. Программам это не нужно (нельзя) делать. PE ? Что PE лодер написал? Уже целую ОС наверное сделал... ну что-то PE уж какой-то чисто виндовый формат. шлюзы вызова, вызова функций ядра из ring0. a PE,там с бесяток полей нужны, а дальше простое копирование. а bcc32 - компилятор тоже виндовый
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #21 : 22-04-2010 08:43 » |
|
Обрывками фраз разговаривать это как-то некрасиво, и что самое главное - не понятно. И оверквотинг всё таки нехорошее дело
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #22 : 22-04-2010 15:32 » |
|
Я как раз и использую защищенный режим, и 48-ми битная адресация функции нужна для межсигментного вызова в защищенном режиме.
Ты правильно сказал что для дальнего вызова требуется помимо смещения указать селектор нового сегмента. В твоих примерах на ассемблере я не увидел и намека на присутствие селекторов в вызовах подпрограмм. Если ты делаешь вид что разбираешься в данной теме и говоришь что реализовал основной функционал ядра, то должен знать что на данный момент нет актуальных компиляторов языка 'C' которые поддерживали бы создание программы для защищенного режима с использованием нескольких сегментов как кода так и данных. Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора. Это все о x86 архитектуре.
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #23 : 22-04-2010 15:33 » |
|
ИМХО, тему лучше перенести в "Ассемблер", здесь мало что к "С" относиться.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #24 : 23-04-2010 00:26 » |
|
Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора.
Serg79, надо уточнить однако... Он, компилятор, считает что для кода используется селектор cs, для данных ds, стека ss... Если человек создал код ОС создающий и управляющий процессами (!) - я вообще проблемы не вижу. Просто, примерно как в windows, использовать линейную модель при переводе процессора в защищенный режим: настроить GDT так, что все селекторы пусть ссылаются на один и тот же дескриптор и ВСЁ. Ещё вариант - межсегментный вызов это обращение к сервисной функции ОС ? Ну тогда вызов через обработчик прерывания ( 0x2E например)... Или "библиотека - заглушка" вызывающая прерывание... P.S.: zloi7777, интересно, подкачка страниц тоже реализована? А переключение задач?
|
|
« Последнее редактирование: 23-04-2010 01:11 от sss »
|
Записан
|
while (8==8)
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #25 : 23-04-2010 05:47 » |
|
Ещё вариант - межсегментный вызов это обращение к сервисной функции ОС ? Ну тогда вызов через обработчик прерывания ( 0x2E например)... Или "библиотека - заглушка" вызывающая прерывание... Я какраз и пытался обойтись без "библиотека - заглушка", но как видно несудьба... интересно, подкачка страниц тоже реализована? А переключение задач? подкачка страниц - нет (из флеш уж больно медленно это все делать ), переключение задач - да Ты правильно сказал что для дальнего вызова требуется помимо смещения указать селектор нового сегмента. В твоих примерах на ассемблере я не увидел и намека на присутствие селекторов в вызовах подпрограмм. в самом первом посте - _test_seg Если ты делаешь вид что разбираешься в данной теме и говоришь что реализовал основной функционал ядра, то должен знать что на данный момент нет актуальных компиляторов языка 'C' которые поддерживали бы создание программы для защищенного режима с использованием нескольких сегментов как кода так и данных. Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора. Это все о x86 архитектуре. Но вот пока несталкнулся с данной проблемой незнал я этого
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #26 : 23-04-2010 06:04 » |
|
zloi7777, так как с тем, что бы использовать линейную адресацию?
|
|
|
Записан
|
while (8==8)
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #27 : 23-04-2010 06:18 » |
|
zloi7777, так как с тем, что бы использовать линейную адресацию? как раз от нее и пытаюсь отойти, при линейной все просто и быстро, и проблем с сишными компилятовами нет, но защита при этом хромает.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #28 : 23-04-2010 06:20 » |
|
так и подумал...
|
|
|
Записан
|
while (8==8)
|
|
|
sss
Специалист
Offline
|
|
« Ответ #29 : 23-04-2010 06:33 » |
|
zloi7777, а если заглушка cpp файл, создаваемый разработчиками ОС, внедряемый в каждый проект? Не надо париться с загрузчиком exe... Я так понимаю, адреса функций железно задаются?
|
|
« Последнее редактирование: 23-04-2010 06:36 от sss »
|
Записан
|
while (8==8)
|
|
|
|