保护模式下的编程<三>

原创 2004年04月12日 12:46:00

在上一节我们讲了GDT的用法,这一节我要讲讲LDT的用法,呵呵.以下是源代码:

;--------------------------------------------------------<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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

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

descriptor       struc                       ;//描述符的结构

limitl       dw   0

basel       dw   0

basem     db    0

attributes dw   0

baseh      db    0

descriptor       ends

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

pdesc      struc                              ;//伪描述府   

limit dw   0

base dd    0

pdesc      ends

;

atdw=92h

atce=98h

atcer=9ah

atldt=82h

TIL=04H

                            .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

;局部描述表的描述符

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,>           

vcode_sel=(vcode-ldt)+TIL          

;要显示的数据

vdata       descriptor       <0FFFFh,,,atdw,>

vdata_sel=(vdata-ldt)+TIL

;要显示的数据2

vdata1       descriptor       <0FFFFh,,,atdw,>

vdata1_sel=(vdata1-ldt)+TIL

;            

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

vbuf_sel=(vbuf-ldt)+TIL  

ldtseg      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

gojump: jump    <code_sel>,<offset toreal>

vcseg   ends

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

codekseg       segment         use16

       assume       cs:codekseg

startk:     mov       ax,ldt_sel

       lldt   ax

       jump       <vcode_sel>,<offset vstart>

 

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

       ;

       push       ds

      

       mov       ax,ldtseg

       mov ds,ax

       assume       ds:ldtseg

      

       mov     ax,vcseg

        mul     bx

        mov     word    ptr     vcode.basel,ax

        mov     byte    ptr     vcode.basem,dl

        mov     byte    ptr     vcode.baseh,dh

        ;

        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

        pop       ds

        ;

        assume       ds:gdtseg

        lgdt    qword   ptr     vgdtr

       cli

       ea20                                     ; //

       mov       eax,cr0                         ; //    进入保护模式

       or    eax,1                            ; //      

       mov       cr0,eax                           ;//

       jump       <codek_sel>,<offset startk>      ; //  proctect mode

      

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

       这段代码,我们可以用前面的图来表示.要用LDT,我们需要用到mov       ax,gdtseg ,lldt    ax这两个命令是把全局描述表送入局部描述表寄存器.在执行玩这两个命令后,我们就可以使用局部描述符中的描述表所指向的段了.呵呵.

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

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

保护模式下的内存访问

保护模式下的内存访问模式、方法,而这个保护模式下的内存访问模式在实模式与保护模式已经介绍过是什么,这次来具体点看...
  • name_z
  • name_z
  • 2015年08月09日 16:33
  • 771

保护模式下的编程<一>

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

保护模式下的逻辑地址,线性地址,物理地址

IA32保护模式中,逻辑地址=16位段选择子:32位偏移地址,具体的值应该是指令经过编译/汇编产生的,如果是应用编程的话,编译/汇编只产生偏移地址,段选择子的值由系统分配。在寻址时,16位段选择子位于...
  • matwat
  • matwat
  • 2009年02月22日 22:08
  • 1795

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

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

保护模式下的段寄存器值转化为线性地址过程

关键字: 段寄存器、段选择子、全局描述符表、局部描述符表、段描述符、线性地址;     保护模式下使用段机制的CS,SS,DS,ESt,FS,GS保存的并不是实模式下的段地址,而是一个包含了段选择...
  • eagleatustb
  • eagleatustb
  • 2013年07月23日 14:55
  • 2425

实模式及保护模式下的地址转换

本文转自http://blog.csdn.net/wukaiyu/article/details/1766804在此向作者表示感谢。 一。x86实模式介绍 x86体系的处理器刚开始时只有20根地址...
  • hncomputer
  • hncomputer
  • 2011年12月05日 18:29
  • 1816

我看保护模式

保护模式,对于学过操作系统的人来说,是一个熟悉而又陌生的概念。之所以熟悉,就是所有的操作系统的书籍都会说到保护模式;之所以陌生,我敢说很多人学完了之后,压根不晓得什么是保护模式,怎么算是保护模式,再者...
  • xiao_0429
  • xiao_0429
  • 2015年08月02日 16:01
  • 3988

进入保护模式-汇编学习之路

在实模式下由于对内存的保护不是特别的完善,一个段可以任意访问访问不是该段范围内的内存。例如以下一个小例子 mov cx,0x8000 push ds mov ds,cx mov [0x05],...
  • qq_26585931
  • qq_26585931
  • 2017年02月14日 14:26
  • 433

保护模式下寻址

 保护模式下寻址 刺猬@http://blog.csdn.net/littlehedgehog 网上看到的一强帖,不转不行了,牛人啊,把这段代码拿捏的相当到位 括号中是我的加注 段机制轻松体验[内存寻...
  • littlehedgehog
  • littlehedgehog
  • 2008年02月13日 10:18
  • 8960
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:保护模式下的编程<三>
举报原因:
原因补充:

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