注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

编程学习

我的网上家园

 
 
 

日志

 
 

特权级复习与测试:从实模式直接进入3特权级保护模式执行  

2013-06-04 16:28:15|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
分析:
实模式转向保护模式,在刚开启保护模式时,当前特权级被初始化为0,要转到3特权级的代码执行,只能是通过 "假装从高特权级的代码返回" 的方法来达到目的.

以下是全部源代码:

video_ram_seg_sel equ 0x23 ;0x23--> 10_0011B-> 100_0_11B  索引项4,位于GDT中,特权级3

section mbr vstart=0x7c00
xor ax,ax
mov ss,ax
mov sp,0x7c00
mov eax,[cs:pgdt+2]
xor edx,edx
mov ebx,16
div ebx
mov ds,eax
mov ebx,edx
mov dword [ebx+0x00],0
mov dword [ebx+0x04],0
;0-4gb
mov dword [ebx+0x08],0x0000ffff
mov dword [ebx+0x0c],0x00cff200   ;3特权级内存段
;mbr
mov dword [ebx+0x10],0x7c0001ff
mov dword [ebx+0x14],0x0040f800  ;3特权级MBR代码段
;栈
mov dword [ebx+0x18],0x7c00fffe
mov dword [ebx+0x1c],0x00cff600   ;3特权级栈段
;显示缓冲区
mov dword [ebx+0x20],0x80007fff
mov dword [ebx+0x24],0x0040f20b  ;3特权级显示缓冲区

mov word [cs:pgdt],39
lgdt [cs:pgdt]
in al,0x92
or al,2
out 0x92,al

cli

mov eax,cr0
or eax,1
mov cr0,eax     ;开启保护模式
push  0x1b ;入栈SS,3特权级栈段选择子
push  0 ;入栈SP,3特权级栈指针,注意,在CS的段高速缓存还没有发生变化时,现在还是16位模式
push  0x13      ;入栈3特权级代码段选择子
push  flush-0x7c00 ;入栈3特权级IP地址   减去0x7c00是因为使用了vstart=0x7c00

retf ;假装从0特权级的代码返回到3特权级的代码,中间要切换栈.
[bits 32]
flush:
mov eax,0x1b
mov ss,eax
mov esp,0

mov eax,0xb
mov ds,eax
mov ebx,message
call put_string

hlt ;特权指令,执行到这里时,会引发异常.

put_string:
push ecx
.show:
mov cl,[ebx]
or cl,cl
jz .exit
call put_char
inc ebx
jmp .show
.exit:
pop ecx
ret
put_char:
pushad
mov dx,0x3d4
mov al,0xe
out dx,al
inc dx
in al,dx
mov ah,al
dec dx
mov al,0xf
out dx,al
inc dx
in al,dx ;AX为当前光标位置
cmp cl,0xd
jnz .0xa
mov bl,80
div bl
mul bl
jmp .setcursor
.0xa:
cmp cl,0xa
jnz .other
add ax,80
cmp ax,80*25
jb .setcursor
sub ax,80
jmp .rollscreen
.other:
push es
mov ebx,video_ram_seg_sel
mov es,ebx
movzx ebx,ax
shl ebx,1
mov [es:ebx],cl
pop es
inc ax
cmp ax,80*25
jb .setcursor
mov ax,80*24

.rollscreen:
push ds
push es
mov ebx,video_ram_seg_sel
mov ds,ebx
mov es,ebx
mov esi,80
xor edi,edi
mov ecx,80*24*2/4
rep movsd
mov esi,80*24
mov ecx,80*2/4
.clr:
mov dword [esi],0x07200720
add esi,4
loop .clr
pop es
pop ds

.setcursor:
mov bx,ax
mov dx,0x3d4
mov al,0xe
out dx,al
inc dx
mov al,bh
out dx,al
dec dx
mov al,0xf
out dx,al
inc dx
mov al,bl
out dx,al

popad
ret



message  db 0xd,0xa,'running 3!',0


pgdt    dw 0
        dd 0x7e00
times 510-($-$$) db 0
dw 0xaa55
  评论这张
 
阅读(40)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017