Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Assembler(TASM).Работа в защищенном режиме.  (Прочитано 9074 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MG
Гость
« : 14-11-2009 11:12 » 

Следующая программа осуществляет переход из реального режима в защищенный и обратно, при этом на экране должно выводиться слово "Hello". Однако слово не выводится. Программа должна работать в Windows XP. Может ли кто-то помочь? Заранее спасибо.
P.S Отладка программы делается командами:
tasm /m name.asm
tlink /x/3 name.obj

Код:
.386p
data segment 'data' use16
message db 'H',7,'e',7,'l',7,'l',7,'o',7
message_1=$-message
rest_scr=25*80
GDT label byte
db 8 dup(0)
GDT_flatCS db 0FFh,0FFh,0,0,0,10011010b,11001111b,0
GDT_flatDS db 0FFh,0FFh,0,0,0,10010010b,11001111b,0
GDT_16bitCS db 0FFh,0FFh,0,0,0,10011010b,0,0
GDT_16bitDS db 0FFh,0FFh,0,0,0,10010010b,0,0
GDT_1=$-GDT
gdtr dw GDT_1-1
dd ?
data ends

RM_seg segment para public 'code' use16
assume CS:RM_seg,SS:RM_stack,ds:data
start:
mov ax,data
mov ds,ax
in al,92h
or al,2
out 92h,al
xor eax,eax
mov ax,PM_seg
shl eax,4
add eax,offset PM_entry
mov dword ptr cs:pm_entry_off,eax
xor eax,eax
mov ax,ds
shl eax,4
push eax
mov word ptr GDT_16bitDS+2,ax
shr eax,16
mov byte ptr GDT_16bitDS+4,al
xor eax,eax


mov ax,cs
shl eax,4
mov word ptr GDT_16bitCS+2,ax
shr eax,16
mov byte ptr GDT_16bitCS+4,al
pop eax
add eax,offset GDT
mov dword ptr gdtr+2,eax
lgdt fword ptr gdtr
cli
in al,70h
or al,80h
out 70h,al
mov eax,cr0
or al,1
mov cr0,eax
db 66h
db 0EAh
pm_entry_off dd ?
dw SEL_flatCS
RM_return:
mov eax,cr0
and al,0FEh
mov cr0,eax
db 0EAh
dw $+4
dw RM_seg
in al,70h
and al,07FH
out 70h,al
sti
mov ah,0
int 16h
mov ah,4Ch
int 21h
SEL_flatCS equ 00001000b
SEL_flatDS equ 00010000b
SEL_16bitCS equ 00011000b
SEL_16bitDS equ 00100000b
RM_seg ends

PM_seg segment public 'CODE' use32
assume cs:PM_seg
PM_entry:
mov ax,SEL_16bitDS
mov ds,ax
mov ax,SEL_flatDS
mov es,ax
mov edi,0B8000h
mov ecx,rest_scr
mov ax,720h
rep stosw
mov esi,offset message
mov edi,0B8500h
mov ecx,message_1
rep movsb
db 0EAh
dd offset RM_return
dw SEL_16bitCS
PM_seg ends

RM_stack segment stack 'STACK' use16
db 100h dup(?)
RM_stack ends
end start
« Последнее редактирование: 15-11-2009 14:39 от Sel » Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 14-11-2009 11:49 » 

Из под WindowsXP у тебя ничего не получится. Команды:
Код:
lgdt fword ptr gdtr
...
mov eax,cr0
сразу вызовут "общее исключение защиты (general protection exception (13))".

Тебе надо загружаться из под MS-DOS и запускать свои программы или использовать для этого виртуальные машины.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 14-11-2009 21:12 » 

Если надо получить защищенный режим в DOS из-под винды, то следует пользоваться услугами DOS Extender-ов.
См. DPMI (DOS Protected Mode Interface): http://ru.wikipedia.org/wiki/DPMI
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines