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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите разобраться с командами!!!!  (Прочитано 8344 раз)
0 Пользователей и 1 Гость смотрят эту тему.
1dragon1
Гость
« : 25-01-2007 09:41 » 

Народ помогите разобраться с некоторыми командами, немогу найти что это значи
НЕпонятно бозначено (Не понял?)
Код:
code  segment
p486
org  100h  ; ???
assume  cs:code, ds:code
start:  jmp  begin
mess  db  ' МЫ В ЗAЩИЩЕННОМ РЕЖИМЕ '
gdt    dd  0   ;    ??
 dd  0                 ;  ??

dw  0ffffh                                ;  дескриптор  видеопамяти   ??
dw  8000h                              ;   не поуму что за значения ???
db  0bh                                    ;  ???
db  92h                                     ;  ???
dw  0                                         ; ???
desc_gdt  dq  0                   ;   
begin:
mov  si,offset desc_gdt            ; заносим  в заготовку размер и адрес GDT
mov  word ptr [si],15                 ;  ????
mov  ebx,0
mov  bx,offset gdt
push  cs
mov  eax,0
pop  ax
shl   eax,4
add  ebx,eax
mov   [si+2],ebx            ; а это адрес
lgdt  pword ptr [si]                    ; а теперь перекидываем заготовку в GDTR
mov  eax,cr0
mov  edx,eax
cli
or  eax,1
mov  cr0,eax                          ; ???? тут типа идет загрузка значения  1 в бит PE   
mov  ax,8                               ;  ????
mov  es,ax                      ; заносим в ES дескриптор  видеопамяти
cld
mov  si,0                  ; чистим экран
mov  ax,7020h                 ;  ???? что за значения загружаються?
mov  cx,2000                    ; ????
rep  stosw                         ;  ????
mov  bx,offset mess             ; выводим надпись
mov  si,1010                 ; 
mov  cx,22                    ; 

m:

mov  al,[bx]
mov  es:[si],al
add  si,2
inc  bx
loop  m
mov  cr0,edx                         ; выходим обратно в реальный режим
sti
mov  si,1348                        ; этот фрагмент доказывает что МП
mov  di,offset gdt               ; использует в РР начальный адрес
mov  al,[di+13]                   ; из теневой части сегментного регистра,
and  al,0fh                          ; а не из видимой ( в видимой части ES - 8, а значение
add   al,30h           ; выводится в видеопамять!!) и также показывает, что
mov  es:[si],al   ; МП сам устонавливает бит А в дескрипторе (было
                                            ; 92,стало 93 (на экран выводит-ся 3))
mov  ah,7
int  21h
mov  ah,4ch
int  21h
code  ends
end  start

Буду очень благодарен!
« Последнее редактирование: 14-12-2007 15:34 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 25-01-2007 16:21 » 

Код:
code  segment
p486
org  100h  ; смещение начала кода от начала сегмента
----------------------
gdt    dd  0   ;    константа gdt, 8 байт (?), значение 0
       dd  0                 ;

------------------
(видимо эти значения - и есть дескриптор)
dw  0ffffh             ;  дескриптор  видеопамяти   ??
dw  8000h               ;   не пойму что за значения ???
db  0bh                  ;  ??? 
db  92h                   ;  ??? 
dw  0                     ; ???
desc_gdt  dq  0                   ;  
--------------------
mov  word ptr [si],15       ;  *((word*)(si)) = 15 



чего смог подсказал ...  попытался по крайней мере )
« Последнее редактирование: 14-12-2007 15:36 от Алексей1153++ » Записан

sss
Специалист

ru
Offline Offline

« Ответ #2 : 22-03-2007 09:23 » 

Код:
code  segment
p486
org  100h  ; ???
assume  cs:code, ds:code
start:  jmp  begin
mess  db  ' МЫ В ЗAЩИЩЕННОМ РЕЖИМЕ '

;дескриптор 0
gdt    dd  0   ;                         дескриптор 0 (   всегда 0)
         dd  0   ;                         дескриптор 0 (   всегда 0)

;дескриптор 1
dw  0ffffh                                ;  предел
dw  8000h                              ;  база (15..0)
db  0bh                                   ;  уровень привилегий, тип
dw  0                                       ; сегмент, добавляемый к базе

;дескриптор 2
desc_gdt  dq  0                      ;   
begin:
mov  si,offset desc_gdt           ; в si смещение дескриптора 2
mov  word ptr [si],15              ; предел дескриптора 2

mov  ebx, 0
mov  bx,offset gdt
push  cs
mov  eax,0
pop  ax
shl   eax,4
add  ebx,eax
mov   [si+2],ebx                      ; а это адрес
lgdt  pword ptr [si]                   ; а теперь перекидываем заготовку в GDTR
mov  eax,cr0
mov  edx,eax
cli
or  eax,1
mov  cr0,eax                       ; ???? тут типа идет загрузка значения  1 в бит PE   
mov  ax,8                          ;  иначе только push/pop
mov  es,ax                       ; заносим в ES дескриптор  видеопамяти
cld
mov  si,0                           ; чистим экран
mov  ax,7020h                 ;  цвет/код
mov  cx,2000                    ; 80 x 25
rep  stosw                        ;  заполнение ES:[EDI] = EAX, счетчик в ECX
mov  bx,offset mess          ; выводим надпись
mov  si,1010                 ; 
mov  cx,22                    ; 

m:

mov  al,[bx]
mov  es:[si],al
add  si,2
inc  bx
loop  m
mov  cr0,edx                         ; выходим обратно в реальный режим
sti
mov  si,1348                        ; этот фрагмент доказывает что МП
mov  di,offset gdt               ; использует в РР начальный адрес
mov  al,[di+13]                   ; из теневой части сегментного регистра,
and  al,0fh                          ; а не из видимой ( в видимой части ES - 8, а значение
add   al,30h           ; выводится в видеопамять!!) и также показывает, что
mov  es:[si],al   ; МП сам устонавливает бит А в дескрипторе (было
                                            ; 92,стало 93 (на экран выводит-ся 3))
mov  ah,7
int  21h
mov  ah,4ch
int  21h
code  ends
end  start

Мне кажется код нерабочий...
Записан

while (8==8)
RXL
Технический
Администратор

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

WWW
« Ответ #3 : 22-03-2007 10:43 » 

Для корректного перехода в PM нужно после модификасии cr0 сделать far jump для загрузки дескриптора кодового сегмента - так написано в документации Intel.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
sss
Специалист

ru
Offline Offline

« Ответ #4 : 23-03-2007 01:48 » new

Ага, еще 1) видеопамять должна быть с адреса 0xB800 2) нет вызовов lldt, lidt 3) lgdt настраивается не на таблицу дескрипторов, которая должна начинается с нулевого дескриптора, а на кодовый сегмент реального режима...

P.S.: Это вроде com файл, да?
« Последнее редактирование: 23-03-2007 01:56 от sss » Записан

while (8==8)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines