sgdt& адрес таблицы GDT

Тема в разделе "WASM.WIN32", создана пользователем chijo, 15 фев 2007.

  1. chijo

    chijo New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    15
    Здравствуйте!!!
    Не могу получить адрес таблицы GDT в user mode.
    Выполняю код в visual c:

    _asm sgdt gdt;
    где gdt-структура с word для размера и DWORD для адреса.
    В итоге в DWORD хранится ccccf772, не очень похоже на адрес таблицы...

    В чем может быть ошибка???
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1.      sgdt [GDT]
    2.      mov eax, [GDT + 2]
    В eax - 8003F000, как и должно быть.

    Может ты структуру неправильно объявил, выравнивание не учёл?
     
  3. chijo

    chijo New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    15
    Вот код:
    #include<windows.h>
    #include<stdio.h>
    typedef struct _gdts
    {
    WORD Size;
    DWORD Base;
    } gdts
    int main(void)
    {
    gdts gdt;
    _asm sgdt gdt;
    printf("0x%.8x\n",gdt.Base);
    }

    выдает ccccf772....
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну, как я и говорил выравнивание структуры у тебя по умолчанию. Надо на границу 1, или 2х байт.
    #pragma pack (push, 1)
    // Твоя структура
    #pargma pack (pop)
     
  5. chijo

    chijo New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    15
    То есть вот так:
    #include<windows.h>
    #include<stdio.h>
    #pragma pack (push, 1)
    typedef struct _gdts
    {
    WORD Size;
    DWORD Base;
    } gdts
    #pargma pack (pop)
    int main(void)
    {
    gdts gdt;
    _asm sgdt gdt;
    printf("0x%.8x\n",gdt.Base);
    }

    Вроде результат похож, но почему она выдает то 8003f000, то f7723160?
    И еще глупый вопрос, в чем смысл этого выравнивания, то есть что происходит при этом...
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    2 ядра? HT? У меня на машине с HT тоже 2 результат иногда выводил.
    SetProcessAffinityMask сделай.
    Ну если раньше структура у тебя в памяти выгледела примерно так:
    Код (Text):
    1. 0 Limit
    2. 2 Padding
    3. 4 Base
    То после "отключения" выравнивания будет без Padding.