Я попытался сообразить простенькую програмку, которая бы создавала символьную строку, и выводила адрес начала строки в физической памяти. Плод моего труда перед вашим опытным взором
#include <iostream.h>
void main(void)
{
char str[]="strokakakayato";
int a;
a=(int)str;
cout<<a;
return;
}
В итоге я получаю какое-то число 1245048 которое каким-то образом связано с адресом строки, но после перевода в 16-ричный вид и просматривание ячейки памяти с этим адресом через HEX-редактор, своей строки я там не обнаруживою. В чем проблемма? Известен ли вам какой-либо другой способ, позволяющий справиться с моей задачей?
В моем Hex редакторе есть функция редактирование и просмотра диска, а также есть функция редактирования и просмотра RAM(это оперативная память). Естественно я пользуюсь просмотром RAM. Программу я запускаю в пошаговом режиме, и после команды инициализации пытаюсь найти ту область памяти в которую попадает строка. (С помощью поиска мне ее все же удаеться найти, но адрес ячейки никак логически не объясняется). Вот я и пытаюсь понять принцип формирования данного ареса. Под отладчиком я принципиально не хочу запускать, т.к. данная программа формирует в памяти некую виртуальную область, в которую загружает программу, там все адреса определяются смещением от какого-то начального адреса итд итп(не буду развивать эту тему т.к. сам не уверен в правоте утверждений). Я хочу понять принцип работы программы в реальных условиях.
Что касается главы "Указатели" еще раз я перечитал ее кажется дня два назад, и еще раз прочитал после того и готов еще пять раз прочитать, но либо я там что-то не понимаю, либо там нет ответа на мой вопрос.
Понятное дело, что переменная str после инициализации является как раз указателем(несмотря на то что там нет знака *) следовательно в ней содержится именно адрес. Шина адреса моего проца имеет 32 бита или 4 байта, следовательно все указатели на адреса имеют размерность 4 байта. Переменная int имеет также 4 байта следовательно после команды a=(int)str; в переменной a окажется адрес строки в десятичном целочисленном виде. Что не верно в моих рассуждениях? Может просто продемонстрируете, как необходимо использовать указатель на символьную строку, чтобы на экран выводился реальный адрес.
Попробовал проанализировать под отладчиком. Действительно все сходится: если просмотреть ячейку памяти вычесляемую программой, там находится искомая строка. Но это не есть физический адрес ячейки в памяти, к сожалению. Выходит, что все адреса в windows формируются как смещение от какого-то начального адреса, про который естественно не пишут в книгах. Если взять полученный адрес, передать его другому процессу, а затем в другом процессе попытаться отобразить строку по этому адресу - ничего не получится т.к у другого процесса начальный адрес другой. (Проверенно опытным путем). Наверное этот начальный адрес и называется дескриптором процесса (HANDLE) мож кто слышал. Всем спасибо.
Лучше все же Рихтер: http://anatolix.naumen.ru/Books/Richter
Винда здесь при чем? В защищенном режиме процессор IA-32 (aka i386) работает с виртуальными адресами, которые преобразуются аппаратно в реальные по довольно сложной схеме (от виндовс требуется только правильная настройка регистров глобальных и локальных таблиц адресов, бла, бла, бла). Начал бы изучение языка Си с чего-нибудь попроще... С реального режима и мс-дос, что-ли...
Вот как надо получатьб адрес переменной:
#include <iostream.h>
void main(void)
{
char str[]="strokakakayato";
int a;
asm{
mov ax,offset str
lea a,ax
}
cout<<a;
return;
}
Русская версия Invision Power Board (http://www.nulled.ws)
© Invision Power Services (http://www.nulled.ws)