реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> вопрос по си, обратится по абсолютному адресу
paskal
сообщение Aug 15 2011, 16:53
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Использую турбо си под ДОС. Надо обратится к определенной ячейке памяти с заранее известным адресом (например прочитать значение вектора прерывания или переменной BIOS). Не нашел в Си хоть какого способа это сделать.
Что интересно, в Турбопаскале этот вопрос решался легко. Можно в лоб объявить переменную по нужному адресу через оператор ABSOLUTE. Можно добраться к абсолютному адресу через указатель, которому присвоить фиксированное значение через функцию Ptr. А в Си я не одного из этих способов не наблюдаю. Но хоть какой то способ должен быть?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 15 2011, 17:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(paskal @ Aug 15 2011, 20:53) *
А в Си я не одного из этих способов не наблюдаю.

Указатели есть и в "C".

value = *(type *)address;
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 15 2011, 17:08
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Код
int y = *(int*)0x8000;//Читаем по адресу 0x8000 непосредственно
или
Код
int* p = (int*)0x8000; // Определяем и инициализируем указатель.
int y = *p; //Читаем по адресу 0x8000 через указатель


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
paskal
сообщение Aug 15 2011, 17:21
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(demiurg_spb @ Aug 15 2011, 21:08) *
Код
int y = *(int*)0x8000;//Читаем по адресу 0x8000 непосредственно
или
Код
int* p = (int*)0x8000; // Определяем и инициализируем указатель.
int y = *p; //Читаем по адресу 0x8000 через указатель

Но мне нужен полный адрес [сегмент:смещение], а здесь только смещение.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 15 2011, 17:27
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Аааа... у вас int что 16-ти разрядный, как и вся ось?
Я так не отвечу с этим компилятором не работал, но вроде что-то far-ptr или huge-ptr можно глянуть.
Код
int far* p = 0x80001000;// указатель 32 разряда - покрывает линейно все 4GB.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 15 2011, 18:34
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (paskal @ Aug 15 2011, 19:21) *
Но мне нужен полный адрес [сегмент:смещение], а здесь только смещение.

Совершенно не приципиально. Указатели есть и far. Хотя можете использовать готовые макросы MK_FP и подобные. В документации абсолютно все есть.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 16 2011, 14:51
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



У ТурбоС есть модификаторы near, far и huge. Используются примерно так:
char near *ncp;
char far *fcp;
char huge *hcp;
Указатели far и huge - "длинные", 32-разрядные, а near короткий, только 16 бит смещение от DS.
Вся необходимая информация по ним есть прямо во встроенной справке.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016