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

Тема в разделе "C и С++ FAQ", создана пользователем Yalud, 25 янв 2007.

Статус темы:
Закрыта.
  1. Yalud

    Yalud Гость

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

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

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

    }

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    HEX редактором обычно назвают приложение для просмотра и редактирования файла. В таком контексте использовал?!
     
  3. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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]
    Я так понял, что речь об отладчике
     
  4. Yalud

    Yalud Гость

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

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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]
    Довольно смелое утверждение, в котором я очень сомневаюсь
     
  6. Yalud

    Yalud Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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]
    Пишут, но только не в книгах по языку С++, так как язык не зависит от платформы. Возьми книги Рихтера или Петзольда и все станет намного понятнее
     
  8. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
  9. Yalud

    Yalud Гость

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

    Igorg Гость

    Винда здесь при чем? В защищенном режиме процессор 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;

    }
     
  12. deadhash

    deadhash Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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]
    Поздравляю! Тема закрыта.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей