博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【OS学习笔记】十六 保护模式四:进入保护模式与在保护模式下访问内存的汇编代码
阅读量:1997 次
发布时间:2019-04-28

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

本文记录的是之前四篇文章所对应的汇编代码。四篇文章分别是:

按照顺序将上述四篇文章对应的内容学完,方能看懂本篇文章的汇编代码。

更加详细的介绍请参考数据《X86汇编语言-从实模式到保护模式》第11章内容。

代码如下:

;代码清单11-1         ;文件名:c11_mbr.asm         ;文件说明:硬盘主引导扇区代码          ;         ;设置堆栈段和栈指针          mov ax,cs               mov ss,ax         mov sp,0x7c00               ;计算GDT所在的逻辑段地址          mov ax,[cs:gdt_base+0x7c00]        ;低16位          mov dx,[cs:gdt_base+0x7c00+0x02]   ;高16位          mov bx,16                 div bx                     mov ds,ax                          ;令DS指向该段以进行操作         mov bx,dx                          ;段内起始偏移地址                ;创建0#描述符(描述符是8字节的),它是空描述符,这是处理器的要求         mov dword [bx+0x00],0x00         mov dword [bx+0x04],0x00           ;创建#1描述符,保护模式下的代码段描述符         mov dword [bx+0x08],0x7c0001ff              mov dword [bx+0x0c],0x00409800              ;创建#2描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区)          mov dword [bx+0x10],0x8000ffff              mov dword [bx+0x14],0x0040920b              ;创建#3描述符,保护模式下的堆栈段描述符         mov dword [bx+0x18],0x00007a00         mov dword [bx+0x1c],0x00409600         ;初始化描述符表寄存器GDTR         mov word [cs: gdt_size+0x7c00],31  ;描述符表的界限(总字节数减一) 因为一共4个段(代码段数据段栈段与空段)                                                        lgdt [cs: gdt_size+0x7c00]				  ;从gdt_size读取6字节的话,就包括了4字节的段线性地址和2字节的偏移地址               in al,0x92                         ;南桥芯片内的端口          or al,0000_0010B         out 0x92,al                        ;打开A20         cli                                ;保护模式下中断机制尚未建立,应                                             ;先禁止中断          mov eax,cr0         or eax,1         mov cr0,eax                        ;设置PE位,直接导致处理器的运行进入保护模式               ;以下进入保护模式... ...         jmp dword 0x0008:flush             ;16位的描述符选择子:32位偏移                                            ;清流水线,并串行化处理器          [bits 32]     flush:         mov cx,00000000000_10_000B         ;加载数据段选择子(0x10)         mov ds,cx         ;以下在屏幕上显示"Protect mode OK."          mov byte [0x00],'P'           mov byte [0x02],'r'         mov byte [0x04],'o'         mov byte [0x06],'t'         mov byte [0x08],'e'         mov byte [0x0a],'c'         mov byte [0x0c],'t'         mov byte [0x0e],' '         mov byte [0x10],'m'         mov byte [0x12],'o'         mov byte [0x14],'d'         mov byte [0x16],'e'         mov byte [0x18],' '         mov byte [0x1a],'O'         mov byte [0x1c],'K'         ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作          mov cx,00000000000_11_000B         ;加载堆栈段选择子         mov ss,cx         mov esp,0x7c00         mov ebp,esp                        ;保存堆栈指针          push byte '.'                      ;压入立即数(字节)                  sub ebp,4         cmp ebp,esp                        ;判断压入立即数时,ESP是否减4          jnz ghalt                                   pop eax         mov [0x1e],al                      ;显示句点         ghalt:              hlt                                ;已经禁止中断,将不会被唤醒 ;-------------------------------------------------------------------------------              gdt_size         dw 0         gdt_base         dd 0x00007e00     ;GDT的物理地址 在主引导扇区之后                                      times 510-($-$$) db 0                          db 0x55,0xaa

笔记记得不是很全,如果有不懂的可以加我联系方式一起交流。

学习探讨加个人:

qq:1126137994
微信:liu1126137994

转载地址:http://obytf.baihongyu.com/

你可能感兴趣的文章
xss-labs详解(上)1-10
查看>>
xss-labs详解(下)11-20
查看>>
攻防世界web进阶区ics-04详解
查看>>
sql注入总结学习
查看>>
Python 之 histogram直方图
查看>>
Python实现决策树 Desision Tree & 可视化
查看>>
决策树 Decision tree
查看>>
欧拉角(Euler angle) & 万向节死锁(Gimbal Lock) & 四元数(Quaternion)
查看>>
MATLAB与CUDA
查看>>
Linux png转jpg (convert命令)
查看>>
Ubuntu更新后终端中字体的颜色全是白色
查看>>
vscode git
查看>>
基于MATLAB的二进制数字调制与解调信号的仿真——2PSK
查看>>
基于MATLAB的模拟调制信号与解调的仿真——DSB
查看>>
HDU - 1166 敌兵布阵 (树状数组模板题/线段树模板题)
查看>>
CodeForces - 456C Boredom (dp)
查看>>
CodeForces - 675A Infinite Sequence(简单数论 细节)
查看>>
CodeForces - 1042B Vitamins (思维)
查看>>
ACM 2013 长沙区域赛 Collision (几何)
查看>>
CodeForces - 1064B Equations of Mathematical Magic(打表找规律)
查看>>