Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум программистов _ C и С++ FAQ _ Поговорим об адресации!

Автор: Yalud 25:01:2007, 08:14

Я попытался сообразить простенькую програмку, которая бы создавала символьную строку, и выводила адрес начала строки в физической памяти. Плод моего труда перед вашим опытным взором smile.gif

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

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

}

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

Автор: Kmet 25:01:2007, 08:39

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


HEX редактором обычно назвают приложение для просмотра и редактирования файла. В таком контексте использовал?!

Автор: European 25:01:2007, 08:48

Цитата(Yalud @ 25:01:2007, 10:14 )
В чем проблемма?
*

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

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

Я так понял, что речь об отладчике

Автор: Yalud 25:01:2007, 09:14

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

Что касается главы "Указатели" еще раз я перечитал ее кажется дня два назад, и еще раз прочитал после того и готов еще пять раз прочитать, но либо я там что-то не понимаю, либо там нет ответа на мой вопрос.
Понятное дело, что переменная str после инициализации является как раз указателем(несмотря на то что там нет знака *) следовательно в ней содержится именно адрес. Шина адреса моего проца имеет 32 бита или 4 байта, следовательно все указатели на адреса имеют размерность 4 байта. Переменная int имеет также 4 байта следовательно после команды a=(int)str; в переменной a окажется адрес строки в десятичном целочисленном виде. Что не верно в моих рассуждениях? Может просто продемонстрируете, как необходимо использовать указатель на символьную строку, чтобы на экран выводился реальный адрес.

Автор: European 25:01:2007, 09:29

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

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

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

Довольно смелое утверждение, в котором я очень сомневаюсь

Автор: Yalud 25:01:2007, 10:45

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

Автор: European 25:01:2007, 10:55

Цитата(Yalud @ 25:01:2007, 12:45 )
Если взять полученный адрес, передать его другому процессу, а затем в другом процессе попытаться отобразить строку по этому адресу - ничего не получится т.к у другого процесса начальный адрес другой.
*

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

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

Пишут, но только не в книгах по языку С++, так как язык не зависит от платформы. Возьми книги Рихтера или Петзольда и все станет намного понятнее

Автор: grigsoft 26:01:2007, 06:34

Лучше все же Рихтер: http://anatolix.naumen.ru/Books/Richter

Автор: Yalud 26:01:2007, 09:41

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


Занимательная книжечка. Как раз такой мне и не хватало. Спасибо за ссылку.

Автор: Igorg 4:03:2007, 20:08

Винда здесь при чем? В защищенном режиме процессор IA-32 (aka i386) работает с виртуальными адресами, которые преобразуются аппаратно в реальные по довольно сложной схеме (от виндовс требуется только правильная настройка регистров глобальных и локальных таблиц адресов, бла, бла, бла). Начал бы изучение языка Си с чего-нибудь попроще... С реального режима и мс-дос, что-ли...

Автор: -=ФИЛОСОФ=- 26:03:2007, 06:44

Вот как надо получатьб адрес переменной:
#include <iostream.h>
void main(void)
{

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

}

Автор: deadhash 9:02:2008, 08:23

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

Мне задали научный проект:"Нахождение нерабочих адресов в оперативной памяти с последующим выявлением самого чипа" это возможно вообще просьба прислать ответ.

Автор: European 9:02:2008, 17:48

Цитата(deadhash @ 9:02:2008, 10:23 )
Мне задали научный проект
*

Поздравляю! Тема закрыта.

Русская версия Invision Power Board (http://www.nulled.ws)
© Invision Power Services (http://www.nulled.ws)