ejemplos modo protegido.pdf


Vista previa del archivo PDF ejemplos-modo-protegido.pdf


Página 1...74 75 76777891

Vista previa de texto


;
mov [real_cs],cs
;
;
;
;
;
;
;
;

Como en modo protegido 32 bits se está utilizando un segmento flat,
la base se encontrará en 0 y el límite en 4 Gb. El código cargado por
DOS puede quedar cargado en distintos offset, por lo que es necesario
calcular el offset inicial del programa. El valor del offset se
almacena en una variable denominada offset_32, que se utiliza para
realizar un salto largo al segmento flat.
xor
mov
shl
add
mov

eax,eax
ax,cs
eax,4
eax,cs_32_start
[offset_32],eax

;
; Se pasa a modo protegido de 16 bits.
;
cli
mov eax,cr0
or al,1
mov cr0,eax
jmp cs_16_selector:modo_protegido_16
modo_protegido_16:
;
; E inmediatamente a modo protegido de 32 bits.
;
db 066h
db 0eah
offset_32 dd 0
dw cs_32_selector
;
; Este código se ejecuta al retornar a modo protegido de 16 bits. Se
; carga la pila con valores de 16 bits.
;
retornar_modo_real:
mov ax,ds_16_selector
mov ss,ax
mov esp,0fffeh
;
; Se retorna a modo real.
;
mov eax,cr0
and al,0feh
mov cr0,eax
db 0eah
dw modo_real
real_cs resw 1
;
; En modo real se inicializan nuevamente todos los selectores.
;
modo_real:
mov ax,cs
mov ss,ax
mov sp,0fffeh
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
;
; Y se retorna al DOS.