Помогите решить проблему со стеком в PM

Тема в разделе "WASM.ASSEMBLER", создана пользователем _220, 25 авг 2006.

  1. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    В очередной раз бросаясь на штурм защищенного режима, я, чувствуя что накопил достаточно опыта и знаний локализовал(не смеятся), что все мои попытки написания сосбственной оси, которая на бумажке
    практически готова, упираются в самый простой пуш, или в поп, раньше я пытался обрабатывать прерывания, но не догадался, что у меня не работает стек, поэтому долго медитировал, искал пресловутую кошку. Статьи я читал всякие, нго там ограничиваются созданием дескрипторов сегментов кода и данных, хотя вроде как стек - это даные задом наперед, т.е. сегмент, растущий в другую сторону, но мой пущ так же не работает. Плиз кто делал стек в PM найдите ошибку в моем дескрипторе(или инициализации). Вот код(гружусь с дискеты, так проще):

    [BITS 16]
    [ORG 0x7c00]
    _start:
    cli
    mov ax, cs
    mov ds, ax
    mov ss, ax
    mov sp, _start
    lgdt [gd_reg]
    in al, 0x92;
    or al, 2; вкл. а20
    out 0x92, al;
    in AL,70h;
    or AL,80h; прерывания запрещ.
    out 70h,AL;
    mov eax, cr0
    or al, 1
    mov cr0, eax
    jmp 0x8: _protected
    [BITS 32]
    _protected:
    mov ax, 0x10; 1-ый дескр. в GDT?, код
    mov ds, ax
    mov ax,0x18; 3-ий дескр. в GDT?, стек
    mov ss,ax

    mov esp,0x2000000; ставлю esp
    push eax; тут комп перегружается
    pop eax;
    mov dword[0xb8000],0x07410741; вывожу две буквы 'A'
    hlt
    jmp short $



    gdt:
    dw 0, 0, 0, 0

    db 0xFF
    db 0xFF
    db 0x00
    db 0x00
    db 0x00
    db 10011010b
    db 0xCF
    db 0x00

    db 0xFF
    db 0xFF
    db 0x00
    db 0x00
    db 0x00
    db 10010010b
    db 0xCF
    db 0x00

    db 0xFF
    db 0xFF
    db 0x00
    db 0x00
    db 0x00
    db 10010110b
    db 11001111b
    db 0x00



    gd_reg:
    dw 8192
    dd gdt
    times 510-($-$$) db 0
    db 0xaa, 0x55
     
  2. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Или я чего-то не понял, или ошибок больше.

    mov ax, 0x10; 1-ый дескр. в GDT?, код
    не а, не первый. Первый это 01000b, он же 08h А 10h это второй

    mov ax,0x18; 3-ий дескр. в GDT?, стек

    А тут верно, 011000b это 18h.

    Код (Text):
    1.     db 0xFF
    2.     db 0xFF
    3.     db 0x00
    4.     db 0x00
    5.     db 0x00
    6.     db 10010110b
    7.     db 11001111b
    8.     db 0x00
    Ну ё! Сдались вам эти expand down сегменты! Либо внимательно прочитай в доке, что это такое и чем он отличается от обычного, либо используй обычный. Можно поискать в форуме, месяц назад я как раз объяснял разницу.

    Чтобы заработало, нужно либо изменить пятый байт на 10010010b
    Либо изменить предел (нулевой и первый байты и начало шестого байта) на 0 (для простоты).

    Когда прочитаешь доки - поймёшь почему так :)
     
  3. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    да я читал доки, усе ок. если сегмент растет как обычно.
    а с 1-ым дескриптором это я сглючил просто :dntknw:, как говорится думаю одно, а пишу другое(это не ошибка, просто неправильный коммент)