《80x86汇编语言程序设计》保护模式第一个例题
《80x86汇编语言程序设计》保护模式第一个例题的一些个人理解和注视
- ; 16位偏移的段间直接转移指令的宏定义
- jump macro selector, offsetv
- db 0eah ; jmp far 的操作码
- dw offsetv
- dw selector
- endm
- ; 字符显示宏指令定义
- echoch macro ascii
- mov ah, 2
- mov dl, ascii
- int 21h
- endm
- ; 存储段描述符结构类型的定义
- descriptor struc
- limitl dw 0 ; 段界限低16位
- basel dw 0 ; 基地址低16位
- basem db 0 ; 基地址中8位
- attributes dw 0 ; 段属性,包含段界限高4位
- baseh db 0 ; 基地址高8位
- descriptor ends
- ; 伪描述符结构类型的定义
- pdesc struc
- limit dw 0 ; 16位段界限
- base dd 0 ; 32位基地址
- pdesc ends
- ; 常量定义
- atdw = 92h ; 存在的可读写数据段属性值
- atce = 98h ; 存在的只执行代码段属性值
- .386p
- ; 数据段
- dseg segment use16
- gdt label byte ; 全局描述符表GDT
- dummy descriptor <> ; 空描述符
- code descriptor <0ffffh, , , atce, >
- code_sel = code - gdt ; 代码段描述的选择子
- datas descriptor <0ffffh, 0h, 11h, atdw, 0>
- datas_sel = datas - gdt ; 源数据段描述符的选择子
- datad descriptor <0ffffh, , , atdw, >
- datad_sel = datad - gdt ; 目标数据段描述符的选择子
- gdtlen = $ - gdt
- vgdtr pdesc <gdtlen - 1, > ; 伪描述符
- bufferlen = 256 ; 缓冲区字节长度
- buffer db bufferlen dup (0) ; 缓冲区
- dseg ends
- ; 代码段
- cseg segment use16
- assume cs:cseg, ds:dseg
- start:
- mov ax, dseg
- mov ds, ax
- ; 准备要加载到gdtr的伪描述符
- 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, cs
- mul bx
- mov code.basel, ax
- mov code.basem, dl
- mov code.baseh, dh
- ; 设置目标数据段描述符
- mov ax, ds
- mul bx
- add ax, offset buffer
- adc dx, 0
- mov datad.basel, ax
- mov datad.basem, dl
- mov datad.baseh, dh
- ; 加载gdtr
- lgdt fword ptr vgdtr
- cli
- call enablea20
- ; 切换到保护方式
- xchg bx, bx
- mov eax, cr0
- or eax, 1
- mov cr0, eax
- ; 清指令欲取队列,并真正进入保护方式
- jump <code_sel>, <offset virtual>
- virtual:
- mov ax, datas_sel
- mov ds, ax
- mov ax, datad_sel
- mov es, ax
- cld
- xor si, si
- xor di, di
- mov cx, bufferlen / 4
- repz movsd
- ; 切换回实方式
- mov eax, cr0
- and eax, 0fffffffeh
- mov cr0, eax
- ; 清指令预取队列,进入实方式
- jump <seg real>, <offset real>
- real:
- call disablea20
- sti
- mov ax, dseg
- mov ds, ax
- mov si, offset buffer
- cld
- mov bp, bufferlen / 16
- nextline:
- mov cx, 16
- nextch:
- lodsb
- push ax
- shr al, 4
- call toascii
- xchg bx, bx
- echoch al
- xchg bx, bx
- pop ax
- call toascii
- echoch al
- echoch ' '
- loop nextch
- echoch 0dh
- echoch 0ah
- dec bp
- jnz nextline
- mov ax, 4c00h
- int 21h
- toascii proc
- and al, 0fh
- add al, 30h
- cmp al, '9'
- jbe quit
- add al, 7
- quit:
- ret
- toascii endp
- enablea20 proc
- push ax
- in al, 92h
- or al, 2
- out 92h, al
- pop ax
- ret
- enablea20 endp
- disablea20 proc
- push ax
- in al, 92h
- and al, 0fdh
- out 92h, al
- pop ax
- ret
- disablea20 endp
- cseg ends
- end start
我自己以前的疑问与我自己的答案:
Q:为什么要设置GDTR?
A:应为需要他来找到GDT
Q:
- mul bx
什么意思?
A:转换为物理地址,就是段值*16
Q:
- jump <code_sel>, <offset virtual>
什么意思?
A:这条指令是在转换到保护模式之前预取到指令队列的,如果不预取,转换到保护模式后系统会把cs中的值以为是选择子,但其实他是段值,就无法执行下一条指令,也就是jmp,所以要预取这条宏,然后执行时把cs设置为选择子,刷新预取指令队列,引用:
“由此可见,执行这条jmp指令时CPU已经处于“保护方式”了(因为cr0中的PE已经被置成“保护方式”)。如果此条jmp指令如果不是在“实方式”下被预取到指令队列中,就无法执行到它,因为“cr0中的PE被置成保护方式”之后,cs中的值仍为实方式的段值,此时将当前ip加1,然后用cs:ip去取下面的这条jmp指令显然会失败,因为此时处于“保护方式”下的cpu会把cs中的内容理解为“选择子”,所以自然无法取得“紧接着的”jmp指令。”
Q:
- shr al, 4
啥意思?
A:是要显示其高4位,然后下面pop后显示低四位
Q:
- mov ax, datas_sel
什么意思?
A:datas_sel为选择子,值为8,换为二进制是1000,低三位分别是0位、1位为RPL,2位为TI,3~15位是描述符表索引,也即第一个描述符
>>>>>>>>>>>>>>>琐碎记忆>>>>>>>>>>>>>>>>>
保护方式下通过选择子的3~15位来定位在描述符表中的描述符,然后获得基地址、界限、属性
http://blog.csdn.net/programmingring/article/details/7385140
《80x86汇编语言程序设计》保护模式第一个例题的更多相关文章
- 《80x86汇编语言程序设计教程》第二章课后题答案
2.5 习题 2.1 数据寄存器 1. 八个通用寄存器除了各自规定的专门用途外,它们均可以用于传送和暂存数据,可以保存算术逻辑运算中的各种操作数和运算结果. 2.1 AX和Al寄存器又称为累加器(ac ...
- 《汇编语言程序设计》——仿windows计算器
<汇编语言程序设计> ——计算器程序设计 目录 一. 题目与目标 1. 题目 2. 学习目的 二. 分析与设计 1. 系统分析 2. ...
- Intel汇编语言程序设计学习-第一章 基本概念
第一章基本概念 1.1 简单介绍 本书着重讲述MS-Windows平台上IA-32(Intel Architecture 32bit,英特尔32位体系架构)兼容微处理器的汇编语言程序设计,可以使用I ...
- ASM:《X86汇编语言-从实模式到保护模式》第15章:任务切换
15章其实应该是和14章相辅相成的(感觉应该是作者觉得14章内容太多了然后切出来了一点).任务切换和14章的某些概念是分不开的. ★PART1:任务门与任务切换的方法 1. 任务管理程序 14章的时候 ...
- 存储器的保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记20
存储器的保护(三) 修改本章代码清单,使之可以检测1MB以上的内存空间(从地址0x0010_0000开始,不考虑高速缓存的影响).要求:对内存的读写按双字的长度进行,并在检测的同时显示已检测的内存数量 ...
- 存储器的保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记18
本文是原书第12章的学习笔记. 说句题外话,这篇博文是补写的,因为让我误删了,可恶的是CSDN的回收站里找不到! 好吧,那就再写一遍,我有坚强的意志.司马迁曰:“文王拘而演<周易>:仲尼厄 ...
- 进入保护模式(二)——《x86汇编语言:从实模式到保护模式》读书笔记14
首先来段题外话:之前我发现我贴出的代码都没有行号,给讲解带来不便.所以从现在起,我要给代码加上行号.我写博客用的这个插入代码的插件,确实不支持自动插入行号.我真的没有找到什么好方法,无奈之下,只能按照 ...
- 进入保护模式(一)——《x86汇编语言:从实模式到保护模式》读书笔记12
之前已经做了一些理论上的铺垫,这次我们就可以看代码了. 一.代码清单 ;代码清单11-1 ;文件名:c11_mbr.asm ;文件说明:硬盘主引导扇区代码 ;创建日期:2011-5-16 19:54 ...
- 《linux 内核全然剖析》 chapter 4 80x86 保护模式极其编程
80x86 保护模式极其编程 首先我不得不说.看这章真的非常纠结...看了半天.不知道这个东西能干嘛.我感觉唯一有点用的就是对于内存映射的理解...我假设不在底层给80x86写汇编的话.我 ...
随机推荐
- HTML高级标签(3)————表单的应用
在HTML开发中,标签的种类和数量非常多,不可能说每一种都研究透.非常多能够用CSS来控制的标签,我们基本没有必要在上面浪费时间.所以,我们仅仅要掌握在HTML开发中比較经常使用的标签就全然能够了. ...
- js进阶 14-2 如何用ajax验证登陆状态(这里用load方法)
js进阶 14-2 如何用ajax验证登陆状态(这里用load方法) 一.总结 一句话总结:$('#test').load('test.php?password=1234560'),这样就get方式提 ...
- JMeter--聚合报告之 90% Line 正确理解
90% Line 参数正确的含义: 虽然,我的上面理解有一定的道理,显然它(90% 用户的响应时间)是错误的.那看看JMeter 官网是怎么说的? 90% Line - 90% of the samp ...
- 使用 JS 关闭警告框及监听自定义事件(amaze ui)
使用 JS 关闭警告框及监听自定义事件(amaze ui) 一.总结 1.jquery匿名函数:第8行,jquery匿名函数,$(function(){});,有没有很简单,只是少了jquery的前面 ...
- flink DataStream API使用及原理
传统的大数据处理方式一般是批处理式的,也就是说,今天所收集的数据,我们明天再把今天收集到的数据算出来,以供大家使用,但是在很多情况下,数据的时效性对于业务的成败是非常关键的. Spark 和 Flin ...
- UVA 11178 - Morley's Theorem 向量
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- [Ramda] Declaratively Map Predicates to Object Properties Using Ramda where
Sometimes you need to filter an array of objects or perform other conditional logic based on a combi ...
- Django 学习笔记(二) 《models》
python 2.7.6 Django1.8.3 IDE eclipse+pydev Django开发的模式就是MTV(c)模式(model. template, view(urls)). 对于mod ...
- swift项目第四天:动态加载控制器
一:Appdelegate import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate ...
- Identity of indiscernibles(不可分与同一性)
不可区分的对象或者实体,全部性质都相同.也就是说,实体 x 与实体 y是同一的,如果对 x 成立的全部断言,对 y 同样成立(反之亦然). 注意区分如下的两个概念: 同一性的不可分性(The indi ...