ejemplos modo protegido.pdf


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


Página 1...82 83 84858691

Vista previa de texto


mov gs,ax
mov ss,ax
mov esp,0fffeh
mov eax,cr0
and al,0feh
mov cr0,eax
db 0eah
dw modo_real
real_cs dw 0
;
; En modo real se vuelve a colocar un valor válido en todos los
; selectores y en la pila.
;
modo_real:
mov ax,cs
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
mov esp,0fffeh
;
; Por último se retorna al DOS.
;
mov ah,4ch
int 21h
;
; Al igual que en el ejemplo anterior, se utiliza segmento de 32 bits y
; se alinea la primera instrucción a 16 bytes.
;
use32
align 16
modo_prot_32:
jmp inicio32
;
; Para una mejor performance del programa las variables se alinean a 4
; bytes. Por otro lado, Intel también recomienda separar páginas de
; código de páginas de datos, lo que en este ejercicio no se hace.
;
align 4
freememF
equ
$-modo_prot_32+os_basep
freemem
equ
$-modo_prot_32+os_base
dd
((os_basep+modo_prot_32_end-modo_prot_32+4095)&0fffff000h)
PDEF
equ
$-modo_prot_32+os_basep
PDE
equ
$-modo_prot_32+os_base
dd
0
PTEF
equ
$-modo_prot_32+os_basep
PTE
equ
$-modo_prot_32+os_base
dd
0
;
; Las líneas a partir de align 4 hasta aquí son tal vez algo complejas
; de comprender. Hacen referencia a 3 variables. Para definir una
; variable normalmente se utiliza:
;
; nombre_var
dd
0
;
; Donde nombre_var es, para el compilador, el offset de la variable.
; Pero en este ejemplo no se puede direccionar la variable de este
; modo, ya que el offset sería en relación al org 100h y no al offset
; real de las variables que es respecto a la base del segmento la cual
; es 0.