Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Поговорим об адресации!, пытаюсь узнать адрес переменной.
Yalud
Вставить ник
сообщение 25:01:2007, 08:14
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 17
Регистрация: 17:01:2007
Пользователь №: 8 844
Специализация: АСУ-ТП



Репутация: - 0 +


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

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

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

}

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

Сообщение отредактировал Yalud - 25:01:2007, 08:15
Подняться вверх 
 
Сообщение #1
 
Новая тема 
Ответов (1 - 12)
Kmet
Вставить ник
сообщение 25:01:2007, 08:39
Цитата Ответить 


Гуру
***

Группа: Достойный программист
Сообщений: 491
Регистрация: 24:05:2006
Пользователь №: 4 397
Специализация: C\C++ Java SAP



Репутация: - 3 +


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


HEX редактором обычно назвают приложение для просмотра и редактирования файла. В таком контексте использовал?!
Подняться вверх 
 
Сообщение #2
European
Вставить ник
сообщение 25:01:2007, 08:48
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 816
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


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

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

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

Я так понял, что речь об отладчике
Подняться вверх 
 
Сообщение #3
Yalud
Вставить ник
сообщение 25:01:2007, 09:14
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 17
Регистрация: 17:01:2007
Пользователь №: 8 844
Специализация: АСУ-ТП



Репутация: - 0 +


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

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


Божественный
*****

Группа: Модеры
Сообщений: 1 816
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


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

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

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

Довольно смелое утверждение, в котором я очень сомневаюсь
Подняться вверх 
 
Сообщение #5
Yalud
Вставить ник
сообщение 25:01:2007, 10:45
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 17
Регистрация: 17:01:2007
Пользователь №: 8 844
Специализация: АСУ-ТП



Репутация: - 0 +


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


Божественный
*****

Группа: Модеры
Сообщений: 1 816
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


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

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

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

Пишут, но только не в книгах по языку С++, так как язык не зависит от платформы. Возьми книги Рихтера или Петзольда и все станет намного понятнее
Подняться вверх 
 
Сообщение #7
grigsoft
Вставить ник
сообщение 26:01:2007, 06:34
Цитата Ответить 


Мегагуру
****

Группа: Модеры
Сообщений: 696
Регистрация: 15:11:2005
Пользователь №: 2 573



Репутация: - 6 +


Лучше все же Рихтер: http://anatolix.naumen.ru/Books/Richter
Подняться вверх 
 
Сообщение #8
Yalud
Вставить ник
сообщение 26:01:2007, 09:41
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 17
Регистрация: 17:01:2007
Пользователь №: 8 844
Специализация: АСУ-ТП



Репутация: - 0 +


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


Занимательная книжечка. Как раз такой мне и не хватало. Спасибо за ссылку.
Подняться вверх 
 
Сообщение #9
Igorg
Вставить ник
сообщение 4:03:2007, 20:08
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 48
Регистрация: 8:02:2007
Из: Санкт-Петербург
Пользователь №: 9 168
Специализация: Программирование и схемотехника сетей ЭВМ



Репутация: - 0 +


Винда здесь при чем? В защищенном режиме процессор IA-32 (aka i386) работает с виртуальными адресами, которые преобразуются аппаратно в реальные по довольно сложной схеме (от виндовс требуется только правильная настройка регистров глобальных и локальных таблиц адресов, бла, бла, бла). Начал бы изучение языка Си с чего-нибудь попроще... С реального режима и мс-дос, что-ли...
Подняться вверх 
 
Сообщение #10
-=ФИЛОСОФ=-
Вставить ник
сообщение 26:03:2007, 06:44
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 13
Регистрация: 25:03:2007
Пользователь №: 9 886
Специализация: C++,Pascal,C++Builder,PHP,Delphi,Visual Basic,ASM



Репутация: - 0 +


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

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

}
Подняться вверх 
 
Сообщение #11
deadhash
Вставить ник
сообщение 9:02:2008, 08:23
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 2
Регистрация: 9:02:2008
Пользователь №: 15 259
Специализация: C++, C#, Pascal, asm



Репутация: - 0 +


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

Мне задали научный проект:"Нахождение нерабочих адресов в оперативной памяти с последующим выявлением самого чипа" это возможно вообще просьба прислать ответ.
Подняться вверх 
 
Сообщение #12
European
Вставить ник
сообщение 9:02:2008, 17:48
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 816
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


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

Поздравляю! Тема закрыта.
Подняться вверх 
 
Сообщение #13


Закрыто  Новая тема 

 

RSS Текстовая версия Сейчас: 17:05:2008 - 05:22
с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net