兰陵月 发表于 2017-11-29 23:13:27

X86汇编语言-从实模式到保护模式—笔记(19)-第12章 存储器的保护(1)

本帖最后由 兰陵月 于 2017-12-5 21:53 编辑

         ;代码清单12-1
         ;文件名:c12_mbr.asm
         ;文件说明:硬盘主引导扇区代码
         ;创建日期:2011-10-27 22:52

         ;设置堆栈段和栈指针
         mov eax,cs
         mov ss,eax
         mov sp,0x7c00
      
         ;计算GDT所在的逻辑段地址
         mov eax,      ;GDT的32位线性基地址
         xor edx,edx
         mov ebx,16
         div ebx                            ;分解成16位逻辑地址

         mov ds,eax                         ;令DS指向该段以进行操作
         mov ebx,edx                        ;段内起始偏移地址

         ;创建0#描述符,它是空描述符,这是处理器的要求
         mov dword ,0x00000000
         mov dword ,0x00000000

         ;创建1#描述符,这是一个数据段,对应0~4GB的线性地址空间
         mov dword ,0x0000ffff    ;基地址为0,段界限为0xfffff
         mov dword ,0x00cf9200    ;粒度为4KB,存储器段描述符

         ;创建保护模式下初始代码段描述符
         mov dword ,0x7c0001ff    ;基地址为0x00007c00,512字节
         mov dword ,0x00409800    ;粒度为1个字节,代码段描述符

         ;创建以上代码段的别名描述符
         mov dword ,0x7c0001ff    ;基地址为0x00007c00,512字节
         mov dword ,0x00409200    ;粒度为1个字节,数据段描述符

         mov dword ,0x7c00fffe
         mov dword ,0x00cf9600
         
         ;初始化描述符表寄存器GDTR
         mov word ,39      ;描述符表的界限   

         lgdt
      
         in al,0x92                         ;南桥芯片内的端口
         or al,0000_0010B
         out 0x92,al                        ;打开A20

         cli                              ;中断机制尚未工作

         mov eax,cr0
         or eax,1
         mov cr0,eax                        ;设置PE位
      
         ;以下进入保护模式... ...
         jmp dword 0x0010:flush             ;16位的描述符选择子:32位偏移
                                             
                                 
flush:                                    
         mov eax,0x0018                     
         mov ds,eax
      
         mov eax,0x0008                     ;加载数据段(0..4GB)选择子
         mov es,eax
         mov fs,eax
         mov gs,eax
      
         mov eax,0x0020                     ;0000 0000 0010 0000
         mov ss,eax
         xor esp,esp                        ;ESP <- 0
      
         mov dword ,0x072e0750 ;字符'P'、'.'及其显示属性
         mov dword ,0x072e074d ;字符'M'、'.'及其显示属性
         mov dword ,0x07200720 ;两个空白字符及其显示属性
         mov dword ,0x076b076f ;字符'o'、'k'及其显示属性

         ;开始冒泡排序
         mov ecx,pgdt-string-1            ;遍历次数=串长度-1
@@1:
         push ecx                           ;32位模式下的loop使用ecx
         xor bx,bx                        ;32位模式下,偏移量可以是16位,也可以
@@2:                                    ;是后面的32位
         mov ax,
         cmp ah,al                        ;ah中存放的是源字的高字节
         jge @@3
         xchg al,ah
         mov ,ax
@@3:
         inc bx
         loop @@2
         pop ecx
         loop @@1
      
         mov ecx,pgdt-string
         xor ebx,ebx                        ;偏移地址是32位的情况
@@4:                                    ;32位的偏移具有更大的灵活性
         mov ah,0x07
         mov al,
         mov ,ax          ;演示0~4GB寻址。
         inc ebx
         loop @@4
      
         hlt

;-------------------------------------------------------------------------------
   string         db 's0ke4or92xap3fv8giuzjcy5l1m7hd6bnqtw.'
;-------------------------------------------------------------------------------
   pgdt             dw 0
                      dd 0x00007e00      ;GDT的物理地址
;-------------------------------------------------------------------------------                           
   times 510-($-$) db 0
                      db 0x55,0xaa
页: [1]
查看完整版本: X86汇编语言-从实模式到保护模式—笔记(19)-第12章 存储器的保护(1)