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

编程学习

我的网上家园

 
 
 

日志

 
 

从实模式转向保护模式,当前特权级被自动初始化为0的测试  

2013-06-05 14:33:25|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在实模式下开启保护模式以后,当前特权级被自动初始化为0特权级,此时的 "当前特权级" 与CS的值无关. CS的值在没有刷新之前,仍然是"段值",而不是段选择子.
下面是测试代码:

video_ram_seg_sel equ 0x20

section mbr
xor ax,ax
mov ss,ax
mov sp,0x7c00
mov ds,ax
mov si,0x7c00
mov ax,0x7f3
mov es,ax
xor di,di
mov cx,0x200
repz movsb                                  ;把MBR代码从0:0x7c00复制到0x7f3:0 
jmp 0x7f3:newaddr     ;执行代码跳转,实现段的重定位

newaddr:
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],0x00cf9200
;mbr
mov dword [ebx+0x10],0x7f3001ff ;重要,新的执行基地址是0x7f30
mov dword [ebx+0x14],0x00409800
;栈
mov dword [ebx+0x18],0x7c00fffe
mov dword [ebx+0x1c],0x00cf9600
;显示缓冲区
mov dword [ebx+0x20],0x80007fff
mov dword [ebx+0x24],0x0040920b

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
jmp 0x10:flush ;在执行跳转命令时,CS的值是0x7f3,但0x7f3是段值,而不是段选择子


[bits 32]
flush:
mov eax,0x18
mov ss,eax
mov esp,0

mov eax,0x8
mov ds,eax
mov es,eax
mov ebx,message+0x7f30 ;DS指向的内存段,基地址是0,所以这儿要加上0x7f30
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 0!',0
message2 db 0xd,0xa,'running 1!',0


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

历史上的今天

评论

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

页脚

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