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: ...
随机推荐
- 20191310李烨龙作业:MySort
作业:MySort 任务详情 1. 用man sort 查看sort的帮助文档 2. sort常用选项有哪些,都有什么功能?提交相关使用的截图 3. 如果让你编写sort,你怎么实现?写出伪代码和相关 ...
- Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!
大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第八篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...
- PHP怎样写延时队列(定时器)
背景 PHP没有定时器,依托的都是crontab这样的系统工具,也没有go中defer这样的延时方法,本文介绍几种PHP写延时队列的几种姿势. 延时队列的定义 普通的队列是先进先出,但是延时队列并不是 ...
- Go语言核心36讲(Go语言进阶技术十四)--学习笔记
20 | 错误处理 (下) 在上一篇文章中,我们主要讨论的是从使用者的角度看"怎样处理好错误值".那么,接下来我们需要关注的,就是站在建造者的角度,去关心"怎样才能给予使 ...
- 【高并发】深入解析Callable接口
大家好,我是冰河~~ 本文纯干货,从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小. 1.Callable接口介绍 Callable接口是J ...
- prometheus(6)之常用服务监控
监控常用服务 1.tomcat 2.redis 3.mysql 4.nginx 5.mongodb prometheus监控tomcat tomcat_exporter地址 https://githu ...
- JS数据类型转换问题
一.数据类型的转换 数据类型的转换方法 强制转换(显示转换,主动转换) 字符转数值 parseInt(要转换的数值或变量) 转整数 从左向右依次转换,遇到第一个非数字的字符,停止转换 忽略小数点后的内 ...
- PTA 7-1 邻接矩阵表示法创建无向图 (20分)
PTA 7-1 邻接矩阵表示法创建无向图 (20分) 采用邻接矩阵表示法创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶 ...
- maven项目中 把依赖包打进jar包
在pom.xml文件中增加build配置 1 <build> 2 <plugins> 3 <plugin> 4 <artifactId>maven-as ...
- springboot利用mock进行junit单元测试,测试controller
1 spring-boot-starter-test内置mockito,添加pom依赖 <dependency> <groupId>org.springframework.b ...