Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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



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

НЕ могу перейти в защищённый режим. Запускаю на 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, 15:10   #2
Pavia
Лис
Профессионал
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 1,319
Репутация: 1387
По умолчанию

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

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

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 в 16:56.
Nikolay2015 вне форума   Ответить с цитированием
Старый 09.12.2017, 17:34   #5
Pavia
Лис
Профессионал
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 1,319
Репутация: 1387
По умолчанию

Ну так всё правильно прыгает он по абсолютному адресу, а вы ждёте относительно 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 в 17:41. Причина: была ошибка 16, должно 4
Pavia вне форума   Ответить с цитированием
Старый 09.12.2017, 17:52   #6
Nikolay2015
Форумчанин
 
Регистрация: 23.08.2017
Сообщений: 59
Репутация: 24
По умолчанию

Цитата:
Сообщение от 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, 18:22   #7
Nikolay2015
Форумчанин
 
Регистрация: 23.08.2017
Сообщений: 59
Репутация: 24
По умолчанию

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Защищённый просмотр KApSuL Microsoft Office Excel 0 10.04.2012 14:46
Защищённый режим процессора BVOG Assembler 18 21.03.2012 17:42
Защищённый процесс Terran Win Api 2 08.12.2007 14:31




04:39.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru