Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вывести адрес сегмента кода программы


Автор: Гость_Grig 27.5.2005, 13:45
Здравствуйте!!
В универе задали программку написать:
"Напишите программу, которая выводит значения адреса сегмента ее кода, начала данных из кучи и стека."
Не пойму как это можно осуществить?

Автор: oleg1973 27.5.2005, 15:56
ось какая?

Автор: Guest 27.5.2005, 16:36
Win 2000

Автор: oleg1973 28.5.2005, 14:49
Код

mov eax,cs
mov ebx,esp

пойдет? ))

Автор: Mayk 29.5.2005, 08:30
А вот более портируемые варианты:


2) Куча. Может сработать:
2.1) Узнаем куда растет куча
2.2) Создаем переменную в куче
2.3) Используя направление роста кучи распечатываем ее
(очевидный слабый момент - менеджер памяти обычно не выделяет память последовательно)

Код

        int* heaparr = new int[10];
        int* a = new int; *a=1;
        int direction = (int(a-heaparr) > 0) ? -1 : +1; //это направление к началу кучи
        int* heap = a; 
        int j; 
        int ofs;
        printf("%p %p\n",heaparr,a);
        for(j=0; j < 10; ++j) heaparr[j]=j; //для проверки
        for(j=0, ofs=0; j < 15; ++j, ofs+=direction)
                printf("%02d %08x\n",j,heap[ofs]); 




3) Стек. Аналогично, но без явных слабых моментов.
3.1) Узнаем куда растет стек
3.2) Создаем переменную в стеке
3.3) Печать стека.

Код

//это из wget/src/alloca.h. Довольно элегантно. 
int get_stack_direction()
{            
        static char* addr=NULL;
        auto char dummy;
        if(!addr){ 
                addr = &dummy; 
                return get_stack_direction();
        }
        return (&dummy > addr) ? 1 : -1; //это направление РОСТА стека
}   
    
int stack_print(int test, int stack_ints_to_print, int sd)
{   
        auto int32_t this_is_stack=0;
        register uint32_t* stack = (uint32_t*)&this_is_stack;
        register int i;
        int j;
        for(i=0,j=0; i <= stack_ints_to_print; ++i, j+=sd){
                printf("%03d %08x\n",i,stack[j]);

        }
}

int main()
{
        printf("main=%x\n",&main);
        stack_print(0x1023456,10,-get_stack_direction());
}


get_stack_direction() узнает куда стек растет
stack_print() распечатывает содержимое stack_ints_to_print 32битных слов
переменная test нужна для того, чтобы убедится лишний раз, что направление стека определенно верно. Для этой же цели выводим printf.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)