《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写汇编的话.我 ...
随机推荐
- 防止登录页面出如今frame中
在使用frame页面嵌套开发的时候,遇到重新启动了server的时候会出现登录页面在frame页面中出现, 所以须要在登录页面里面用js推断下当前的地址信息,然后跳转到登录的单独页面中. js代码例如 ...
- 并发,two
引言 为了更加形象的描述并发的基础知识,因此本文LZ采用了园子里一度大火的标题形式--"没听说过XXXX,就不要说你XXXX了".希望能够给猿友们一个醒目的警醒,借此来普及并发的基 ...
- GCJ 2009 Round 2 Problem A. Crazy Rows
https://code.google.com/codejam/contest/204113/dashboard 题目大意: 给你一个矩阵,让你转化为下三角矩阵,每次只能交换相邻的行,求最小的交换次数 ...
- 最新GitHub账号注册(详细图解)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.简介 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub. ...
- jmeter--使用badboy录制脚本
JMeter录制脚本有多种方法,其中最常见的方法是用第三方工具badboy录制,另外还有JMeter自身设置(Http代理服务器+IE浏览器设置)来录制脚本,但这种方法录制出来的脚本比较多且比较乱,个 ...
- docker安装及问题处理
1.在Ubuntu的命令行中输入 sudo apt-get install docker.io 2.如果切换到了root用户下 apt-get install docker.io 3.对于新安装的Ub ...
- mangodb学习0.1 概念
摘自菜鸟教程
- 字符的输入和输出即:getchar和putchar
#include <stdio.h> int main(int argc, const char * argv[]) { putchar(getchar());//这种方式就是输入一个字符 ...
- HDU 1287 破译密码 异或运算
http://acm.hdu.edu.cn/showproblem.php?pid=1287 题目: 有个叫"猪头帮"的国家,采用一种简单的文法加密,他们所用的语言里面只有大写字母 ...
- 【Codeforces Round #439 (Div. 2) B】The Eternal Immortality
[链接] 链接 [题意] 求b!/a!的最后一位数字 [题解] b-a>=20的话 a+1..b之间肯定有因子2和因子5 答案一定是0 否则暴力就好 [错的次数] 在这里输入错的次数 [反思] ...