ejemplos modo protegido.pdf

Vista previa de texto
; existe su función sgtr que lee el contenido, y cuya sintaxis es
; idéntica a la de lgdt.
;
; Luego se debe colocar la base al segmento de datos, que se encuentra
; debajo del mega. Para eso se necesita memoria libre que, por ser un
; .com, se encuentra desde el final del código del programa hasta los
; 640 Kbytes.
;
; IMPORTANTE: La pila se encuentra en el segmento de código en el
; desplazamiento sp=0FFFEh, posiciones de memorias que en este ejemplo
; serán utilizadas para almacenar el BIOS, lo cual es sólo posible
porque
; no se utiliza la pila. Es importante inhabilitar las interrupciones,
; evitando así el uso involuntario.
;
; Por otro lado se debe buscar un segmento de datos vacío por debajo del
; mega de memoria. Para eso se utiliza el label fin: que indica el
; final del código.
;
xor ebx,ebx
mov bx,fin+15
add eax,ebx
;eax=base lineal fin+15
;
; En eax se tiene la base lineal del segmento de código. Se suma el
; offset de fin: y 15. Como se busca un segmento, es recomendable que
; éste se encuentre alineado en 16 bytes.
;
shr eax,4
mov es,ax
;es segmento vacío de 64 Kb.
;
; Se divide por 16 y se lo carga en es.
;
cli
mov eax,cr0
or al,1
mov cr0,eax
jmp $+2
;
; Se pasa a modo protegido.
;
mov ax,8h
mov ds,ax
;
; Se carga en ds el selector que apunta al descriptor de un segmento de
; datos de FLAT, o sea que tiene la base en 0 y el límite en 4Gb.
;
mov di,0
mov esi,0FFFF0000h
mov cx,0ffffh
;
; Se inicializan las variables para copiar de ds:esi a es:di. No se
; utiliza la instrucción rep movsd, ya que el origen es esi (32 bits) y
; el destino es di (16 bits).
;
repmovsb:
mov al,[ds:esi]
mov [es:di],al
inc esi
inc di
dec cx
jnz repmovsb
