《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写汇编的话.我 ...
随机推荐
- Windows Forms 对话框篇
1,标准对话框 Windows内置的对话框,又叫公用对话框,它们作为组件提供的,并且存在于System.Windows.Forms命名空间中. 手工方式: private void button1_C ...
- iOS_02_第一个C语言程序(理解编译、连接、运行)
一.开发工具的选择 1. 可以用来写代码的工具:记事本.ULtraEdit.Vim.Xcode等. 2. 选择XCode的原因:苹果公司官方提供的开发利器.简化开发的工程.有高亮显示功能. 3. 使用 ...
- 1.Python字符编码
1.编码简介 编码的种类情况 ASCII 占1个字节,只支持英文 GB2312 占2个字节,支持6700+汉字 GBK GB2312的升级版,支持21000+汉字 ks_c_5601-1987 韩国编 ...
- POJ 2236 Wireless Network ||POJ 1703 Find them, Catch them 并查集
POJ 2236 Wireless Network http://poj.org/problem?id=2236 题目大意: 给你N台损坏的电脑坐标,这些电脑只能与不超过距离d的电脑通信,但如果x和y ...
- (转) centos安装oracle11.2 pdksh软件包的说明
对于pdksh软件包,可从以下URL下载:ftp://fr2.rpmfind.net/linux/PLD/dists/ac/ready/i686/pdksh-5.2.14-33.i686.rpm由于该 ...
- Hamming correct
从数的最左边开始,并标记为1 将2的平方的位置留出来,做为校验位例如,8位2进制数10011010===>_ _ 1 _ 0 0 1 _ 1 0 1 0 位置1用来校验最右边的位位1的位置1 3 ...
- jtag引脚
如果不能下载,可能原因也许是电量不足了... 在电力不足的时候,仿真也不能进行... ///////////////////////////////////////////////////////// ...
- ubuntu 14 编译视频第三方库ijkplayer,能够在winows下使用
1.先安装相关环境,详细在这里http://blog.163.com/zhuowr2006@126/blog/static/98334653201612310647799/ 依据上面那个安装之后,会 ...
- 通过WPF中UserControl内的按钮点击关闭父窗体
原文:通过WPF中UserControl内的按钮点击关闭父窗体 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article ...
- 【例题3-6 UVA - 1584】Circular Sequence
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 不用真的把每一位都取出来. 用一个后缀的思想. 把原串复制一遍接在后面,然后把每个字符串 都当成一个长度为n的后缀就好了. 比较每个 ...