2013-10-02 1 views
2

Мне нужно написать 0x000по адресу 0x8000000, возможно ли это в C?Как написать данные в конкретном адресе в C

+1

Этот адрес, вероятно, не будет действителен для записи. Возможно, вы сможете заставить его существовать, например, с помощью '' mmap' и 'MAP_FIXED' (http://pubs.opengroup.org/onlinepubs/7908799/xsh/mmap.html), если вы используете ОС POSIX , – BoBTFish

+3

@BoBTFish Может быть, он программирует для микроконтроллера. – RedX

+0

Для чего вам это нужно? И почему? И с чем? – zoska

ответ

11

Если вы работаете с аппаратным регистром в встроенной системе, то стандартный способ:

int volatile * const p_reg = (int *) 0x8000000; 
*p_reg = 0x1234; 

Вы можете иметь много проблем с оптимизацией компилятора, если опустить летучий

9

Вы можете, но у вас будет segfault 99.9999..9% времени, потому что у вашей программы не будет доступа по этому адресу памяти.

int *nb = (int *) 0x8000000; 
*nb = 0x000; 
+0

Это зависит также от сценария компоновщика (вы можете опустить некоторые банки RAM и использовать их вручную), хотя это не рекомендуется. – lucasg

0

Ну если это назначение новичка в классе ac, я подозреваю, что это турбо или борланд, где вы программируете в 16-битной среде с адресной схемой смещения сегмента. В этом случае используется int * far ptr, с далеким, являющимся типом указателя для доступа к адресу из вашего текущего сегмента. 0xb8000000 был начальным адресом видеопамяти текстового режима.

т.е.

int far * p = 0xB8000000; 
*p = 'A'; // This would actually print char 'A' on screen 
*(p+1) = <some number>; // this would determine the color of char A 

Обратите внимание, что это используется, чтобы быть 16-битное программирование. Таким образом, обычный int * будет 16 бит и, следовательно, не сможет получить доступ за пределы текущего сегмента памяти.

Мы использовали для реализации printf самостоятельно, напрямую записывая видеоматериалы. Это было задание класса в курсе программирования c более десяти лет назад. Возможно, это соответствует вашему сценарию.

This объяснение может быть полезным, а также

+0

Это не задание начинающего .. :) – vkulkarni

+0

Согласен, не очень «начинающий», заданный в начале курса программирования. Но это, безусловно, не требует реальной потребности даже в то время. Тем не менее, это помогает понять память, указатели и возможность самостоятельно писать функции. Следовательно, это скорее академическое использование. – fayyazkl

Смежные вопросы