Unreal Mode CPU

Assembler programming questions
  • статья есть редактируем.
  • марио я тебе скинул правленый вариант жду пока поддтвердишь что можно, + какие-нить идеи
    Думаю можно включить наш вариант в дистриб, так будет более универсально.
  • v icq link na webfile.ru
  • Mario! Найди нормальный способ записать загрузчик или скажи где там бут сектор и как его через редактор можно зафигачить, тогда я смогу проверить фасмовский код, я знаю где ошибка (в самом компилере!).
  • Похоже, что сайт упал
  • lgdt gdtr;Загружаем GDTR

    mov eax,cr0;Переключаемся в защищенный режим
    inc al
    mov cr0,eax
    db 0EAh;Дальний JMP для загрузки CS селектором
    dw offset protect
    dw 08h

    protect:
    mov ax,10h;Загружаем FS в защищенном режиме
    mov fs,ax

    mov eax,cr0;Идем назад в реальный режим
    dec al
    mov cr0,eax
    db 0EAh
    dw offset real
    dw code

    real:;Открываем вентиль GateA20
    можно проще

    ...
    ...
    lgdt pword [gdtPtr]
    cli
    mov eax, cr0
    or al, 01b
    mov cr0, eax
    mov bx, 08
    mov fs, bx
    and al, 0xFE
    mov cr0, eax
    sti
    ...
    ...

    gdt dw 0, 0, 0, 0 ;0
    _temp dw 0ffffh,0,0F200h,008fh ;08

    gdtPtr dq ?

    процессор хранит дескрипторы сегментов в теневых регистрах и не меняет их, пока сегментный регистр не будет перегружен. Поэтому нам не нужен дескриптор для кода и перегружать CS через far JMP тоже не надо. Перешли в PM, загрузили нужный селектор и сразу назад.
  • Mario79

    Вот полная заготовка для ДОС
    ;;;;;;;;;;;;;;;;;;;;;;;
    format MZ
    heap 0
    stack 800h
    entry main:start

    segment main use16

    use16
    start:

    mov ax,_data
    mov ds, ax
    mov es, ax

    xor eax, eax
    mov ax,ds

    shl eax, 4

    mov bx, gdt
    add ebx, eax ; ebx - линейный адрес gdt

    mov word [gdtPtr], 2 * 8 -1 ; предел gdt 2 дескриптора = 0x000f
    mov dword [gdtPtr + 2], ebx

    lgdt pword [gdtPtr]

    in al, 0x70 ;запрещаем NMI
    mov bl, al
    or al, 0x80
    out 70h , al
    in al, 0x71 ;некоторые RTC после записи байта в порт 0х70
    ;ожидают обращения к порту 0x71

    cli

    mov eax, cr0
    or al, 01b
    mov cr0, eax

    mov dx, 0x08
    mov gs, dx ;gs - глобальный сегмент с базой 0 и пределом 0xFFFFFFFF

    and al, 0xFE
    mov cr0, eax

    sti

    mov al, bl
    out 70h , al
    in al, 71h

    mov dx,92h
    in al,dx
    or al,2
    out dx,al

    ;теперь можно получить доступ ко всей памяти
    ;например

    mov eax, [gs:0xFFFFFFF0] ;

    mov ah,4ch ;завершение ДОС программы
    int 21h

    segment _data use16

    align 16

    gdt dw 0, 0, 0, 0 ;0
    _flat dw 0ffffh,0,0F200h,008fh ;08 сегмент данных DPL = 3
    ;база 0, предел 0xFFFFFFFF

    gdtPtr dq ?

    ;;;;;;;;;;;;;;;;;;;;;;;;;;
    ДОС и БИОС не испльзуют сегментные регистры gs и fs но EMM386 и QEMM используют
    V86 mode и код работать не будет
  • Mario79

    Прерывания БИОС могут использовать ES.
  • Who is online

    Users browsing this forum: No registered users and 6 guests