Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
25:01:2007, 08:14
|
|
Новенький ![]() Группа: Программист Сообщений: 17 Регистрация: 17:01:2007 Пользователь №: 8 844 Специализация: АСУ-ТП Репутация: 0
|
Я попытался сообразить простенькую програмку, которая бы создавала символьную строку, и выводила адрес начала строки в физической памяти. Плод моего труда перед вашим опытным взором
#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
|
|
![]() |
|
|
25:01:2007, 08:39
|
|
Гуру ![]() ![]() ![]() Группа: Достойный программист Сообщений: 491 Регистрация: 24:05:2006 Пользователь №: 4 397 Специализация: C\C++ Java SAP Репутация: 3
|
Цитата В итоге я получаю какое-то число 1245048 которое каким-то образом связано с адресом строки, но после перевода в 16-ричный вид и просматривание ячейки памяти с этим адресом через HEX-редактор, своей строки я там не обнаруживою. В чем проблемма? Известен ли вам какой-либо другой способ, позволяющий справиться с моей задачей? HEX редактором обычно назвают приложение для просмотра и редактирования файла. В таком контексте использовал?! |
|
Сообщение
#2
|
|
|
|
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
|
|
|
|
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
|
|
|
|
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 ) Довольно смелое утверждение, в котором я очень сомневаюсь |
|
Сообщение
#5
|
|
|
|
25:01:2007, 10:45
|
|
Новенький ![]() Группа: Программист Сообщений: 17 Регистрация: 17:01:2007 Пользователь №: 8 844 Специализация: АСУ-ТП Репутация: 0
|
Попробовал проанализировать под отладчиком. Действительно все сходится: если просмотреть ячейку памяти вычесляемую программой, там находится искомая строка. Но это не есть физический адрес ячейки в памяти, к сожалению. Выходит, что все адреса в windows формируются как смещение от какого-то начального адреса, про который естественно не пишут в книгах. Если взять полученный адрес, передать его другому процессу, а затем в другом процессе попытаться отобразить строку по этому адресу - ничего не получится т.к у другого процесса начальный адрес другой. (Проверенно опытным путем). Наверное этот начальный адрес и называется дескриптором процесса (HANDLE) мож кто слышал. Всем спасибо.
|
|
Сообщение
#6
|
|
|
|
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
|
|
|
|
26:01:2007, 06:34
|
|
Мегагуру ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 696 Регистрация: 15:11:2005 Пользователь №: 2 573 Репутация: 6
|
Лучше все же Рихтер: http://anatolix.naumen.ru/Books/Richter
|
|
Сообщение
#8
|
|
|
|
26:01:2007, 09:41
|
|
Новенький ![]() Группа: Программист Сообщений: 17 Регистрация: 17:01:2007 Пользователь №: 8 844 Специализация: АСУ-ТП Репутация: 0
|
Лучше все же Рихтер: http://anatolix.naumen.ru/Books/Richter Занимательная книжечка. Как раз такой мне и не хватало. Спасибо за ссылку. |
|
Сообщение
#9
|
|
|
|
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
|
|
|
|
9:02:2008, 08:23
|
|
Новенький ![]() Группа: Программист Сообщений: 2 Регистрация: 9:02:2008 Пользователь №: 15 259 Специализация: C++, C#, Pascal, asm Репутация: 0
|
Лучше все же Рихтер: http://anatolix.naumen.ru/Books/Richter Мне задали научный проект:"Нахождение нерабочих адресов в оперативной памяти с последующим выявлением самого чипа" это возможно вообще просьба прислать ответ. |
|
Сообщение
#12
|
|
|
|
9:02:2008, 17:48
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 816 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Специализация: C++ Репутация: 31
|
|
|
Сообщение
#13
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 05:22 |