Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Поговорим об адресации!
Форум программистов > Системное программирование > C, С++ и С Builder > C и С++ FAQ
Yalud
Я попытался сообразить простенькую програмку, которая бы создавала символьную строку, и выводила адрес начала строки в физической памяти. Плод моего труда перед вашим опытным взором smile.gif

#include <iostream.h>
void main(void)
{

char str[]="strokakakayato";
int a;
a=(int)str;
cout<<a;
return;

}

В итоге я получаю какое-то число 1245048 которое каким-то образом связано с адресом строки, но после перевода в 16-ричный вид и просматривание ячейки памяти с этим адресом через HEX-редактор, своей строки я там не обнаруживою. В чем проблемма? Известен ли вам какой-либо другой способ, позволяющий справиться с моей задачей?
Kmet
Цитата
В итоге я получаю какое-то число 1245048 которое каким-то образом связано с адресом строки, но после перевода в 16-ричный вид и просматривание ячейки памяти с этим адресом через HEX-редактор, своей строки я там не обнаруживою. В чем проблемма? Известен ли вам какой-либо другой способ, позволяющий справиться с моей задачей?


HEX редактором обычно назвают приложение для просмотра и редактирования файла. В таком контексте использовал?!
European
Цитата(Yalud @ 25:01:2007, 10:14 )
В чем проблемма?
*

Как бы это сказать, чтобы предупреждение не получить... В общем открой книжку на главе "Указатели", перечитай главу еще раз, и подумай над своим вопросом

Цитата(Kmet @ 25:01:2007, 10:39 )
EX редактором обычно назвают приложение для просмотра и редактирования файла. В таком контексте использовал?!
*

Я так понял, что речь об отладчике
Yalud
В моем Hex редакторе есть функция редактирование и просмотра диска, а также есть функция редактирования и просмотра RAM(это оперативная память). Естественно я пользуюсь просмотром RAM. Программу я запускаю в пошаговом режиме, и после команды инициализации пытаюсь найти ту область памяти в которую попадает строка. (С помощью поиска мне ее все же удаеться найти, но адрес ячейки никак логически не объясняется). Вот я и пытаюсь понять принцип формирования данного ареса. Под отладчиком я принципиально не хочу запускать, т.к. данная программа формирует в памяти некую виртуальную область, в которую загружает программу, там все адреса определяются смещением от какого-то начального адреса итд итп(не буду развивать эту тему т.к. сам не уверен в правоте утверждений). Я хочу понять принцип работы программы в реальных условиях.

Что касается главы "Указатели" еще раз я перечитал ее кажется дня два назад, и еще раз прочитал после того и готов еще пять раз прочитать, но либо я там что-то не понимаю, либо там нет ответа на мой вопрос.
Понятное дело, что переменная str после инициализации является как раз указателем(несмотря на то что там нет знака *) следовательно в ней содержится именно адрес. Шина адреса моего проца имеет 32 бита или 4 байта, следовательно все указатели на адреса имеют размерность 4 байта. Переменная int имеет также 4 байта следовательно после команды a=(int)str; в переменной a окажется адрес строки в десятичном целочисленном виде. Что не верно в моих рассуждениях? Может просто продемонстрируете, как необходимо использовать указатель на символьную строку, чтобы на экран выводился реальный адрес.
European
Цитата(Yalud @ 25:01:2007, 11:14 )
В моем Hex редакторе есть функция редактирование и просмотра диска, а также есть функция редактирования и просмотра RAM(это оперативная память). Естественно я пользуюсь просмотром RAM. Программу я запускаю в пошаговом режиме, и после команды инициализации пытаюсь найти ту область памяти в которую попадает строка. (С помощью поиска мне ее все же удаеться найти, но адрес ячейки никак логически не объясняется). Вот я и пытаюсь понять принцип формирования данного ареса. Под отладчиком я принципиально не хочу запускать, т.к. данная программа формирует в памяти некую виртуальную область, в которую загружает программу, там все адреса определяются смещением от какого-то начального адреса итд итп(не буду развивать эту тему т.к. сам не уверен в правоте утверждений). Я хочу понять принцип работы программы в реальных условиях.
*

Без комментариев... Запусти под отладчиком и посмотри!

Цитата(Yalud @ 25:01:2007, 11:14 )
Шина адреса моего проца имеет 32 бита или 4 байта,
*

Довольно смелое утверждение, в котором я очень сомневаюсь
Yalud
Попробовал проанализировать под отладчиком. Действительно все сходится: если просмотреть ячейку памяти вычесляемую программой, там находится искомая строка. Но это не есть физический адрес ячейки в памяти, к сожалению. Выходит, что все адреса в windows формируются как смещение от какого-то начального адреса, про который естественно не пишут в книгах. Если взять полученный адрес, передать его другому процессу, а затем в другом процессе попытаться отобразить строку по этому адресу - ничего не получится т.к у другого процесса начальный адрес другой. (Проверенно опытным путем). Наверное этот начальный адрес и называется дескриптором процесса (HANDLE) мож кто слышал. Всем спасибо. wink.gif
European
Цитата(Yalud @ 25:01:2007, 12:45 )
Если взять полученный адрес, передать его другому процессу, а затем в другом процессе попытаться отобразить строку по этому адресу - ничего не получится т.к у другого процесса начальный адрес другой.
*

Методом научного тыка определено то, что написано во всех книгах по программированию в Windows.

Цитата(Yalud @ 25:01:2007, 12:45 )
Выходит, что все адреса в windows формируются как смещение от какого-то начального адреса, про который естественно не пишут в книгах.
*

Пишут, но только не в книгах по языку С++, так как язык не зависит от платформы. Возьми книги Рихтера или Петзольда и все станет намного понятнее
grigsoft
Лучше все же Рихтер: ]]>http://anatolix.naumen.ru/Books/Richter]]>
Yalud
Цитата(grigsoft @ 26:01:2007, 11:34 ) *
Лучше все же Рихтер: ]]>http://anatolix.naumen.ru/Books/Richter]]>


Занимательная книжечка. Как раз такой мне и не хватало. Спасибо за ссылку.
Igorg
Винда здесь при чем? В защищенном режиме процессор IA-32 (aka i386) работает с виртуальными адресами, которые преобразуются аппаратно в реальные по довольно сложной схеме (от виндовс требуется только правильная настройка регистров глобальных и локальных таблиц адресов, бла, бла, бла). Начал бы изучение языка Си с чего-нибудь попроще... С реального режима и мс-дос, что-ли...
-=ФИЛОСОФ=-
Вот как надо получатьб адрес переменной:
#include <iostream.h>
void main(void)
{

char str[]="strokakakayato";
int a;
asm{
mov ax,offset str
lea a,ax
}
cout<<a;
return;

}
deadhash
Цитата(grigsoft @ 26:01:2007, 12:34 ) *
Лучше все же Рихтер: ]]>http://anatolix.naumen.ru/Books/Richter]]>

Мне задали научный проект:"Нахождение нерабочих адресов в оперативной памяти с последующим выявлением самого чипа" это возможно вообще просьба прислать ответ.
European
Цитата(deadhash @ 9:02:2008, 10:23 )
Мне задали научный проект
*

Поздравляю! Тема закрыта.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.