保护模式编程<五>

原创 2004年05月19日 22:31:00

ea20       macro                   ;//打开A20地址线

                push    ax

                in      al,92h

                or      al,00000010b

                out     92h,al

                pop     ax

                endm

;----------------------------------------------------------------------------

;关闭A20地址线

;----------------------------------------------------------------------------

da20      macro

                push    ax

                in      al,92h

                and     al,11111101b

                out     92h,al

                pop     ax              

endm

;----------------------------------------------------------------------------

jump       macro selector,offsetv              ;//跳转宏

      db 0EAh

      dw offsetv

      dw selector

 endm

;--------------------

call16      macro selector,offsetv

      db 9Ah

      dw offsetv

      dw selector

endm

;----------------------

descriptor struc                       ;//描述符的结构

limitl dw 0

basel dw 0

basem db 0

attributes dw 0

baseh db 0

descriptor ends

;-----------------------------------------------------------------------------

gate struc

offsetl dw 0

selector dw 0

dcount db 0

gtype db 0

offseth dw 0

gate ends

;--------------------

pdesc struc      ;//伪描述府

limit dw 0

base dd 0

pdesc ends

;

atdw=92h

atce=98h

atcer=9ah

atldt=82h  ;局部描述符表段类型值

TIL=04H

at386tss=89h

at386cgate=8ch ;386调用门类型值

dpl1 = 20h

dpl2 = 40h

dpl3 = 60h

rpl1 = 01h

rpl2 = 02h

rpl3 = 03h             ;;;;;;;;;;;;;                                                                      

                                   .386P

gdtseg segment  use16

gdt label byte

dummy descriptor <>

;

code    descriptor      <0FFFFh,,,atce,>

code_sel=code-gdt

;代码段codekseg的描述符

codek descriptor <0FFFFh,,,atce,>

codek_sel=codek-gdt

;通用描述符

normal descriptor <0FFFFh,,,atdw,>

normal_sel=normal-gdt

;

tss descriptor <0FFFFh,,,at386tss,>

tss_sel=tss-gdt

;局部描述表的描述符

ldtable descriptor <0FFFFh,,,atldt,>

ldt_sel=ldtable-gdt

gdtlen=$-gdt

vgdtr pdesc  <gdtlen-1,>

gdtseg ends

;------------------------------------------------------------------

;局部描述表

ldtseg segment  use16

ldt label byte

;数据段ldtseg的描述符

data descriptor <0FFFFh,,,atdw,>         

data_sel=(data-ldt)+TIL 

;代码段vcode的描述符

vcode descriptor <0FFFFh,,,atce+dpl3,>       

vcode_sel=(vcode-ldt)+TIL+rpl3 

;要显示的数据

vdata descriptor <0FFFFh,,,atdw+dpl3,>

vdata_sel=(vdata-ldt)+TIL+rpl3

;要显示的数据2

vdata1 descriptor <0FFFFh,,,atdw+dpl3,>

vdata1_sel=(vdata1-ldt)+TIL+rpl3

; 

vbuf    descriptor      <0FFFFh,8000h,0bh,atdw+dpl3,>

vbuf_sel=(vbuf-ldt)+TIL+rpl3 

;

stack0t descriptor <0FFFFh,,,atdw,>

stack0t_sel=(stack0t-ldt)+TIL

;

stack3t descriptor <0FFFFh,,,atdw+dpl3,>

stack3t_sel=(stack3t-ldt)+TIL+rpl3

tovbuf gate  <tojump,codek_sel,0,at386cgate+dpl3,0>  ;;;;;;;;;;;;;;;;;;;    

tovbuf_sel=(tovbuf-ldt)+TIL

ldtseg ends          

;----------------------------------------------------

tssseg segment  use16

 dd        0   ;back

 dw        stack0len,0   ;0级堆栈指针

 dw        stack0t_sel,0   ;初始化

 dw        0,0   ;1级堆栈指针

 dw      0,0   ;初始化

 dd        ?   ;2级堆栈指针

 dw      ?,0   ;未初始化

 dd        0   ;cr3

 dd        ?   ;eip

 dd        ?   ;eflags

 dd        ?   ;eax

 dd        ?   ;ecx

 dd        ?   ;edx

 dd        ?   ;ebx

 dd        ?   ;esp

 dd        ?   ;ebp

 dd        ?   ;esi

 dd        ?   ;edi

 dw        ?,0   ;es

 dw        ?,0   ;cs

 dw        ?,0   ;ss

 dw        ?,0   ;ds

 dw        ?,0   ;fs

 dw        ?,0   ;gs

 dw        ldt_sel,0   ;ldt

 dw       0

 dw        $+2   ;指向I/O许可位图

 db        0FFh   ;I/o许可位图结束标志

tssseg ends

;

stack0 segment

stack0len=512

      db stack0len dup (0)

stack0 ends

;

stack3 segment

stack3len=512

      db stack3len dup  (0)

stack3 ends

;----------------------------------------------------

vdseg   segment use16

yang    db      'how are you',0

vdseg   ends

;-----------------------------------------------------

vdseg1  segment use16

hello   db      'hello',0

hellolen=$-hello

vdseg1  ends

;-----------------------------------------------------

vcseg   segment use16  

        assume  cs:vcseg

vstart: mov     ax,vdata_sel

        mov     ds,ax

        mov     ax,vbuf_sel

        mov     es,ax

        lea     si,yang

        xor     bx,bx

        mov     cx,11

again:  mov     al,[si]

        mov     ah,87h

        mov     es:[bx],ax

        add     bx,2

        inc     si

        loop    again

        ;hello

        mov     ax,vdata1_sel

        mov     ds,ax

        lea     si,hello

        mov     cx,hellolen

again1: mov     al,[si]

        mov     ah,0F4h

        mov     es:[bx],ax

        add     bx,2

        inc     si

        loop    again1

  call16 tovbuf_sel,0

vcseg   ends

;---------------------------------

codekseg segment  use16              ;这段代码实现了从0级到3级的转换。很关键的呀!!!!

 assume cs:codekseg                  ;

startk: mov ax,tss_sel

      ltr ax

      mov ax,ldt_sel

      lldt ax

      mov ax,stack0t_sel               ;

      mov ss,ax                            ;     

      mov esp,stack0len                ;建立0级堆栈

      push word ptr stack3t_sel    ;压如3级堆栈的指针。

      push word ptr stack3len

      push word ptr vcode_sel     ;压入入口地址      

      push offset vstart

      retf                                    ;实现0级到3级的转变

tojump: jump <code_sel>,<offset toreal>

codekseg ends

;????????????????????;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

cseg segment  use16

 assume cs:cseg,ds:gdtseg

start:      mov ax,gdtseg

      mov ds,ax

      mov bx,16

      mul bx

      add ax,offset gdt

      adc dx,0

      mov word ptr vgdtr.base,ax

      mov word ptr vgdtr.base+2,dx

 ;

      mov ax,cseg

      mul bx

      mov word ptr code.basel,ax

      mov byte ptr code.basem,dl

      mov byte ptr code.baseh,dh

      ;

      mov ax,codekseg

       mul bx

      mov word ptr codek.basel,ax

      mov byte ptr codek.basem,dl

      mov byte ptr codek.baseh,dh

      ;

      mov ax,ldtseg

      mul bx

      mov word ptr ldtable.basel,ax

      mov byte ptr ldtable.basem,dl

      mov byte ptr ldtable.baseh,dh

      ;

      mov ax,tssseg

      mul bx

      mov word ptr tss.basel,ax

      mov byte ptr tss.basem,dl

      mov byte ptr tss.baseh,dh

      ;

      push ds

      assume ds:ldtseg

      mov ax,ldtseg

      mov ds,ax

 

      mov ax,vdseg

      mul bx

      mov word ptr vdata.basel,ax

      mov byte ptr vdata.basem,dl

      mov byte ptr vdata.baseh,dh

      ;

      mov ax,vdseg1

      mul bx

      mov word ptr vdata1.basel,ax

      mov byte ptr vdata1.basem,dl

      mov byte ptr vdata1.baseh,dh

      ;

      mov ax,vcseg

      mul bx

      mov word ptr vcode.basel,ax                     ;;;;;;;;;;;;;;;;

      mov byte ptr vcode.basem,dl                     ;;;;;;;;;;;;;;;;

      mov byte ptr vcode.baseh,dh                     ;;;;;;;;;;;;;;;;

      ;

      pop ds

      assume ds:gdtseg

      lgdt qword ptr vgdtr

      cli

      mov eax,cr0

      or ax,1

      mov cr0,eax

      jump <codek_sel>,<offset startk>

 

toreal: mov ax,normal_sel

      mov ds,ax

      mov eax,cr0

      and eax,0FFFFFFFEH

      mov cr0,eax

      jump <seg real>,<offset real>

real: da20

      sti

      mov ah,4ch

      int 21h

cseg ends

 end start

 

保护模式下的编程<一>

                                         保护模式下的编程一>       本文介绍如何在保护模式下编程.虽然这种技术在现在的环境中很难用到,但是如果你想写操作...
  • ywchen2000
  • ywchen2000
  • 2004年04月07日 14:16
  • 1793

linux内核 80x86保护模式及其编程

这一章涉及intel8086系列cpu的保护模式编程,应该是学习内核编程,驱动编程及嵌入式编程一些基础知识。不过对于没接触过底层编程的我来说,感觉还是好复杂。   不过里面也有许多以前汇编学过的东西...
  • yishuige
  • yishuige
  • 2015年12月30日 15:06
  • 868

【学习】【保护模式编程、五】

[386分页机制]  一、 页 页也就是指内存中的一块区域,在80386中页的大小是4KB,这个是可以计算出来的(线性地址的低12位0FFFh 是页的最大偏移。所以4KB是也页的最大界限)。 在Pen...
  • zhusongdong
  • zhusongdong
  • 2009年12月27日 15:18
  • 468

保护模式编程

随着80386微处理器体系结构的重大变化,它的指令系统也得到了增强和补充,x86的发展进入了保护模式阶段。首先,介绍一下新增加的一些指令: 一、新增高级语言指令 1. PUSHA/POPA...
  • yunsongice
  • yunsongice
  • 2010年10月06日 23:29
  • 1623

保护模式编程初始化

8086可以工作在几种模式下,当机器上电或者硬件复位时,处理器工作在8086处理器兼容的实地址模式下,并且物理地址从0XFFFFFFF0处开始执行软件初始化代码。 软件初始化代码必须设置基本系统功能...
  • zhb_51666
  • zhb_51666
  • 2016年01月13日 19:45
  • 293

保护模式编程——保护的详尽意义:通过调用门转移特权级

保护模式及其编程——保护机制 摘要:在汇编语言的编程和操作系统的编写过程中,我们经常能听说到“保护模式”这个名词。为什么要叫“保护模式”呢?保护 二字的含义何在?本文主要探讨,“保护模式”下面各种具体...
  • trochiluses
  • trochiluses
  • 2014年02月20日 22:14
  • 2988

五猴分桃问题代码

问题:*五只猴子一起摘了一堆桃子,因为太累,决定先睡一觉再分。 *过了不知多久,来了一只猴子,它见别的猴子没来,便将一堆桃子平均分成 5 份,结果*多了一个,就将多的这个吃了,拿走其中的一堆。 *...
  • fyyaom
  • fyyaom
  • 2011年04月15日 22:36
  • 315

汇编学习笔记之实模式/保护模式区别

2.1 模式种类     从80386开始,cpu有三种工作方式:实模式,保护模式和虚拟8086模式。只有在刚刚启动的时候是real-mode,等到linux操作系统运行起来以后就运行在保护模式。  ...
  • u012151242
  • u012151242
  • 2016年03月01日 10:35
  • 940

保护模式——从分段到分页

保护模式——从分段到分页    其实很早以前就想写这个关于分页模式的了,可是自己还是有点东西没弄的太明白,今天也是终于写出来了,关于上一篇讲分段机制的,一博友还夸了我一下,另我有点...
  • haiross
  • haiross
  • 2016年03月28日 09:58
  • 885

进入保护模式总结

1.最主要的就是那个jmp dword,一切都是为了Jmp做准备 2.int 13h读取扇区,既可以读硬盘,又可以读软盘,应该是两个的驱动器号不同(这个还没搞清楚,现在只会读软盘)。用硬盘映像的时候...
  • A1157599735
  • A1157599735
  • 2012年10月01日 15:21
  • 780
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:保护模式编程<五>
举报原因:
原因补充:

(最多只允许输入30个字)