ejemplos modo protegido.pdf


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


Página 1...81 82 83848591

Vista previa de texto


mov edi,gdt_basep
mov ecx,gdt_end-gdt
.rep_movsb:
mov al,[ds:si]
mov [es:edi],al
inc esi
inc edi
dec ecx
jnz .rep_movsb
mov dword [gdtr+2],gdt_basep
lgdt [gdtr]
;
; Se copia el código de 32 bits a partir de os_basep.
;
copy_code:
;
; Como el label rep_movsb es un label local (el . al inicio indica
; que es local), se pueden definir muchos con el mismo nombre, siempre
; y cuando entre ellos exista un label normal, por lo que aquí se
; encuentra el label copy_code.
;
mov esi,modo_prot_32
mov edi,os_basep
mov [cs_32_entry_point],edi
mov ecx,(modo_prot_32_end-modo_prot_32)
.rep_movsb:
mov al,[ds:esi]
mov [es:edi],al
inc esi
inc edi
dec ecx
jnz .rep_movsb
;
; Se copia el código, sólo el de 32 bits, a la base os_basep.
;
; Se debe hacer un salto arriba del mega de memoria y al segmento de
; código flat de 32 bits. Sin embargo, por estar en un segmento de 16
; bits, los offset de los saltos lejanos son de 16 bits, y por eso se
; antepone el prefijo 66h para realizar un salto a un offset mayor a 2
; bytes.
;
; La próxima instrucción a ejecutar después del salto es jmp inicio32
; luego del label modo_prot_32
;
db 066h,0eah
cs_32_entry_point dd 0
dw cs_sel_32
;
; Las siguientes líneas de código son ejecutadas en el momento de
; retornar a modo protegido de 16 bits.
;
return_modo_real_16:
;
; Se carga un valor de selector válido antes de retornar a modo real,
; como también una pila.
;
cli
mov ax,ds_sel_16
mov ds,ax
mov es,ax
mov fs,ax