set_descriptor_G proc near
; Создаёт дескриптор.
; DS:BX = дескриптор в GDT
; EAX = адрес сегмента
; EDX = предел сегмента
; CL = байт прав доступа (access_rights)
push eax
push ecx ; Регистры EAX и ECX мы будем использовать.
push cx ; Временно сохраняем значение access_rights.
mov cx,ax ; Копируем младшую часть адреса в CX,
shl ecx,[COLOR="Green"]16[/COLOR] ; и сдвигаем её в старшую часть ECX.
mov cx,dx ; Копируем младшую часть предела в CX.
; Теперь ECX содержит младшую часть
; дескриптора (т.е. первые 4 байта -
; см. рис. 4-1).
mov [ bx ],ecx ; Записываем младшую половину дескриптора в GDT.
shr eax,[COLOR="Green"]16 [/COLOR] ; EAX хранит адрес сегмента, младшую часть
; которого мы уже использовали, теперь будем
; работать со старшей, для чего сдвигаем её в
; младшую часть EAX, т.е. в AX.
mov ch,ah
mov cl,[COLOR="green"]11000000b[/COLOR] G-Flag & use32
shl ecx,[COLOR="green"]16[/COLOR]
mov cl,al ; а биты адреса с 16 по 23 - в младший байт.
pop ax ; Возвращаем из стека в AX значение
; access_rights
mov ch,al ; и помещаем его во второй (из четырёх)
; байт ECX.
; Всё, дескриптор готов. Старшую часть
; предела и биты GDXU мы не устанавливаем и
; они будут иметь нулевые значения.
mov [ bx + [COLOR="green"]4[/COLOR] ],ecx ; Дописываем в GDT вторую половину
; дескриптора.
add bx,[COLOR="green"]8[/COLOR] ; Переводим указатель в GDT на следующий
; дескриптор.
pop ecx
pop eax
ret
endp
Descriptor $ Flag G
Приведённый ниже код должен создавать дескриптор, флаг G (Гранулярность) каторого должен быть равен 1. Дескриптор создаёт а вот при дальнейшей работе становиться понятно что гранулярности там нету :mad: . Пожалуйста помогите! В чём моя ошибка!
????????????
ясно , что ничего не ясно . ) ты как потом гранулярность проверяешь ? Вместе с гранулярность ты use32 устанавливаешь - оно работает ?
Гранулярность я проверяю так:
Код:
mov ES,[COLOR="Green"]11000b[/COLOR] ;селектор ссылается на нужный дескриптор
mov ES:[[COLOR="green"]1FFFFh[/COLOR]],word ptr [COLOR="green"]01h[/COLOR] ;Запись туда
;Здесь возникает исключение
mov ES:[[COLOR="green"]1FFFFh[/COLOR]],word ptr [COLOR="green"]01h[/COLOR] ;Запись туда
;Здесь возникает исключение
use32 - не знаю может это именно use32 не фурычит