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汇编基础的更多相关文章

  1. Win32汇编环境配置

    放假了,发现自己知识面窄,趁有时间就打算折腾下Win32汇编.其实在学校也上过汇编课,是基于dos的.那时老师不务正业,老跟我们讲政治经济文化,唯独不怎么讲课;再加上自己的问题,导致了dos汇编学得好 ...

  2. Win32汇编学习(1):基本概念

    背景知识 Windows 把每一个 Win32 应用程序放到分开的虚拟地址空间中去运行,也就是说每一个应用程序都拥有其相互独立的 4GB 地址空间,当然这倒不是说它们都拥有 4GB 的物理地址空间,而 ...

  3. ASM:《X86汇编语言-从实模式到保护模式》5-7章:汇编基础

    第5-7章感觉是这一本书中比较奇怪的章节,可能是作者考虑到读者人群水平的差异,故意由浅入深地讲如何在屏幕上显示字符和使用mov,jmp指令等等,但是这样讲的东西有点重复,而且看了第六,第七章以后,感觉 ...

  4. Win32汇编开始 Hello Asm

    今天开始学习Win32汇编 因为自己很多都是Windows方面 所以 接触一下Win32汇编 . ;.386指令集 .model flat,stdcall ;工作模式 option casemap:n ...

  5. Win32汇编学习(5):绘制文本2

    这次我们将学习有关文本的诸多属性如字体和颜色等. 理论: Windows 的颜色系统是用RGB值来表示的,R 代表红色,G 代表绿色,B 代表蓝色.如果您想指定一种颜色就必须给该颜色赋相关的 RGB ...

  6. Win32汇编学习(4):绘制文本

    这次,我们将学习如何在窗口的客户区"绘制"字符串.我们还将学习关于"设备环境"的概念. 理论: "绘制"字符串 Windows 中的文本是一 ...

  7. 如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)

      如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)1.首先要下载我提供的软件包(里面已经包含所有所需软件); 2.把它解压到D盘根目录下(如果需要安装在其它的地方,请注意设好路径); ...

  8. 罗云彬win32汇编教程笔记 子函数的声明, 定义与调用

    在主程序中用call指令来调用子程序. Win32汇编中的子程序也采用堆栈来传递参数,这样就可以用invoke伪指令来进行调用和语法检查工作. 一. 子程序的定义 子程序的定义方式如下所示. 子程序名 ...

  9. 【Win32汇编】编译环境配置

    开始学习[Win32汇编],编译过程较为繁琐,做个记录. 使用 MASM32 提供的 ml.exe 和 link.exe,以及 VS2013 中的 nmake.exe 和资源编辑器. ml.exe: ...

随机推荐

  1. 20191310李烨龙作业:MySort

    作业:MySort 任务详情 1. 用man sort 查看sort的帮助文档 2. sort常用选项有哪些,都有什么功能?提交相关使用的截图 3. 如果让你编写sort,你怎么实现?写出伪代码和相关 ...

  2. Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!

    大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第八篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...

  3. PHP怎样写延时队列(定时器)

    背景 PHP没有定时器,依托的都是crontab这样的系统工具,也没有go中defer这样的延时方法,本文介绍几种PHP写延时队列的几种姿势. 延时队列的定义 普通的队列是先进先出,但是延时队列并不是 ...

  4. Go语言核心36讲(Go语言进阶技术十四)--学习笔记

    20 | 错误处理 (下) 在上一篇文章中,我们主要讨论的是从使用者的角度看"怎样处理好错误值".那么,接下来我们需要关注的,就是站在建造者的角度,去关心"怎样才能给予使 ...

  5. 【高并发】深入解析Callable接口

    大家好,我是冰河~~ 本文纯干货,从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小. 1.Callable接口介绍 Callable接口是J ...

  6. prometheus(6)之常用服务监控

    监控常用服务 1.tomcat 2.redis 3.mysql 4.nginx 5.mongodb prometheus监控tomcat tomcat_exporter地址 https://githu ...

  7. JS数据类型转换问题

    一.数据类型的转换 数据类型的转换方法 强制转换(显示转换,主动转换) 字符转数值 parseInt(要转换的数值或变量) 转整数 从左向右依次转换,遇到第一个非数字的字符,停止转换 忽略小数点后的内 ...

  8. PTA 7-1 邻接矩阵表示法创建无向图 (20分)

    PTA 7-1 邻接矩阵表示法创建无向图 (20分) 采用邻接矩阵表示法创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶 ...

  9. maven项目中 把依赖包打进jar包

    在pom.xml文件中增加build配置 1 <build> 2 <plugins> 3 <plugin> 4 <artifactId>maven-as ...

  10. springboot利用mock进行junit单元测试,测试controller

    1  spring-boot-starter-test内置mockito,添加pom依赖 <dependency> <groupId>org.springframework.b ...