Поговорим об адресации!

  • Автор темы Yalud
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Y

Yalud

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

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

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

}

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

Kmet

Java Team
25.05.2006
1 036
8
#2
В итоге я получаю какое-то число 1245048 которое каким-то образом связано с адресом строки, но после перевода в 16-ричный вид и просматривание ячейки памяти с этим адресом через HEX-редактор, своей строки я там не обнаруживою. В чем проблемма? Известен ли вам какой-либо другой способ, позволяющий справиться с моей задачей?
HEX редактором обычно назвают приложение для просмотра и редактирования файла. В таком контексте использовал?!
 
04.09.2006
2 566
3
#3
<!--QuoteBegin-Yalud+25:01:2007, 10:14 -->
<span class="vbquote">(Yalud @ 25:01:2007, 10:14 )</span><!--QuoteEBegin-->В чем проблемма?
[snapback]54028" rel="nofollow" target="_blank[/snapback]​
[/quote]
Как бы это сказать, чтобы предупреждение не получить... В общем открой книжку на главе "Указатели", перечитай главу еще раз, и подумай над своим вопросом

<!--QuoteBegin-Kmet+25:01:2007, 10:39 -->
<span class="vbquote">(Kmet @ 25:01:2007, 10:39 )</span><!--QuoteEBegin-->EX редактором обычно назвают приложение для просмотра и редактирования файла. В таком контексте использовал?!
[snapback]54036" rel="nofollow" target="_blank[/snapback]​
[/quote]
Я так понял, что речь об отладчике
 
Y

Yalud

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

Что касается главы "Указатели" еще раз я перечитал ее кажется дня два назад, и еще раз прочитал после того и готов еще пять раз прочитать, но либо я там что-то не понимаю, либо там нет ответа на мой вопрос.
Понятное дело, что переменная str после инициализации является как раз указателем(несмотря на то что там нет знака *) следовательно в ней содержится именно адрес. Шина адреса моего проца имеет 32 бита или 4 байта, следовательно все указатели на адреса имеют размерность 4 байта. Переменная int имеет также 4 байта следовательно после команды a=(int)str; в переменной a окажется адрес строки в десятичном целочисленном виде. Что не верно в моих рассуждениях? Может просто продемонстрируете, как необходимо использовать указатель на символьную строку, чтобы на экран выводился реальный адрес.
 
04.09.2006
2 566
3
#5
<!--QuoteBegin-Yalud+25:01:2007, 11:14 -->
<span class="vbquote">(Yalud @ 25:01:2007, 11:14 )</span><!--QuoteEBegin-->В моем Hex редакторе есть функция редактирование и просмотра диска, а также есть функция редактирования и просмотра RAM(это оперативная память). Естественно я пользуюсь просмотром RAM. Программу я запускаю в пошаговом режиме, и после команды инициализации пытаюсь найти ту область памяти в которую попадает строка. (С помощью поиска мне ее все же удаеться найти, но адрес ячейки никак логически не объясняется). Вот я и пытаюсь понять принцип формирования данного ареса. Под отладчиком я принципиально не хочу запускать, т.к. данная программа формирует в памяти некую виртуальную область, в которую загружает программу, там все адреса определяются смещением от какого-то начального адреса итд итп(не буду развивать эту тему т.к. сам не уверен в правоте утверждений). Я хочу понять принцип работы программы в реальных условиях.
[snapback]54042" rel="nofollow" target="_blank[/snapback]​
[/quote]
Без комментариев... Запусти под отладчиком и посмотри!

<!--QuoteBegin-Yalud+25:01:2007, 11:14 -->
<span class="vbquote">(Yalud @ 25:01:2007, 11:14 )</span><!--QuoteEBegin-->Шина адреса моего проца имеет 32 бита или 4 байта,
[snapback]54042" rel="nofollow" target="_blank[/snapback]​
[/quote]
Довольно смелое утверждение, в котором я очень сомневаюсь
 
Y

Yalud

#6
Попробовал проанализировать под отладчиком. Действительно все сходится: если просмотреть ячейку памяти вычесляемую программой, там находится искомая строка. Но это не есть физический адрес ячейки в памяти, к сожалению. Выходит, что все адреса в windows формируются как смещение от какого-то начального адреса, про который естественно не пишут в книгах. Если взять полученный адрес, передать его другому процессу, а затем в другом процессе попытаться отобразить строку по этому адресу - ничего не получится т.к у другого процесса начальный адрес другой. (Проверенно опытным путем). Наверное этот начальный адрес и называется дескриптором процесса (HANDLE) мож кто слышал. Всем спасибо. :(
 
04.09.2006
2 566
3
#7
<!--QuoteBegin-Yalud+25:01:2007, 12:45 -->
<span class="vbquote">(Yalud @ 25:01:2007, 12:45 )</span><!--QuoteEBegin-->Если взять полученный адрес, передать его другому процессу, а затем в другом процессе попытаться отобразить строку по этому адресу - ничего не получится т.к у другого процесса начальный адрес другой.
[snapback]54065" rel="nofollow" target="_blank[/snapback]​
[/quote]
Методом научного тыка определено то, что написано во всех книгах по программированию в Windows.

<!--QuoteBegin-Yalud+25:01:2007, 12:45 -->
<span class="vbquote">(Yalud @ 25:01:2007, 12:45 )</span><!--QuoteEBegin-->Выходит, что все адреса в windows формируются как смещение от какого-то начального адреса, про который естественно не пишут в книгах.
[snapback]54065" rel="nofollow" target="_blank[/snapback]​
[/quote]
Пишут, но только не в книгах по языку С++, так как язык не зависит от платформы. Возьми книги Рихтера или Петзольда и все станет намного понятнее
 
I

Igorg

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

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

}
 
04.09.2006
2 566
3
#13
<!--QuoteBegin-deadhash+9:02:2008, 10:23 -->
<span class="vbquote">(deadhash @ 9:02:2008, 10:23 )</span><!--QuoteEBegin-->Мне задали научный проект
[snapback]97327" rel="nofollow" target="_blank[/snapback]​
[/quote]
Поздравляю! Тема закрыта.
 
Статус
Закрыто для дальнейших ответов.