zoukankan      html  css  js  c++  java
  • 进入32位保护模式示例

             ;设置堆栈段和栈指针 
             mov ax,cs      
             mov ss,ax
             mov sp,0x7c00
          
             ;计算GDT所在的逻辑段地址 
             mov ax,[cs:gdt_base+0x7c00]        ;低16位 7E00 gdt_base偏移量
             mov dx,[cs:gdt_base+0x7c00+0x02]   ;高16位 0000
             mov bx,16        
             div bx            
             mov ds,ax                          ;令DS指向该段以进行操作
             mov bx,dx                          ;段内起始偏移地址 
          
             ;创建0#描述符,它是空描述符,这是处理器的要求
             mov dword [bx+0x00],0x00
             mov dword [bx+0x04],0x00  
    
             ;创建#1描述符,保护模式下的代码段描述符
             mov dword [bx+0x08],0x7c0001ff     
             mov dword [bx+0x0c],0x00409800     
    
             ;创建#2描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区) 
             mov dword [bx+0x10],0x8000ffff    
             mov dword [bx+0x14],0x0040920b     
    
             ;创建#3描述符,保护模式下的堆栈段描述符
             mov dword [bx+0x18],0x00007a00
             mov dword [bx+0x1c],0x00409600
    
             ;初始化描述符表寄存器GDTR
             mov word [cs: gdt_size+0x7c00],31  ;描述符表的界限(总字节数减一)   
                                                 
             lgdt [cs: gdt_size+0x7c00]            ;取gdt_size地址内容的 2个字节就是16位 再取后门4个字节 就是32位
                                                ;合计48位
             in al,0x92                         ;南桥芯片内的端口 
             or al,0000_0010B
             out 0x92,al                        ;打开A20
    
             cli                                ;保护模式下中断机制尚未建立,应 
                                                ;禁止中断 
             mov eax,cr0
             or eax,1
             mov cr0,eax                        ;设置PE位
          
             ;以下进入保护模式... ...
             jmp dword 0x0008:flush             ;16位的描述符选择子:32位偏移
                                                ;通过ddjmp  远跳转 清空流水线 取gdt的下标1 的索引描述符赋值到cs的高速缓存器
                                                ;清流水线并串行化处理器 
             [bits 32] 
    
        flush:
             mov cx,00000000000_10_000B         ;加载数据段选择子(0x10) gdt里面的索引值 
             mov ds,cx
    
             ;以下在屏幕上显示"Protect mode OK." 
             mov byte [0x00],'P'  
             mov byte [0x02],'r'
             mov byte [0x04],'o'
             mov byte [0x06],'t'
             mov byte [0x08],'e'
             mov byte [0x0a],'c'
             mov byte [0x0c],'t'
             mov byte [0x0e],' '
             mov byte [0x10],'m'
             mov byte [0x12],'o'
             mov byte [0x14],'d'
             mov byte [0x16],'e'
             mov byte [0x18],' '
             mov byte [0x1a],'O'
             mov byte [0x1c],'K'
    
             ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 
             mov cx,00000000000_11_000B         ;加载堆栈段选择子
             mov ss,cx
             mov esp,0x7c00
    
             mov ebp,esp                        ;保存堆栈指针 
             push byte '.'                      ;压入立即数(字节)
             
             sub ebp,4
             cmp ebp,esp                        ;判断压入立即数时,ESP是否减4 
             jnz ghalt                          
             pop eax
             mov [0x1e],al                      ;显示句点 
          
      ghalt:     
             hlt                                ;已经禁止中断,将不会被唤醒 
    
    ;-------------------------------------------------------------------------------
         
             gdt_size         dw 0
             gdt_base         dd 0x00007e00     ;GDT的物理地址 
                                 
             times 510-($-$$) db 0
                              db 0x55,0xaa
    从此山高路远,纵马扬鞭。愿往后旅途,三冬暖,春不寒,天黑有灯,下雨有伞。此生尽兴,不负勇往。
  • 相关阅读:
    RDIFramework.NET ━ .NET快速信息化系统开发框架4.4 员工(职员)管理
    (八大方法、逐层深入,有你一定没见过的)使用INSERT语句向表中插入数据
    国土档案管理信息系统【档案著录】地籍类档案著录
    RDIFramework.NET ━ .NET快速信息化系统开发框架4.3 平台主界面
    [推荐][提供下载](Excel):常用函数公式及操作技巧系列文章【共十篇】
    RDIFramework.NET ━ .NET快速信息化系统开发框架4.6 角色管理模块
    CSS长度单位参考
    Ajax 和 XML: 五种常见 Ajax 模式
    Web2.0岁月:使用AJAX技术的十大理由
    AJAX的安全性及AJAX安全隐患
  • 原文地址:https://www.cnblogs.com/feizianquan/p/14769181.html
Copyright © 2011-2022 走看看