Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2 3  Все   Вниз
  Печать  
Автор Тема: Дальний вызов( 48 бит ) в Си  (Прочитано 53842 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zloi7777
Постоялец

ru
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 21-04-2010 10:41 » 

Какой компилятор, какая целевая процессорная платформа?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zloi7777
Постоялец

ru
Offline Offline

« Ответ #2 : 21-04-2010 11:31 » 

Borland (CodeGear)
bcc32
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 22-04-2010 03:03 » 

1. какая-то неувязочка
Borland (CodeGear)
bcc32
и
Но как сишному компилятору сказать что функция test имеет 48-ми битный адрес???

2. как данные
Код: (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]

3. и моё самое любимое:)  Зачем? Что ты с этого получишь и зачем пытаться перехитрить компилятор?

PS: не долгое гугление привело нас сюда http://www.codenet.ru/progr/cpp/4/r77_1.php
всё подробно расписано (поищи в тексте фразу "Объявление ближних или дальних функций ")
да и вообще всё это для старого доброго доса и реального режима, как это связано с защищённым режимом не понятно
« Последнее редактирование: 22-04-2010 03:56 от Алексей1153++ » Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 22-04-2010 03:57 » 

LogRus, с форматированием был косячок - я поправил
Записан

zloi7777
Постоялец

ru
Offline 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
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 22-04-2010 06:23 » 

А где про такое написано? Можно ссылку (или название книги)?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 22-04-2010 06:37 » 

я про программировании защищенного режима 0, так что пара вопросов

В данных описан адрес функции.

т.е. функция на этапе кодирования знает свой адрес?
не всё ли ей равно, как её вызывают (говорим про stdcall, не fastcall), дёрнул ret и был таков?

Алексей1153++, спасибо. Улыбаюсь
Записан

Странно всё это....
zloi7777
Постоялец

ru
Offline Offline

« Ответ #8 : 22-04-2010 06:52 » 

Цитата
т.е. функция на этапе кодирования знает свой адрес?
не всё ли ей равно, как её вызывают (говорим про stdcall, не fastcall), дёрнул ret и был таков?

Это указатель на функцию. Я в первом посте про это написал.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #9 : 22-04-2010 07:10 » 

ах, вот оно что.
так вот в C++ указатели всегда одного размера 32 бита (на x86), этого вполне достаточно для покрытия всего адресного пространства и дополнительных 16 бит тут не нужно.
Записан

Странно всё это....
zloi7777
Постоялец

ru
Offline Offline

« Ответ #10 : 22-04-2010 07:19 » 

Цитата
ах, вот оно что.
так вот в C++ указатели всегда одного размера 32 бита (на x86), этого вполне достаточно для покрытия всего адресного пространства и дополнительных 16 бит тут не нужно.

Его достаточно для работы в пределах одного сегмента ( короткий переход ), для вызова функции из другого сегмента надо 48 бит: 32 (как при коротком переходе ) это смещение и 16 селектор сегмента.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 22-04-2010 07:23 » 

Ну походу никак такое не сделаешь. Напиши inline функцию или максрос и всё
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #12 : 22-04-2010 07:29 » 

быыырррр

ладно вернём к главному вопросу, какая цель иметь длинные переходы, какую задачу ты решаешь?
Записан

Странно всё это....
zloi7777
Постоялец

ru
Offline Offline

« Ответ #13 : 22-04-2010 07:35 » 

Цитата
Ну походу никак такое не сделаешь. Напиши inline функцию или максрос и всё

енто понятно и написано  Улыбаюсь, но выглядин не так красиво....
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 22-04-2010 07:36 » 

LogRus, он видимо хочет переключить задачу в защищенном режиме

zloi7777, нормально выглядит. Если пишешь такие вещи, то без ассемблера полюбому не обойтись.
« Последнее редактирование: 22-04-2010 07:37 от resource » Записан
zloi7777
Постоялец

ru
Offline Offline

« Ответ #15 : 22-04-2010 07:44 » 

Цитата
ладно вернём к главному вопросу, какая цель иметь длинные переходы, какую задачу ты решаешь?

шлюз вызова, сегмент задачи ( прога под свою ос)
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 22-04-2010 07:51 » 

zloi7777, какой формат исполняемых файлов в "своей" ОС ?
« Последнее редактирование: 22-04-2010 07:54 от resource » Записан
zloi7777
Постоялец

ru
Offline Offline

« Ответ #17 : 22-04-2010 07:59 » 

Цитата
Если пишешь такие вещи, то без ассемблера полюбому не обойтись.

ясен пень  Улыбаюсь
все написано и работает, осдалось оформить хедер файл для кончного пользования, которы будит писать свои проги на Си используя указатели на мои функции..., и тут встала затыка в указателях на 48бит. Жаль
понятно что можно написать:
Код:
#define test_cpp() asm { call [PWORD PTR test_asm] } 

с параметрами чуть страшнее.

Или написать функция на ассемблере, но это лишнии операции и размер.
 
Записан
zloi7777
Постоялец

ru
Offline Offline

« Ответ #18 : 22-04-2010 08:00 » 

Цитата
какой формат исполняемых файлов в "своей" ОС ?

exe (PE)
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 22-04-2010 08:05 » 

Переключать задачи должна только ОС. Программам это не нужно (нельзя) делать.
PE ? Что PE лодер написал? Уже целую ОС наверное сделал... ну что-то PE уж какой-то чисто виндовый формат.
Записан
zloi7777
Постоялец

ru
Offline Offline

« Ответ #20 : 22-04-2010 08:15 » 

Цитата
Переключать задачи должна только ОС. Программам это не нужно (нельзя) делать.
PE ? Что PE лодер написал? Уже целую ОС наверное сделал... ну что-то PE уж какой-то чисто виндовый формат.

шлюзы вызова, вызова функций ядра из ring0.
a PE,там с бесяток полей нужны, а дальше простое копирование.
а bcc32 - компилятор тоже виндовый
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 22-04-2010 08:43 » 

Обрывками фраз разговаривать это как-то некрасиво, и что самое главное - не понятно. И оверквотинг всё таки нехорошее дело
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 22-04-2010 15:32 » 

Я как раз и использую защищенный режим, и 48-ми битная адресация функции нужна для межсигментного вызова в защищенном режиме.
Ты правильно сказал что для дальнего вызова требуется помимо смещения указать селектор нового сегмента. В твоих примерах на ассемблере я не увидел и намека на присутствие селекторов в вызовах подпрограмм.

Если ты делаешь вид что разбираешься в данной теме и говоришь что реализовал основной функционал ядра, то должен знать что на данный момент нет актуальных компиляторов языка 'C' которые поддерживали бы создание программы для защищенного режима с использованием нескольких сегментов как кода так и данных. Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора. Это все о x86 архитектуре.
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 22-04-2010 15:33 » 

ИМХО, тему лучше перенести в "Ассемблер", здесь мало что к "С" относиться.
Записан
sss
Специалист

ru
Offline 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
Постоялец

ru
Offline Offline

« Ответ #25 : 23-04-2010 05:47 » 

Цитата
Ещё вариант -  межсегментный вызов это обращение к сервисной функции ОС ? Ну тогда вызов через обработчик прерывания ( 0x2E например)... Или "библиотека - заглушка" вызывающая прерывание...
Я какраз и пытался обойтись без "библиотека - заглушка", но как видно несудьба... Жаль
Цитата
интересно, подкачка страниц тоже реализована? А переключение задач?
подкачка страниц - нет (из флеш уж больно медленно это все делать Жаль ), переключение задач - да
Цитата
Ты правильно сказал что для дальнего вызова требуется помимо смещения указать селектор нового сегмента. В твоих примерах на ассемблере я не увидел и намека на присутствие селекторов в вызовах подпрограмм.
в самом первом посте - _test_seg
Цитата
Если ты делаешь вид что разбираешься в данной теме и говоришь что реализовал основной функционал ядра, то должен знать что на данный момент нет актуальных компиляторов языка 'C' которые поддерживали бы создание программы для защищенного режима с использованием нескольких сегментов как кода так и данных. Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора. Это все о x86 архитектуре.
Но вот пока несталкнулся с данной проблемой незнал я этого  Отлично Жаль
Записан
sss
Специалист

ru
Offline Offline

« Ответ #26 : 23-04-2010 06:04 » 

zloi7777, так как с тем, что бы использовать линейную адресацию?
Записан

while (8==8)
zloi7777
Постоялец

ru
Offline Offline

« Ответ #27 : 23-04-2010 06:18 » 

Цитата
zloi7777, так как с тем, что бы использовать линейную адресацию?
как раз от нее и пытаюсь отойти, при линейной все просто и быстро, и проблем с сишными компилятовами нет, но защита при этом хромает.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #28 : 23-04-2010 06:20 » 

так и подумал...
Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #29 : 23-04-2010 06:33 » 

zloi7777, а если заглушка cpp файл, создаваемый разработчиками ОС, внедряемый в каждый проект? Не надо париться с загрузчиком exe... Я так понимаю, адреса функций железно задаются?
« Последнее редактирование: 23-04-2010 06:36 от sss » Записан

while (8==8)
Страниц: [1] 2 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines