【OS学习笔记】十八 保护模式五:保户模式下如何进行内存保护 与 别名段的意义与作用 对应汇编代码
发布日期:2021-07-01 00:05:41 浏览次数:2 分类:技术文章

本文共 3702 字,大约阅读时间需要 12 分钟。

本片文章是上一篇文章:对应的汇编代码。可以学习上一篇文章后再来对照查看汇编代码。或者查阅书籍《X86汇编语言-从实模式到保护模式》第12章内容来学习。

;代码清单12-1         ;文件名:c12_mbr.asm         ;文件说明:硬盘主引导扇区代码                   ;设置堆栈段和栈指针          mov eax,cs               mov ss,eax         mov sp,0x7c00               ;计算GDT所在的逻辑段地址         mov eax,[cs:pgdt+0x7c00+0x02]      ;GDT的32位线性基地址          xor edx,edx         mov ebx,16         div ebx                            ;分解成16位逻辑地址          mov ds,eax                         ;令DS指向该段以进行操作         mov ebx,edx                        ;段内起始偏移地址          ;创建0#描述符,它是空描述符,这是处理器的要求         mov dword [ebx+0x00],0x00000000         mov dword [ebx+0x04],0x00000000           ;创建1#描述符,这是一个数据段,对应0~4GB的线性地址空间         mov dword [ebx+0x08],0x0000ffff    ;基地址为0,段界限为0xfffff         mov dword [ebx+0x0c],0x00cf9200    ;粒度为4KB,存储器段描述符          ;创建保护模式下初始代码段描述符         mov dword [ebx+0x10],0x7c0001ff    ;基地址为0x00007c00,512字节          mov dword [ebx+0x14],0x00409800    ;粒度为1个字节,代码段描述符          ;创建以上代码段的别名描述符         mov dword [ebx+0x18],0x7c0001ff    ;基地址为0x00007c00,512字节         mov dword [ebx+0x1c],0x00409200    ;粒度为1个字节,数据段描述符									 ;创建保护模式下的栈段	         mov dword [ebx+0x20],0x7c00fffe    ;基地址为0x00007c00,段界限为0xFFFFF         mov dword [ebx+0x24],0x00cf9600    ;粒度为4KB,栈段描述符                  ;初始化描述符表寄存器GDTR         mov word [cs: pgdt+0x7c00],39      ;描述符表的界限             lgdt [cs: pgdt+0x7c00]               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位偏移                                                      [bits 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 [es:0x0b8000],0x072e0750 ;字符'P'、'.'及其显示属性         mov dword [es:0x0b8004],0x072e074d ;字符'M'、'.'及其显示属性         mov dword [es:0x0b8008],0x07200720 ;两个空白字符及其显示属性         mov dword [es:0x0b800c],0x076b076f ;字符'o'、'k'及其显示属性         ;开始冒泡排序          mov ecx,pgdt-string-1              ;遍历次数=串长度-1   @@1:         push ecx                           ;32位模式下的loop使用ecx          xor bx,bx                          ;32位模式下,偏移量可以是16位,也可以   @@2:                                      ;是后面的32位          mov ax,[string+bx]          cmp ah,al                          ;ah中存放的是源字的高字节          jge @@3          xchg al,ah          mov [string+bx],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,[string+ebx]         mov [es:0xb80a0+ebx*2],ax          ;演示0~4GB寻址。         inc ebx         loop @@4               hlt ;-------------------------------------------------------------------------------     string           db 's0ke4or92xap3fv8giuzjcy5l1m7hd6bnqtw.';-------------------------------------------------------------------------------     pgdt             dw 0                      dd 0x00007e00      ;GDT的物理地址;-------------------------------------------------------------------------------                                  times 510-($-$$) db 0                      db 0x55,0xaa

转载地址:https://lyy-0217.blog.csdn.net/article/details/84982926 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【软件开发底层知识修炼】十二 C/C++语言中内嵌汇编语言(asm)
下一篇:【软件开发底层知识修炼】十一 链接器-链接脚本

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年05月03日 20时40分18秒