《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写汇编的话.我 ...
随机推荐
- linux下pthread_cancel无法取消线程的原因
一个线程能够调用pthread_cancel终止同一进程中的还有一个线程,可是值得强调的是:同一进程的线程间,pthread_cancel向还有一线程发终止信号.系统并不会立即关闭被取消线程,仅仅有在 ...
- 中英文对照 —— 标点符号(punctuation)
有限的几个: What Are the Fourteen Punctuation Marks in English Grammar? period:句号:comma:逗号:冒号:colon:分号:se ...
- SpringMVC响应Ajax请求(@Responsebody注解返回页面)
项目需求描述:page1中的ajax请求Controller,Controller负责将service返回的数据填充到page2中,并将page2整个页面返回到page1中ajax的回调函数. 一句话 ...
- mysql常见故障诊断
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010230971/article/details/80335578 作为故障预警,应该尽量把问题扼 ...
- AE中Shapefile文件添加到SDE数据集
linder_lee 原文 AE中Shapefile文件添加到SDE数据集(c#) 主要完成用C#,通过AE将本地Shapefile文件导入到SDE的指定数据集下面. 首先说下思路: (1) 通过Op ...
- Visual Studio中你所不知道的智能感知
在Visual Studio中的智能感知,相信大家都用过.summary,param,returns这几个相信很多人都用过的吧.那么field,value等等这些呢. 首先在Visual Studio ...
- HDU 1407 测试你是否和LTC水平一样高 枚举、二分、hash
http://acm.hdu.edu.cn/showproblem.php?pid=1407 计算方程x^2+y^2+z^2= num的一个正整数解.num为不大于10000的正整数 思路: 方法一. ...
- Android屏幕信息获取
Android中有时需要获取屏幕的size信息以便对控件位置进行动态控制,最近做了一些研究,现在将获取屏幕大小信息的方法总结如下,可能存在一些地方理解的不全面. 1.getMetrics Displa ...
- Havel-Hakimi定理 hdu2454 / poj1695 Havel-Hakimi定理
Havel-Hakimi定理 当年一度热门出如今ACM赛场上的算法. 算法定义: Havel-Hakimi定理主要用来判定一个给定的序列是否是可图的. 2.首先介绍一下度序列:若把图 G 全部顶点的度 ...
- Hadoop配置文件 分类: A1_HADOOP 2014-08-19 12:48 1157人阅读 评论(1) 收藏
部分内容参考:http://www.linuxqq.net/archives/964.html http://slaytanic.blog.51cto.com/2057708/1100974/ ha ...