Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2017, 13:05   #1
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию Не переходит в защищённый режим

НЕ могу перейти в защищённый режим. Запускаю на qemu.
Файловая система NTFS
Файл программы bootmgr

При jmp fword 08h:PM_StartUp32 перезагружается qemu
Прошёлся отладчиком, строка "jmp fword 08h:PM_StartUp32" прыгает в текущий 0x0,0x63(по этому адресу расположена PM_StartUp32), но всё улетает в другой сегмент и по другому смещению. А далее перезагрузка.

В чём проблема?

Код:
use16
;cs = 2000h
jmp sb_start
sb_start:
   cli   
   mov ax, cs ; eax = 2000h
   mov ds, ax ; = cs
   mov es, ax
   sti
   jmp pm_start

pm_start:
    mov ax, 03h
    int 10h
   
    xor ax,ax
    in al, 0x92
    or al, 2
    out 0x92, al

    
    mov al, 8Fh
    out 70h, al
    in al, 71h

    cli
    lgdt [GDTR]
    mov eax, cr0
    or eax, 1
    mov cr0, eax
    ;jmp $
    jmp fword 08h:PM_StartUp32

GDT:
    NULL_DESC:
    dd 0            
    dd 0

CODE_DESC:
    dw 0FFFFh      
    dw 0           
    db 0           
    db 10011010b   
    db 11001111b    
    db 0           
    db 0FFh,0FFh,0,0,0,9Ah,0CFh,0;данные
    db 0FFh,0FFh,0,80h,0Bh,92h,40h,0 ;видеосегмент
    label GDT_SIZE at $-GDT
GDTR:
dw GDT_SIZE-1
dd GDT


use32
PM_StartUp32:
    xor eax,eax
    xor ebx,ebx
    xor edx,edx
    halt:
       nop
       jmp halt
Nikolay2015 вне форума Ответить с цитированием
Старый 09.12.2017, 14:10   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Чему равен источник кода? Почему нет команды org?
Куда грузится код, по какому смещению?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 09.12.2017, 14:16   #3
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Чему равен источник кода? Почему нет команды org?
Куда грузится код, по какому смещению?
Код грузится по адресу 2000h:0000h с диска (поэтому org ненужна я думаю)
Nikolay2015 вне форума Ответить с цитированием
Старый 09.12.2017, 15:50   #4
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

0x2002f: ljmpw $0x0,$0x3000

В отладчике jmp fword 08h:PM_StartUp32 прыгает по адресу 0x0,0x3000 если после use32 поставить org 3000h. Но на самом деле прыжок осуществляется в адрес 000Fh:E05Bh. И qemu уходит в reboot.
Но по адресу 2000h:3000h нет программы

Но если org убрать то:
0x2002f: ljmpw $0x0,$0x5d
должен прыгать на адрес 2000h:005Dh и как раз там уже загружена программа. Но этого не происходит и всё уходит на адрес 000Fh:E05Bh и reboot.

Последний раз редактировалось Nikolay2015; 09.12.2017 в 15:56.
Nikolay2015 вне форума Ответить с цитированием
Старый 09.12.2017, 16:34   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Ну так всё правильно прыгает он по абсолютному адресу, а вы ждёте относительно 2000h это не верно. Вы должны прибавить 2000h*16

Код:
          XOR  EAX, EAX
          MOV  AX, CS
          SHL  EAX, 4
          ADD  EAX, PM_StartUp32

          MOV   CS:[JMainPM], EAX

    mov eax, cr0
    or eax, 1
    mov cr0, eax

          ; бинарный код для jmp fword 08h:PM_StartUp32
          DB 066h
          DB 0EAh
JMainPM: DD 0                 
          DW 08h
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 09.12.2017 в 16:41. Причина: была ошибка 16, должно 4
Pavia вне форума Ответить с цитированием
Старый 09.12.2017, 16:52   #6
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Ну так всё правильно прыгает он по абсолютному адресу, а вы ждёте относительно 2000h это не верно. Вы должны прибавить 2000h*16

Код:
          XOR  EAX, EAX
          MOV  AX, CS
          SHL  EAX, 4
          ADD  EAX, PM_StartUp32

          MOV   CS:[JMainPM], EAX

    mov eax, cr0
    or eax, 1
    mov cr0, eax

          ; бинарный код для jmp fword 08h:PM_StartUp32
          DB 066h
          DB 0EAh
JMainPM: DD 0                 
          DW 08h
Всё равно reboot уходит.
Я ещё вчера пытался корректировать адрес тоже без успешно.
Всё что вне прыжка он выполняет, но как только прыжок то в reboot.
Код:
use16
;cs = 2000h
jmp sb_start
sb_start:
   cli   
   mov ax, cs ; eax = 2000h
   mov ds, ax ; = cs
   mov es, ax
   sti
   jmp pm_start

pm_start:
    mov ax, 03h
    int 10h
    


    xor ax,ax
    in al, 0x92
    or al, 2
    out 0x92, al

    
    mov al, 8Fh
    out 70h, al
    in al, 71h

    cli
    lgdt [GDTR]
   ; mov eax, cr0
    ;or eax, 1
    ;mov cr0, eax
;

    xor  eax, eax
    mov  ax, cs
    shl  eax, 4
    add  eax, PM_StartUp32

    mov [cs:JMainPM], eax

    mov eax, cr0
    or eax, 1
    mov cr0, eax

          ; бинарный код для jmp fword 08h:PM_StartUp32
    DB 066h
    DB 0EAh
JMainPM: DD 0                 
         DW 08h

 

    ;jmp fword 08h:PM_StartUp32+20000h

align 8
GDT:
NULL_DESC:
    dd 0            ; null descriptor
    dd 0

CODE_DESC:
    dw 0xFFFF       ; limit low
    dw 0            ; base low
    db 0            ; base middle
    db 10011010b    ; access
    db 11001111b    ; granularity
    db 0            ; base high

DATA_DESC:
    dw 0xFFFF       ; limit low
    dw 0           ; base low
    db 0            ; base middle
    db 10010010b    ; access
    db 11001111b    ; granularity
    db 0            ; base high
VIDEO_SEG:
    dw 0FFFFh
    dw 8000h
    db 0Bh
    db 092h
    db 040h
    db 0
    label GDT_SIZE at $-GDT
GDTR:
dw GDT_SIZE-1
dd GDT


use32
PM_StartUp32:
    xor eax,eax
    xor ebx,ebx
    xor edx,edx
    halt:
       nop
       jmp halt
Nikolay2015 вне форума Ответить с цитированием
Старый 09.12.2017, 17:22   #7
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

ljmpw $0x2,$0x6e
Вот что пишет отладчик при изменениях Pavia, но всё равно уходит в 0xE05Bh
Nikolay2015 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Защищённый просмотр KApSuL Microsoft Office Excel 0 10.04.2012 14:46
Защищённый режим процессора BVOG Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 18 21.03.2012 17:42
Защищённый процесс Terran Win Api 2 08.12.2007 13:31