win32汇编基础
win32汇编基础知识
Debug 版本|Release 版本
Debug 是“调试”的意思,Debug 版本就是为调试而生的,编译器在生成 Debug 版本的程序时会加入调试辅助信息,并且很少会进行优化,程序还是“原汁原味”的。
你没听错,不是任何一个程序都可以调试的,程序中必须包含额外的辅助信息才能调试,否则调试器也无从下手。
Release 是“发行”的意思,Release 版本就是最终交给用户的程序,编译器会使尽浑身解数对它进行优化,以提高执行效率,虽然最终的运行结果仍然是我们期望的,但底层的执行流程可能已经改变了。
编译器还会尽量降低 Release 版本的体积,把没用的数据一律剔除,包括调试信息。
最终,Release 版本是一个小巧精悍、非常纯粹、为用户而生的程序。
三种开机以后的工作模式
实模式
保护模式
虚拟8086模式
保护模式由实模式中进入
重启切换三种模式
实模式和虚拟86模式都是为了向下兼容,而保护模式是对80386的主要支持模式
Windows内存管理
DOS操作系统的内存安排

“640KB限制”---是指操作系统和系统程序只能用从500h到A0000h不到640kb的地址空间
寻址方式
DOS
由于8086中的地址线有20位,而寄存器的长度只有16位,也就是说无法直接找到一个想达到的物理地址。例如:要找寻一个2ffffh地址单元中的内容,使用一个16位寄存器最多到FFFFh,所以需要组合形成最终的线性地址(物理地址)。
DOS中的段寄存器用于组合形成物理地址,默认是对段寄存器乘以10h,(例如 SR*10h+偏移地址),从而构成20位寻址,达到遍及内存的目的
80386
80386中的通用寄存器都是32位,也就是32位,可以直接遍历到所有的内存地址单元。所以段寄存器就不需要了吗?也不是,段寄存器在80386中发挥着间接作用。看下面:
由于保护模式下的段信息需要被保存,长度为64位,被叫做段描述符(Segment Descriptor)
于是80386中的段寄存器(16位),用于索引存放在内存其他地方中的段描述符,于是在386的操作中,更多的将它叫做段选择器
80386中引入了48位的GDTR和16位的LGTR,全局DT寄存器和局部DT寄存器

- TI用于判定是GDT还是LDT,0表示在GDT中,1表示在LDT中
- RPL=》优先级

可以看到,GDT中还存有LDT的位置信息,所以如果描述符存在于LDT中的话,我们还需要先拿到LDT的基地址
分页
。。。碎片化优化,提高内存的利用率。
就是操作系统中的分页机制,现下就是细节处理
页表与映射
CR3寄存器 用于保存页目录表页面的物理地址,因此被称为PDBR。由于目录是页对齐的,所以仅高20位有效,低12 位保留供更加高级的处理器使用。向CR3中装入一个新值时,低12位必须为0;但从 CR3中取值时,低12位被忽略
为什么是高20位有效?
每页4kb,这个和win32的虚拟模式有关,想想他是怎么欺骗8086程序的?同样只有20位内存单元,但内存单元缺扩大了4k倍
想想磁盘划分时,单位内存的大小是怎么实现的?==》放弃部分地址线的使用,间隔性的扩大
线性内存与物理内存的关系?【转】 物理内存和线性空间 - neba - 博客园 (cnblogs.com)
线性地址是在针对程序员来说的,就是说理论上是如此的。
分页-分段-段页式-缺页中断
虚拟内存
每个程序都有自己4GB的寻址空间
为什么是4GB,不是8GB或者16GB呢?
这个是针对cpu最大的寻址空间来算的,也就是说如果是64位的寻址能力,其虚拟空间就是4GB*4GB了
不同应用的线性地址空间是隔离的,但物理上是处于同一个内存区
DLL程序都是被插入到主程序中执行的,所以没有自己独有的空间,当他被插入时,也就算是主程序的一部分了
特权保护
中断和异常
DOS(实模式)
DOS中使用中断向量表 int 3 >找到3号中断向量(4B)》前两个字节作为基地址,后两个地址作为偏移地址,从而获得中断入口
80386保护模式
一个中断或异常程序的信息使用8B进行存贮,于是采用中断描述符以及对应的中断描述符表(Interrupt Descriptor Table)
引入48位IDTR,高32位表示向量表的入口地址,低16位表示长度,也就是说

门的概念
就是在对高级别程序代码进行访问时,规定了访问入口
保护机制的组成
指令集的检查
1.特权指令--能改变GDTR,LDTRIDTR等关键寄存器的指令--只允许优先级0运行
2.敏感指令--操作IO端口以及CLI STI等中断允许的指令(CLI Clear Interrupt | STI Start Interrupt--eflags寄存器IOPL位高于规定的优先级即可以执行
IO处理保护
MMU 内存管理单元 https://gitlib.com/page/pc-mmu.html
win32汇编基础的更多相关文章
- Win32汇编环境配置
放假了,发现自己知识面窄,趁有时间就打算折腾下Win32汇编.其实在学校也上过汇编课,是基于dos的.那时老师不务正业,老跟我们讲政治经济文化,唯独不怎么讲课;再加上自己的问题,导致了dos汇编学得好 ...
- Win32汇编学习(1):基本概念
背景知识 Windows 把每一个 Win32 应用程序放到分开的虚拟地址空间中去运行,也就是说每一个应用程序都拥有其相互独立的 4GB 地址空间,当然这倒不是说它们都拥有 4GB 的物理地址空间,而 ...
- ASM:《X86汇编语言-从实模式到保护模式》5-7章:汇编基础
第5-7章感觉是这一本书中比较奇怪的章节,可能是作者考虑到读者人群水平的差异,故意由浅入深地讲如何在屏幕上显示字符和使用mov,jmp指令等等,但是这样讲的东西有点重复,而且看了第六,第七章以后,感觉 ...
- Win32汇编开始 Hello Asm
今天开始学习Win32汇编 因为自己很多都是Windows方面 所以 接触一下Win32汇编 . ;.386指令集 .model flat,stdcall ;工作模式 option casemap:n ...
- Win32汇编学习(5):绘制文本2
这次我们将学习有关文本的诸多属性如字体和颜色等. 理论: Windows 的颜色系统是用RGB值来表示的,R 代表红色,G 代表绿色,B 代表蓝色.如果您想指定一种颜色就必须给该颜色赋相关的 RGB ...
- Win32汇编学习(4):绘制文本
这次,我们将学习如何在窗口的客户区"绘制"字符串.我们还将学习关于"设备环境"的概念. 理论: "绘制"字符串 Windows 中的文本是一 ...
- 如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)
如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)1.首先要下载我提供的软件包(里面已经包含所有所需软件); 2.把它解压到D盘根目录下(如果需要安装在其它的地方,请注意设好路径); ...
- 罗云彬win32汇编教程笔记 子函数的声明, 定义与调用
在主程序中用call指令来调用子程序. Win32汇编中的子程序也采用堆栈来传递参数,这样就可以用invoke伪指令来进行调用和语法检查工作. 一. 子程序的定义 子程序的定义方式如下所示. 子程序名 ...
- 【Win32汇编】编译环境配置
开始学习[Win32汇编],编译过程较为繁琐,做个记录. 使用 MASM32 提供的 ml.exe 和 link.exe,以及 VS2013 中的 nmake.exe 和资源编辑器. ml.exe: ...
随机推荐
- cf17B Hierarchy(额,,,水)
题意: Nick's company employed n people. Now Nick needs to build a tree hierarchy of «supervisor-surbod ...
- hdu 4786 Fibonacci Tree (最小、最大生成树)
题意: N个点,M条边.每条边连接两个点u,v,且有一个权值c,c非零即一. 问能否将N个点形成一个生成树,并且这棵树的边权值和是一个fibonacii数. (fibonacii数=1,2,3,5,8 ...
- Docker+nginx搭建tomcat集群
1.环境准备: a.宿主机CentOS7 b.连接工具FinalShell c.镜像nginx1.20.1,tomcat (镜像拉取:docker pull 镜像名称) 2.创建nginx文件夹,to ...
- Qt 使用大神插件快速创建树状导航栏
前言 本博客仅仅记录自己的采坑过程以及帮助网友避坑,方便以后快速使用自定义控件,避免重复出错. 下载插件 大神 Github Qt 自定义控件项目地址:https://github.com/feiya ...
- 运行级别和找回root密码
运行级别说明 0 :关机 1 :单用户 [类似安全模式,这个模式可以帮助找回root密码 2:多用户状态没有网络服务 3:多用户状态有网络服务 [使用] 4:系统未使用保留给用户 5:图形界面 6:系 ...
- 【SVG】SVG的夺命利器——path
[SVG]SVG的夺命利器--path 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 昨天一发布,突然看到有朋友留言,希 ...
- 生产服务GC调优实践基本流程总结
Photo by Pixabay from Pexels 本文作者:夜色微光 - 博客园 (cnblogs.com) 前言 对Java虚拟机进行性能调优是一个非常宽泛的话题,在实践上也是非常棘手的过程 ...
- [atAGC054C]Roughly Sorted
考虑对于确定的排列$\{p_{i}\}$,如何求出其(交换后)会得到的排列-- 令$cnt_{x}$为在$i$之前比$x$大的元素个数(其中$p_{i}=x$),显然排列合法当且仅当$cnt_{i}\ ...
- [hdu6391]Lord Li's problem
首先发现结果与需要改变的具体位置无关,只和需要改变的位置的个数有关,因此设f[i][j]表示选取了i个数字异或结果有j个1,只要分析接下来选择的数和这j个1有几个重合即可: 1. 三个数字全部重合,即 ...
- [bzoj1072]排列
考虑用状压dp枚举排列,即f[i][j]表示当前状态为i,余数为j的方案数,考虑在末尾新增一个字符来转移即可,注意最后答案要除以排列组合 1 #include<bits/stdc++.h> ...