保护模式下的编程<二>

本文重点介绍控制寄存器CR0,其第一位控制分段,31位控制分页。通过汇编代码示例展示实模式和保护模式的切换,在实模式下输出字符B,保护模式下输出字符A,还给出了描述符结构、全局描述符表等代码,最后分享了学习心得。

控制寄存器:

       控制寄存器有CR0 CR1 CR2 CR3,其中CR1是保留的,在这里我重点介绍CR0,应为他跟分段和分页都有重要的联系,CR2CR3不做介绍.

    控制寄存器的CR0的第一位用PE表示,他是用来控制分段的,PE=0,处理器运行在实方式下,PE=1,处理器运行在保护模式.在我门下面的代码中我将会设置CR0PE,进入保护模式.CR031,是用来控制分页的.PG表示.PG=0时候禁用分页机制,PG=1时候启用分页机制.  

下面我门来看看几个例子.

实模式和保护模式的切换

在实模式下输出一个B,在保护模式下输出一个A

ea20       macro

                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               ;A20详见 http://www.xemean.net/data/article.asp?id=8

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                                                        ; 存在可执行可读写的代码段类型

                                                        .386P

dseg    segment   use16 

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

gdt   label byte                                                         ;全局描述符表

dummy   descriptor       <>

code    descriptor      <0FFFFh,,,atce,>                    ;代码段描述符     

code_sel=code-gdt                                                  ;选择子  

data    descriptor      <0FFFFh,,,atdw,>              ;数据段描述符

data_sel=data-gdt                                                    ;对应的选择子     

;注意:代码段又代码段的属性,数据段又数据段的属性.不要混淆否则无法正常运行

vcode   descriptor      <0FFFFh,,,atce,>              ;显示字符A的代码段描述符

vcode_sel=vcode-gdt                                               ;对应选择子

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

vbuf_sel=vbuf-gdt

normal  descriptor      <0FFFFh,,,atdw,>             ;描述符

normal_sel=normal-gdt                                            ;选择子

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

gdtlen=$-gdt

;

vgdtr       pdesc             <gdtlen-1,>    

dseg ends

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

;代码段

vcseg   segment use16    'vcode'

        assume  cs:vcseg

vstart: mov     ax,0B800h                                                   ;直接写屏,输出A

        mov     ds,ax                   

        mov     bx,0

        mov     al,'A'

        mov     ah,07h

        mov     [bx],ax

        jump    <code_sel>,<offset toreal>

vcseg   ends

        end     vstart

 

cseg    segment use16    'code'                                         ;实模式

       assume    cs:cseg,ds:dseg                   

start:  

    mov     ax,dseg

       mov ds,ax

       mov bx,16                                                       ;*16转化成32

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

       mul  bx

        mov     word    ptr     data.basel,ax

        mov     byte    ptr     data.basem,dl

        mov     byte    ptr     data.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

       ;

              lgdt  qword     ptr   vgdtr              ;将伪描述符导入到GDTR,很重要的一步 

       cli

    ea20                             ;打开A20是能够寻址4G的空间.

       mov eax,cr0                                                     ;设置CR0,进入保护模式

       or    eax,1                                                        ;CR0设置为1进入保护模式

       mov cr0,eax

    jump    <vcode_sel>,<offset vstart>     ;跳转到显示字符A的代码段

toreal:

    mov     ax,normal_sel

       mov ds,ax

       mov eax,cr0                                                     ;设置CR0,进入保护实模式 

       and  eax,0FFFFFFFEH                                     ;CR0设置为0,返回到实模式

       mov cr0,eax

jump    <seg real>,<offset real>

real: 

       da20

    sti

    mov  ax,dseg                                           ;显示字符B

    mov ds,ax

    mov  dl,'B'

    mov  ah,2

    int  21h

    mov  ah,4Ch

    int    21h

cseg ends

       end  start

上面就是一个很简单的实模式和保护模式相互转换的例子,不过我也发了很长时间才明白的.这些都是我的一些心得,如有不正确的希望大家斧正.最后感谢优快云汇编板块的csdsjkk() 指点.

 

 

 

 

参考资料:杨季文主编的<<80X86汇编语言程序设计教材>>

 

 

 

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值